From fb5a5f5b507a05dc1a9d7b7330d59dc6b68b6570 Mon Sep 17 00:00:00 2001 From: James Moxon Date: Fri, 22 May 2020 15:39:44 +0100 Subject: [PATCH 1/3] compile on node12 --- LDAPCnx.cc | 37 +- LDAPCnx.h | 6 + LDAPCookie.cc | 3 +- package.json | 4 +- yarn.lock | 968 ++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 1000 insertions(+), 18 deletions(-) create mode 100644 yarn.lock diff --git a/LDAPCnx.cc b/LDAPCnx.cc index 4662fef..a4ce9b3 100644 --- a/LDAPCnx.cc +++ b/LDAPCnx.cc @@ -41,8 +41,11 @@ void LDAPCnx::Init(Local exports) { Nan::SetPrototypeMethod(tpl, "starttls", StartTLS); Nan::SetPrototypeMethod(tpl, "checktls", CheckTLS); - constructor.Reset(tpl->GetFunction()); - exports->Set(Nan::New("LDAPCnx").ToLocalChecked(), tpl->GetFunction()); + v8::Local context = exports->CreationContext(); + + + constructor.Reset(tpl->GetFunction(context).ToLocalChecked()); + exports->Set(Nan::New("LDAPCnx").ToLocalChecked(), tpl->GetFunction(context).ToLocalChecked()); } void LDAPCnx::New(const Nan::FunctionCallbackInfo& info) { @@ -51,6 +54,9 @@ void LDAPCnx::New(const Nan::FunctionCallbackInfo& info) { LDAPCnx* ld = new LDAPCnx(); ld->Wrap(info.Holder()); + + v8::Local context = info.GetIsolate()->GetCurrentContext(); + ld->callback = new Nan::Callback(info[0].As()); ld->reconnect_callback = new Nan::Callback(info[1].As()); ld->disconnect_callback = new Nan::Callback(info[2].As()); @@ -58,10 +64,10 @@ void LDAPCnx::New(const Nan::FunctionCallbackInfo& info) { Nan::Utf8String url(info[3]); int ver = LDAP_VERSION3; - int timeout = info[4]->NumberValue(); - int debug = info[5]->NumberValue(); - int verifycert = info[6]->NumberValue(); - int referrals = info[7]->NumberValue(); + int timeout = info[4]->NumberValue(context).FromJust(); + int debug = info[5]->NumberValue(context).FromJust(); + int verifycert = info[6]->NumberValue(context).FromJust(); + int referrals = info[7]->NumberValue(context).FromJust(); int zero = 0; ld->ldap_callback = (ldap_conncb *)malloc(sizeof(ldap_conncb)); @@ -318,8 +324,8 @@ void LDAPCnx::CheckTLS(const Nan::FunctionCallbackInfo& info) { void LDAPCnx::Abandon(const Nan::FunctionCallbackInfo& info) { LDAPCnx* ld = ObjectWrap::Unwrap(info.Holder()); - - info.GetReturnValue().Set(ldap_abandon(ld->ld, info[0]->NumberValue())); + v8::Local context = info.GetIsolate()->GetCurrentContext(); + info.GetReturnValue().Set(ldap_abandon(ld->ld, info[0]->NumberValue(context).FromJust())); } void LDAPCnx::GetErrNo(const Nan::FunctionCallbackInfo& info) { @@ -366,11 +372,12 @@ void LDAPCnx::Rename(const Nan::FunctionCallbackInfo& info) { void LDAPCnx::Search(const Nan::FunctionCallbackInfo& info) { LDAPCnx* ld = ObjectWrap::Unwrap(info.Holder()); + v8::Local context = info.GetIsolate()->GetCurrentContext(); Nan::Utf8String base(info[0]); Nan::Utf8String filter(info[1]); Nan::Utf8String attrs(info[2]); - int scope = info[3]->NumberValue(); - int pagesize = info[4]->NumberValue();; + int scope = info[3]->NumberValue(context).FromJust(); + int pagesize = info[4]->NumberValue(context).FromJust();; LDAPCookie* cookie = NULL; int msgid = 0; @@ -388,8 +395,8 @@ void LDAPCnx::Search(const Nan::FunctionCallbackInfo& info) { page_control[0] = NULL; page_control[1] = NULL; if (pagesize > 0) { - if (info[5]->IsObject() && !info[5]->ToObject().IsEmpty()) - cookie = Nan::ObjectWrap::Unwrap(info[5]->ToObject()); + if (info[5]->IsObject() && !info[5]->ToObject(context).IsEmpty()) + cookie = Nan::ObjectWrap::Unwrap(info[5]->ToObject(context).ToLocalChecked()); if (cookie) { ldap_create_page_control(ld->ld, pagesize, cookie->GetCookie(), 0, &page_control[0]); } else { @@ -423,7 +430,7 @@ void LDAPCnx::Modify(const Nan::FunctionCallbackInfo& info) { ldapmods[i] = (LDAPMod *) malloc(sizeof(LDAPMod)); - String::Utf8Value mod_op(modHandle->Get(Nan::New("op").ToLocalChecked())); + Nan::Utf8String mod_op(modHandle->Get(Nan::New("op").ToLocalChecked())); if (!strcmp(*mod_op, "add")) { ldapmods[i]->mod_op = LDAP_MOD_ADD; @@ -433,7 +440,7 @@ void LDAPCnx::Modify(const Nan::FunctionCallbackInfo& info) { ldapmods[i]->mod_op = LDAP_MOD_REPLACE; } - String::Utf8Value mod_type(modHandle->Get(Nan::New("attr").ToLocalChecked())); + Nan::Utf8String mod_type(modHandle->Get(Nan::New("attr").ToLocalChecked())); ldapmods[i]->mod_type = strdup(*mod_type); Local modValsHandle = @@ -474,7 +481,7 @@ void LDAPCnx::Add(const Nan::FunctionCallbackInfo& info) { ldapmods[i]->mod_op = LDAP_MOD_ADD; // Step 2: mod_type - String::Utf8Value mod_type(attrHandle->Get(Nan::New("attr").ToLocalChecked())); + Nan::Utf8String mod_type(attrHandle->Get(Nan::New("attr").ToLocalChecked())); ldapmods[i]->mod_type = strdup(*mod_type); // Step 3: mod_vals diff --git a/LDAPCnx.h b/LDAPCnx.h index 1fb0afe..6d109b6 100644 --- a/LDAPCnx.h +++ b/LDAPCnx.h @@ -4,6 +4,12 @@ #include #include + +namespace v8 { + template + using Handle = Local; +} + class LDAPCnx : public Nan::ObjectWrap { public: static void Init(v8::Local exports); diff --git a/LDAPCookie.cc b/LDAPCookie.cc index 1d24140..e26b64d 100644 --- a/LDAPCookie.cc +++ b/LDAPCookie.cc @@ -20,13 +20,14 @@ LDAPCookie::~LDAPCookie() { void LDAPCookie::Init(v8::Local exports) { Nan::HandleScope scope; + v8::Local context = exports->CreationContext(); v8::Local tpl = Nan::New(New); // legal? No idea, just an attempt to prevent polluting javascript global namespace with // something that doesn't make sense to construct from JS side. Appears to work (doesn't // crash, paging works). // tpl->SetClassName(Nan::New("LDAPInternalCookie").ToLocalChecked()); tpl->InstanceTemplate()->SetInternalFieldCount(1); - constructor.Reset(tpl->GetFunction()); + constructor.Reset(tpl->GetFunction(context).ToLocalChecked()); } v8::Local LDAPCookie::NewInstance() { diff --git a/package.json b/package.json index ae0c277..53838e6 100644 --- a/package.json +++ b/package.json @@ -20,8 +20,8 @@ }, "dependencies": { "bindings": "^1.2.1", - "nan": "^2.12.1", - "node-gyp": "" + "nan": "^2.14.1", + "node-gyp": "^6.1.0" }, "engines": { "node": ">= 0.8.0" diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..1704b29 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,968 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +ajv@^6.5.5: + version "6.12.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" + integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" + integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +bindings@^1.2.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +cli@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cli/-/cli-1.0.1.tgz#22817534f24bfa4950c34d532d48ecbc621b8c14" + integrity sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ= + dependencies: + exit "0.1.2" + glob "^7.1.1" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" + integrity sha1-+mihT2qUXVTbvlDYzbMyDp47GgY= + +commander@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" + integrity sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM= + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +console-browserify@1.1.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= + +debug@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + integrity sha1-+HBX6ZWxofauaklgZkE3vFbwOdo= + dependencies: + ms "0.7.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +diff@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" + integrity sha1-fyjS657nsVqX79ic5j3P2qPMur8= + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +domelementtype@1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" + integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + +domhandler@2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" + integrity sha1-LeWaCCLVAn+r/28DLCsloqir5zg= + dependencies: + domelementtype "1" + +domutils@1.5: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +entities@1.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" + integrity sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY= + +entities@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.2.tgz#ac74db0bba8d33808bbf36809c3a5c3683531436" + integrity sha512-dmD3AvJQBUjKpcNkoqr+x+IF0SdRtPz9Vk0uTy4yWqga9ibB6s4v++QFWNohjiUGoMlF552ZvNyXDxz5iW0qmw== + +env-paths@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" + integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== + +escape-string-regexp@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1" + integrity sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE= + +exit@0.1.2, exit@0.1.x: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fs-minipass@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob@3.2.11: + version "3.2.11" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" + integrity sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0= + dependencies: + inherits "2" + minimatch "0.3" + +glob@^7.1.1, glob@^7.1.3, glob@^7.1.4: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +graceful-fs@^4.2.2: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +growl@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + integrity sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8= + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +htmlparser2@3.8.x: + version "3.8.3" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" + integrity sha1-mWwosZFRaovoZQGn15dX5ccMEGg= + dependencies: + domelementtype "1" + domhandler "2.3" + domutils "1.5" + entities "1.0" + readable-stream "1.1" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +jade@0.26.3: + version "0.26.3" + resolved "https://registry.yarnpkg.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c" + integrity sha1-jxDXl32NefL2/4YqgbBRPMslaGw= + dependencies: + commander "0.6.1" + mkdirp "0.3.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jshint@^2.8.0: + version "2.11.1" + resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.11.1.tgz#28ec7d1cf7baaae5ce7bd37b9a70ed6cfd938570" + integrity sha512-WXWePB8ssAH3DlD05IoqolsY6arhbll/1+i2JkRPpihQAuiNaR/gSt8VKIcxpV5m6XChP0hCwESQUqpuQMA8Tg== + dependencies: + cli "~1.0.0" + console-browserify "1.1.x" + exit "0.1.x" + htmlparser2 "3.8.x" + lodash "~4.17.11" + minimatch "~3.0.2" + shelljs "0.3.x" + strip-json-comments "1.0.x" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +lodash@~4.17.11: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +lru-cache@2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI= + +mime-db@1.44.0: + version "1.44.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + dependencies: + mime-db "1.44.0" + +minimatch@0.3: + version "0.3.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" + integrity sha1-J12O2qxPG7MyZHIInnlJyDlGmd0= + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +mkdirp@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" + integrity sha1-G79asbqCevI1dRQ0kEJkVfSB/h4= + +mkdirp@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mocha@^2.2.5: + version "2.5.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58" + integrity sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg= + dependencies: + commander "2.3.0" + debug "2.2.0" + diff "1.4.0" + escape-string-regexp "1.0.2" + glob "3.2.11" + growl "1.9.2" + jade "0.26.3" + mkdirp "0.5.1" + supports-color "1.2.0" + to-iso-string "0.0.2" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + integrity sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg= + +nan@^2.14.1: + version "2.14.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" + integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== + +node-gyp@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-6.1.0.tgz#64e31c61a4695ad304c1d5b82cf6b7c79cc79f3f" + integrity sha512-h4A2zDlOujeeaaTx06r4Vy+8MZ1679lU+wbCKDS4ZtvY2A37DESo37oejIw0mtmR3+rvNwts5B6Kpt1KrNYdNw== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.1.2" + request "^2.88.0" + rimraf "^2.6.3" + semver "^5.7.1" + tar "^4.4.12" + which "^1.3.1" + +nopt@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" + integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== + dependencies: + abbrev "1" + osenv "^0.1.4" + +npmlog@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-tmpdir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +readable-stream@1.1: + version "1.1.13" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" + integrity sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +request@^2.88.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +shelljs@0.3.x: + version "0.3.0" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1" + integrity sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E= + +sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= + +signal-exit@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-json-comments@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + integrity sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E= + +supports-color@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e" + integrity sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4= + +tar@^4.4.12: + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.8.6" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + +to-iso-string@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1" + integrity sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE= + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +yallist@^3.0.0, yallist@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== From 458b65904d98eeee11ba765b18965f5a8a456e3f Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 22 May 2020 14:50:39 +0000 Subject: [PATCH 2/3] compile sasl --- LDAPSASL.cc | 4 ++-- SASLDefaults.h | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/LDAPSASL.cc b/LDAPSASL.cc index 8767dac..d02e675 100644 --- a/LDAPSASL.cc +++ b/LDAPSASL.cc @@ -12,9 +12,9 @@ void LDAPCnx::SASLBind(const Nan::FunctionCallbackInfo& info) { Nan::ThrowError("LDAP connection has not been established"); } - v8::String::Utf8Value mechanism(SASLDefaults::Get(info[0])); + Nan::Utf8String mechanism(SASLDefaults::Get(info[0])); SASLDefaults defaults(info[1], info[2], info[3], info[4]); - v8::String::Utf8Value sec_props(SASLDefaults::Get(info[5])); + Nan::Utf8String sec_props(SASLDefaults::Get(info[5])); if(*sec_props) { int res = ldap_set_option(ld->ld, LDAP_OPT_X_SASL_SECPROPS, *sec_props); diff --git a/SASLDefaults.h b/SASLDefaults.h index 925db65..f3d837b 100644 --- a/SASLDefaults.h +++ b/SASLDefaults.h @@ -21,10 +21,10 @@ struct SASLDefaults { static int Callback(LDAP *ld, unsigned flags, void *defaults, void *in); - v8::String::Utf8Value user; - v8::String::Utf8Value password; - v8::String::Utf8Value realm; - v8::String::Utf8Value proxy_user; + Nan::Utf8String user; + Nan::Utf8String password; + Nan::Utf8String realm; + Nan::Utf8String proxy_user; private: void Set(unsigned flags, sasl_interact_t *interact); From 37dbb2043fbab457d1a4aba01fe13820f0d75627 Mon Sep 17 00:00:00 2001 From: Joshua Houghton Date: Fri, 14 Aug 2020 16:44:03 +0000 Subject: [PATCH 3/3] Remove dependancy on libldap on linux The issue is that centos 7 has the old version of openssl installed and node12 is compiled with the new version of openssl. As libldap on centos 7 is compiled against the old version of openssl we get a segfault if we compile against the system version of libldap. Thereofore I've built a version of libldap against the correct version of openssl which i then statically link against my node library. I've also included the ldap header file so i can remove the dependancy on openldap-devel. Signed-off-by: Joshua Houghton --- binding.gyp | 14 +- deps/include/ac/alloca.h | 43 + deps/include/ac/assert.h | 57 + deps/include/ac/bytes.h | 78 + deps/include/ac/crypt.h | 29 + deps/include/ac/ctype.h | 33 + deps/include/ac/dirent.h | 54 + deps/include/ac/errno.h | 55 + deps/include/ac/fdset.h | 42 + deps/include/ac/localize.h | 44 + deps/include/ac/param.h | 39 + deps/include/ac/regex.h | 39 + deps/include/ac/setproctitle.h | 33 + deps/include/ac/signal.h | 80 + deps/include/ac/socket.h | 254 ++++ deps/include/ac/stdarg.h | 28 + deps/include/ac/stdlib.h | 48 + deps/include/ac/string.h | 118 ++ deps/include/ac/sysexits.h | 26 + deps/include/ac/syslog.h | 38 + deps/include/ac/termios.h | 50 + deps/include/ac/time.h | 32 + deps/include/ac/unistd.h | 72 + deps/include/ac/wait.h | 56 + deps/include/avl.h | 158 ++ deps/include/getopt-compat.h | 40 + deps/include/lber.h | 681 +++++++++ deps/include/lber_pvt.h | 222 +++ deps/include/lber_types.h | 63 + deps/include/lber_types.hin | 62 + deps/include/ldap.h | 2529 ++++++++++++++++++++++++++++++++ deps/include/ldap_cdefs.h | 248 ++++ deps/include/ldap_config.h | 74 + deps/include/ldap_config.hin | 73 + deps/include/ldap_defaults.h | 66 + deps/include/ldap_features.h | 61 + deps/include/ldap_features.hin | 60 + deps/include/ldap_int_thread.h | 320 ++++ deps/include/ldap_log.h | 268 ++++ deps/include/ldap_pvt.h | 538 +++++++ deps/include/ldap_pvt_thread.h | 320 ++++ deps/include/ldap_pvt_uc.h | 163 ++ deps/include/ldap_queue.h | 556 +++++++ deps/include/ldap_rq.h | 101 ++ deps/include/ldap_schema.h | 360 +++++ deps/include/ldap_utf8.h | 106 ++ deps/include/ldif.h | 169 +++ deps/include/lutil.h | 361 +++++ deps/include/lutil_hash.h | 48 + deps/include/lutil_ldap.h | 47 + deps/include/lutil_lockf.h | 34 + deps/include/lutil_md5.h | 64 + deps/include/lutil_meter.h | 70 + deps/include/lutil_sha1.h | 77 + deps/include/openldap.h | 39 + deps/include/portable.h | 1173 +++++++++++++++ deps/include/portable.hin | 1172 +++++++++++++++ deps/include/rewrite.h | 298 ++++ deps/include/slapi-plugin.h | 905 ++++++++++++ deps/include/stamp-h1 | 1 + deps/include/stamp-h2 | 1 + deps/include/stamp-h3 | 1 + deps/include/sysexits-compat.h | 115 ++ deps/liblber.a | Bin 0 -> 112102 bytes deps/libldap.a | Bin 0 -> 622808 bytes 65 files changed, 13001 insertions(+), 5 deletions(-) create mode 100644 deps/include/ac/alloca.h create mode 100644 deps/include/ac/assert.h create mode 100644 deps/include/ac/bytes.h create mode 100644 deps/include/ac/crypt.h create mode 100644 deps/include/ac/ctype.h create mode 100644 deps/include/ac/dirent.h create mode 100644 deps/include/ac/errno.h create mode 100644 deps/include/ac/fdset.h create mode 100644 deps/include/ac/localize.h create mode 100644 deps/include/ac/param.h create mode 100644 deps/include/ac/regex.h create mode 100644 deps/include/ac/setproctitle.h create mode 100644 deps/include/ac/signal.h create mode 100644 deps/include/ac/socket.h create mode 100644 deps/include/ac/stdarg.h create mode 100644 deps/include/ac/stdlib.h create mode 100644 deps/include/ac/string.h create mode 100644 deps/include/ac/sysexits.h create mode 100644 deps/include/ac/syslog.h create mode 100644 deps/include/ac/termios.h create mode 100644 deps/include/ac/time.h create mode 100644 deps/include/ac/unistd.h create mode 100644 deps/include/ac/wait.h create mode 100644 deps/include/avl.h create mode 100644 deps/include/getopt-compat.h create mode 100644 deps/include/lber.h create mode 100644 deps/include/lber_pvt.h create mode 100644 deps/include/lber_types.h create mode 100644 deps/include/lber_types.hin create mode 100644 deps/include/ldap.h create mode 100644 deps/include/ldap_cdefs.h create mode 100644 deps/include/ldap_config.h create mode 100644 deps/include/ldap_config.hin create mode 100644 deps/include/ldap_defaults.h create mode 100644 deps/include/ldap_features.h create mode 100644 deps/include/ldap_features.hin create mode 100644 deps/include/ldap_int_thread.h create mode 100644 deps/include/ldap_log.h create mode 100644 deps/include/ldap_pvt.h create mode 100644 deps/include/ldap_pvt_thread.h create mode 100644 deps/include/ldap_pvt_uc.h create mode 100644 deps/include/ldap_queue.h create mode 100644 deps/include/ldap_rq.h create mode 100644 deps/include/ldap_schema.h create mode 100644 deps/include/ldap_utf8.h create mode 100644 deps/include/ldif.h create mode 100644 deps/include/lutil.h create mode 100644 deps/include/lutil_hash.h create mode 100644 deps/include/lutil_ldap.h create mode 100644 deps/include/lutil_lockf.h create mode 100644 deps/include/lutil_md5.h create mode 100644 deps/include/lutil_meter.h create mode 100644 deps/include/lutil_sha1.h create mode 100644 deps/include/openldap.h create mode 100644 deps/include/portable.h create mode 100644 deps/include/portable.hin create mode 100644 deps/include/rewrite.h create mode 100644 deps/include/slapi-plugin.h create mode 100644 deps/include/stamp-h1 create mode 100644 deps/include/stamp-h2 create mode 100644 deps/include/stamp-h3 create mode 100644 deps/include/sysexits-compat.h create mode 100644 deps/liblber.a create mode 100644 deps/libldap.a diff --git a/binding.gyp b/binding.gyp index e117b61..73691f9 100644 --- a/binding.gyp +++ b/binding.gyp @@ -8,9 +8,6 @@ " 9', { + "libraries": [ "../deps/libldap.a", "../deps/liblber.a", "-lresolv", "-lsasl2" ], + "include_dirs": [ "deps/include" ] + }, { + "libraries": [ "-lldap" ] + }] ] } ], "variables": { - "SASL": ". + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _AC_ALLOCA_H +#define _AC_ALLOCA_H + +/* + * use of alloca is disallowed as it is machine dependent + */ +#error "alloca() not supported, use malloc()" + +/* AIX requires this to be the first thing in the file. */ +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# ifdef HAVE_ALLOCA_H +# include +# else +# ifdef _AIX +#pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +extern char *(alloca)(); +# endif +# endif +# endif +#endif + + +#endif /* _AC_ALLOCA_H */ diff --git a/deps/include/ac/assert.h b/deps/include/ac/assert.h new file mode 100644 index 0000000..ef83129 --- /dev/null +++ b/deps/include/ac/assert.h @@ -0,0 +1,57 @@ +/* Generic assert.h */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _AC_ASSERT_H +#define _AC_ASSERT_H + +#undef assert + +#ifdef LDAP_DEBUG + +#if defined( HAVE_ASSERT_H ) || defined( STDC_HEADERS ) + +#undef NDEBUG +#include + +#else /* !(HAVE_ASSERT_H || STDC_HEADERS) */ + +#define LDAP_NEED_ASSERT 1 + +/* + * no assert()... must be a very old compiler. + * create a replacement and hope it works + */ + +LBER_F (void) ber_pvt_assert LDAP_P(( const char *file, int line, + const char *test )); + +/* Can't use LDAP_STRING(test), that'd expand to "test" */ +#if defined(__STDC__) || defined(__cplusplus) +#define assert(test) \ + ((test) ? (void)0 : ber_pvt_assert( __FILE__, __LINE__, #test ) ) +#else +#define assert(test) \ + ((test) ? (void)0 : ber_pvt_assert( __FILE__, __LINE__, "test" ) ) +#endif + +#endif /* (HAVE_ASSERT_H || STDC_HEADERS) */ + +#else /* !LDAP_DEBUG */ +/* no asserts */ +#define assert(test) ((void)0) +#endif /* LDAP_DEBUG */ + +#endif /* _AC_ASSERT_H */ diff --git a/deps/include/ac/bytes.h b/deps/include/ac/bytes.h new file mode 100644 index 0000000..bbecf0c --- /dev/null +++ b/deps/include/ac/bytes.h @@ -0,0 +1,78 @@ +/* Generic bytes.h */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _AC_BYTES_H +#define _AC_BYTES_H + +/* cross compilers should define both AC_INT{2,4}_TYPE in CPPFLAGS */ + +#if !defined( AC_INT4_TYPE ) + /* use autoconf defines to provide sized typedefs */ +# if SIZEOF_LONG == 4 +# define AC_INT4_TYPE long +# elif SIZEOF_INT == 4 +# define AC_INT4_TYPE int +# elif SIZEOF_SHORT == 4 +# define AC_INT4_TYPE short +# else +# error "AC_INT4_TYPE?" +# endif +#endif + +typedef AC_INT4_TYPE ac_int4; +typedef signed AC_INT4_TYPE ac_sint4; +typedef unsigned AC_INT4_TYPE ac_uint4; + +#if !defined( AC_INT2_TYPE ) +# if SIZEOF_SHORT == 2 +# define AC_INT2_TYPE short +# elif SIZEOF_INT == 2 +# define AC_INT2_TYPE int +# elif SIZEOF_LONG == 2 +# define AC_INT2_TYPE long +# else +# error "AC_INT2_TYPE?" +# endif +#endif + +#if defined( AC_INT2_TYPE ) +typedef AC_INT2_TYPE ac_int2; +typedef signed AC_INT2_TYPE ac_sint2; +typedef unsigned AC_INT2_TYPE ac_uint2; +#endif + +#ifndef BYTE_ORDER +/* cross compilers should define BYTE_ORDER in CPPFLAGS */ + +/* + * Definitions for byte order, according to byte significance from low + * address to high. + */ +#define LITTLE_ENDIAN 1234 /* LSB first: i386, vax */ +#define BIG_ENDIAN 4321 /* MSB first: 68000, ibm, net */ +#define PDP_ENDIAN 3412 /* LSB first in word, MSW first in long */ + +/* assume autoconf's AC_C_BIGENDIAN has been ran */ +/* if it hasn't, we assume (maybe falsely) the order is LITTLE ENDIAN */ +# ifdef WORDS_BIGENDIAN +# define BYTE_ORDER BIG_ENDIAN +# else +# define BYTE_ORDER LITTLE_ENDIAN +# endif + +#endif /* BYTE_ORDER */ + +#endif /* _AC_BYTES_H */ diff --git a/deps/include/ac/crypt.h b/deps/include/ac/crypt.h new file mode 100644 index 0000000..b4f446a --- /dev/null +++ b/deps/include/ac/crypt.h @@ -0,0 +1,29 @@ +/* Generic crypt.h */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _AC_CRYPT_H +#define _AC_CRYPT_H + +#include + +/* crypt() may be defined in a separate include file */ +#ifdef HAVE_CRYPT_H +# include +#else + extern char *(crypt)(); +#endif + +#endif /* _AC_CRYPT_H */ diff --git a/deps/include/ac/ctype.h b/deps/include/ac/ctype.h new file mode 100644 index 0000000..a5e0fb7 --- /dev/null +++ b/deps/include/ac/ctype.h @@ -0,0 +1,33 @@ +/* Generic ctype.h */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _AC_CTYPE_H +#define _AC_CTYPE_H + +#include + +#undef TOUPPER +#undef TOLOWER + +#ifdef C_UPPER_LOWER +# define TOUPPER(c) (islower(c) ? toupper(c) : (c)) +# define TOLOWER(c) (isupper(c) ? tolower(c) : (c)) +#else +# define TOUPPER(c) toupper(c) +# define TOLOWER(c) tolower(c) +#endif + +#endif /* _AC_CTYPE_H */ diff --git a/deps/include/ac/dirent.h b/deps/include/ac/dirent.h new file mode 100644 index 0000000..3b20941 --- /dev/null +++ b/deps/include/ac/dirent.h @@ -0,0 +1,54 @@ +/* Generic dirent.h */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _AC_DIRENT_H +#define _AC_DIRENT_H + +#ifdef HAVE_DIRENT_H +# include +# define NAMLEN(dirent) strlen((dirent)->d_name) +#elif defined(_MSC_VER) +#include +#ifndef MAX_PATH +#define MAX_PATH 260 +#endif +struct dirent { + char *d_name; +}; +typedef struct DIR { + HANDLE dir; + struct dirent data; + int first; + char buf[MAX_PATH+1]; +} DIR; +DIR *opendir(const char *name); +struct dirent *readdir(DIR *dir); +int closedir(DIR *dir); +#else +# define dirent direct +# define NAMLEN(dirent) (dirent)->d_namlen +# ifdef HAVE_SYS_NDIR_H +# include +# endif +# ifdef HAVE_SYS_DIR_H +# include +# endif +# ifdef HAVE_NDIR_H +# include +# endif +#endif + +#endif /* _AC_DIRENT_H */ diff --git a/deps/include/ac/errno.h b/deps/include/ac/errno.h new file mode 100644 index 0000000..9e71f29 --- /dev/null +++ b/deps/include/ac/errno.h @@ -0,0 +1,55 @@ +/* Generic errno.h */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _AC_ERRNO_H +#define _AC_ERRNO_H + +#if defined( HAVE_ERRNO_H ) +# include +#elif defined( HAVE_SYS_ERRNO_H ) +# include +#endif + +#ifndef HAVE_SYS_ERRLIST + /* no sys_errlist */ +# define sys_nerr 0 +# define sys_errlist ((char **)0) +#elif defined( DECL_SYS_ERRLIST ) + /* have sys_errlist but need declaration */ + LDAP_LIBC_V(int) sys_nerr; + LDAP_LIBC_V(char) *sys_errlist[]; +#endif + +#undef _AC_ERRNO_UNKNOWN +#define _AC_ERRNO_UNKNOWN "unknown error" + +#ifdef HAVE_SYS_ERRLIST + /* this is thread safe */ +# define STRERROR(e) ( (e) > -1 && (e) < sys_nerr \ + ? sys_errlist[(e)] : _AC_ERRNO_UNKNOWN ) + +#elif defined( HAVE_STRERROR ) + /* this may not be thread safe */ + /* and, yes, some implementations of strerror may return NULL */ +# define STRERROR(e) ( strerror(e) \ + ? strerror(e) : _AC_ERRNO_UNKNOWN ) + +#else + /* this is thread safe */ +# define STRERROR(e) ( _AC_ERRNO_UNKNOWN ) +#endif + +#endif /* _AC_ERRNO_H */ diff --git a/deps/include/ac/fdset.h b/deps/include/ac/fdset.h new file mode 100644 index 0000000..75d5110 --- /dev/null +++ b/deps/include/ac/fdset.h @@ -0,0 +1,42 @@ +/* redefine FD_SET */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +/* + * This header is to be included by portable.h to ensure + * tweaking of FD_SETSIZE is done early enough to be effective. + */ + +#ifndef _AC_FDSET_H +#define _AC_FDSET_H + +#if !defined( OPENLDAP_FD_SETSIZE ) && !defined( FD_SETSIZE ) +# define OPENLDAP_FD_SETSIZE 4096 +#endif + +#ifdef OPENLDAP_FD_SETSIZE + /* assume installer desires to enlarge fd_set */ +# ifdef HAVE_BITS_TYPES_H +# include +# endif +# ifdef __FD_SETSIZE +# undef __FD_SETSIZE +# define __FD_SETSIZE OPENLDAP_FD_SETSIZE +# else +# define FD_SETSIZE OPENLDAP_FD_SETSIZE +# endif +#endif + +#endif /* _AC_FDSET_H */ diff --git a/deps/include/ac/localize.h b/deps/include/ac/localize.h new file mode 100644 index 0000000..126967a --- /dev/null +++ b/deps/include/ac/localize.h @@ -0,0 +1,44 @@ +/* localize.h (i18n/l10n) */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _AC_LOCALIZE_H +#define _AC_LOCALIZE_H + +#ifdef LDAP_LOCALIZE + +# include +# include + + /* enable i18n/l10n */ +# define gettext_noop(s) s +# define _(s) gettext(s) +# define N_(s) gettext_noop(s) +# define ldap_pvt_setlocale(c,l) ((void) setlocale(c, l)) +# define ldap_pvt_textdomain(d) ((void) textdomain(d)) +# define ldap_pvt_bindtextdomain(p,d) ((void) bindtextdomain(p, d)) + +#else + + /* disable i18n/l10n */ +# define _(s) s +# define N_(s) s +# define ldap_pvt_setlocale(c,l) ((void) 0) +# define ldap_pvt_textdomain(d) ((void) 0) +# define ldap_pvt_bindtextdomain(p,d) ((void) 0) + +#endif + +#endif /* _AC_LOCALIZE_H */ diff --git a/deps/include/ac/param.h b/deps/include/ac/param.h new file mode 100644 index 0000000..4b92e48 --- /dev/null +++ b/deps/include/ac/param.h @@ -0,0 +1,39 @@ +/* Generic param.h */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _AC_PARAM_H +#define _AC_PARAM_H + +#ifdef HAVE_SYS_PARAM_H +#include +#endif + +/* MAXPATHLEN should come from */ +#include + +#ifndef MAXPATHLEN +# if defined(PATH_MAX) +# define MAXPATHLEN PATH_MAX + +# elif defined(_MAX_PATH) +# define MAXPATHLEN _MAX_PATH + +# else +# define MAXPATHLEN 4096 +# endif +#endif + +#endif /* _AC_PARAM_H */ diff --git a/deps/include/ac/regex.h b/deps/include/ac/regex.h new file mode 100644 index 0000000..ac1876b --- /dev/null +++ b/deps/include/ac/regex.h @@ -0,0 +1,39 @@ +/* Generic Regex */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _AC_REGEX_H_ +#define _AC_REGEX_H_ + +#ifdef HAVE_SYS_TYPES_H +#include +#endif + +#ifndef HAVE_REGEX_H +/* NO POSIX REGEX!! + * You'll need to install a POSIX compatible REGEX library. + * Either Henry Spencer's or GNU regex will do. + */ +#error "No POSIX REGEX available." + +#elif HAVE_GNUREGEX_H + /* system has GNU gnuregex.h */ +# include +#else + /* have regex.h, assume it's POSIX compliant */ +# include +#endif /* regex.h */ + +#endif /* _AC_REGEX_H_ */ diff --git a/deps/include/ac/setproctitle.h b/deps/include/ac/setproctitle.h new file mode 100644 index 0000000..0bacbf3 --- /dev/null +++ b/deps/include/ac/setproctitle.h @@ -0,0 +1,33 @@ +/* Generic setproctitle.h */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _AC_SETPROCTITLE_H +#define _AC_SETPROCTITLE_H + +#ifdef LDAP_PROCTITLE + +#if defined( HAVE_LIBUTIL_H ) +# include +#else + /* use lutil version */ + LDAP_LUTIL_F (void) (setproctitle) LDAP_P((const char *fmt, ...)) \ + LDAP_GCCATTR((format(printf, 1, 2))); + LDAP_LUTIL_V (int) Argc; + LDAP_LUTIL_V (char) **Argv; +#endif + +#endif /* LDAP_PROCTITLE */ +#endif /* _AC_SETPROCTITLE_H */ diff --git a/deps/include/ac/signal.h b/deps/include/ac/signal.h new file mode 100644 index 0000000..fa86e37 --- /dev/null +++ b/deps/include/ac/signal.h @@ -0,0 +1,80 @@ +/* Generic signal.h */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _AC_SIGNAL_H +#define _AC_SIGNAL_H + +#include + +#undef SIGNAL + +#if defined( HAVE_SIGACTION ) +#define SIGNAL lutil_sigaction +typedef void (*lutil_sig_t)(int); +LDAP_LUTIL_F(lutil_sig_t) lutil_sigaction( int sig, lutil_sig_t func ); +#define SIGNAL_REINSTALL(sig,act) (void)0 +#elif defined( HAVE_SIGSET ) +#define SIGNAL sigset +#define SIGNAL_REINSTALL sigset +#else +#define SIGNAL signal +#define SIGNAL_REINSTALL signal +#endif + +#if !defined( LDAP_SIGUSR1 ) || !defined( LDAP_SIGUSR2 ) +#undef LDAP_SIGUSR1 +#undef LDAP_SIGUSR2 + +# if defined(WINNT) || defined(_WINNT) || defined(_WIN32) +# define LDAP_SIGUSR1 SIGILL +# define LDAP_SIGUSR2 SIGTERM + +# elif !defined(HAVE_LINUX_THREADS) +# define LDAP_SIGUSR1 SIGUSR1 +# define LDAP_SIGUSR2 SIGUSR2 + +# else + /* + * Some versions of LinuxThreads unfortunately uses the only + * two signals reserved for user applications. This forces + * OpenLDAP to use other signals reserved for other uses. + */ + +# if defined( SIGSTKFLT ) +# define LDAP_SIGUSR1 SIGSTKFLT +# elif defined ( SIGSYS ) +# define LDAP_SIGUSR1 SIGSYS +# endif + +# if defined( SIGUNUSED ) +# define LDAP_SIGUSR2 SIGUNUSED +# elif defined ( SIGINFO ) +# define LDAP_SIGUSR2 SIGINFO +# elif defined ( SIGEMT ) +# define LDAP_SIGUSR2 SIGEMT +# endif +# endif +#endif + +#ifndef LDAP_SIGCHLD +#ifdef SIGCHLD +#define LDAP_SIGCHLD SIGCHLD +#elif SIGCLD +#define LDAP_SIGCHLD SIGCLD +#endif +#endif + +#endif /* _AC_SIGNAL_H */ diff --git a/deps/include/ac/socket.h b/deps/include/ac/socket.h new file mode 100644 index 0000000..6dba275 --- /dev/null +++ b/deps/include/ac/socket.h @@ -0,0 +1,254 @@ +/* Generic socket.h */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _AC_SOCKET_H_ +#define _AC_SOCKET_H_ + +#ifdef HAVE_SYS_TYPES_H +#include +#endif + +#ifdef HAVE_POLL_H +#include +#elif defined(HAVE_SYS_POLL_H) +#include +#endif + +#ifdef HAVE_SYS_SOCKET_H +#include + +#ifdef HAVE_SYS_UN_H +#include +#endif + +#ifdef HAVE_SYS_SELECT_H +#include +#endif + +#include + +#ifdef HAVE_NETINET_TCP_H +#include +#endif + +#ifdef HAVE_ARPA_INET_H +#include +#endif + +#ifdef HAVE_ARPA_NAMESER_H +#include +#endif + +#include + +#ifdef HAVE_RESOLV_H +#include +#endif + +#endif /* HAVE_SYS_SOCKET_H */ + +#ifdef HAVE_WINSOCK2 +#include +#include +#elif HAVE_WINSOCK +#include +#endif + +#ifdef HAVE_PCNFS +#include +#endif /* HAVE_PCNFS */ + +#ifndef INADDR_LOOPBACK +#define INADDR_LOOPBACK (0x7f000001UL) +#endif + +#ifndef MAXHOSTNAMELEN +#define MAXHOSTNAMELEN 64 +#endif + +#undef sock_errno +#undef sock_errstr +#define sock_errno() errno +#define sock_errstr(e) STRERROR(e) +#define sock_errset(e) ((void) (errno = (e))) + +#ifdef HAVE_WINSOCK +# define tcp_read( s, buf, len ) recv( s, buf, len, 0 ) +# define tcp_write( s, buf, len ) send( s, buf, len, 0 ) +# define ioctl( s, c, a ) ioctlsocket( (s), (c), (a) ) +# define ioctl_t u_long +# define AC_SOCKET_INVALID ((unsigned int) -1) + +# ifdef SD_BOTH +# define tcp_close( s ) (shutdown( s, SD_BOTH ), closesocket( s )) +# else +# define tcp_close( s ) closesocket( s ) +# endif + +#define EWOULDBLOCK WSAEWOULDBLOCK +#define EINPROGRESS WSAEINPROGRESS +#define ETIMEDOUT WSAETIMEDOUT + +#undef sock_errno +#undef sock_errstr +#undef sock_errset +#define sock_errno() WSAGetLastError() +#define sock_errstr(e) ber_pvt_wsa_err2string(e) +#define sock_errset(e) WSASetLastError(e) + +LBER_F( char * ) ber_pvt_wsa_err2string LDAP_P((int)); + +#elif MACOS +# define tcp_close( s ) tcpclose( s ) +# define tcp_read( s, buf, len ) tcpread( s, buf, len ) +# define tcp_write( s, buf, len ) tcpwrite( s, buf, len ) + +#elif DOS +# ifdef PCNFS +# define tcp_close( s ) close( s ) +# define tcp_read( s, buf, len ) recv( s, buf, len, 0 ) +# define tcp_write( s, buf, len ) send( s, buf, len, 0 ) +# endif /* PCNFS */ +# ifdef NCSA +# define tcp_close( s ) do { netclose( s ); netshut() } while(0) +# define tcp_read( s, buf, len ) nread( s, buf, len ) +# define tcp_write( s, buf, len ) netwrite( s, buf, len ) +# endif /* NCSA */ + +#elif defined(HAVE_CLOSESOCKET) +# define tcp_close( s ) closesocket( s ) + +# ifdef __BEOS__ +# define tcp_read( s, buf, len ) recv( s, buf, len, 0 ) +# define tcp_write( s, buf, len ) send( s, buf, len, 0 ) +# endif + +#else +# define tcp_read( s, buf, len) read( s, buf, len ) +# define tcp_write( s, buf, len) write( s, buf, len ) + +# ifdef SHUT_RDWR +# define tcp_close( s ) (shutdown( s, SHUT_RDWR ), close( s )) +# else +# define tcp_close( s ) close( s ) +# endif + +#ifdef HAVE_PIPE +/* + * Only use pipe() on systems where file and socket descriptors + * are interchangable + */ +# define USE_PIPE HAVE_PIPE +#endif + +#endif /* MACOS */ + +#ifndef ioctl_t +# define ioctl_t int +#endif + +#ifndef AC_SOCKET_INVALID +# define AC_SOCKET_INVALID (-1) +#endif +#ifndef AC_SOCKET_ERROR +# define AC_SOCKET_ERROR (-1) +#endif + +#if !defined( HAVE_INET_ATON ) && !defined( inet_aton ) +# define inet_aton ldap_pvt_inet_aton +struct in_addr; +LDAP_F (int) ldap_pvt_inet_aton LDAP_P(( const char *, struct in_addr * )); +#endif + +#if defined(__WIN32) && defined(_ALPHA) +/* NT on Alpha is hosed. */ +# define AC_HTONL( l ) \ + ((((l)&0xffU)<<24) + (((l)&0xff00U)<<8) + \ + (((l)&0xff0000U)>>8) + (((l)&0xff000000U)>>24)) +# define AC_NTOHL(l) AC_HTONL(l) + +#else +# define AC_HTONL( l ) htonl( l ) +# define AC_NTOHL( l ) ntohl( l ) +#endif + +/* htons()/ntohs() may be broken much like htonl()/ntohl() */ +#define AC_HTONS( s ) htons( s ) +#define AC_NTOHS( s ) ntohs( s ) + +#ifdef LDAP_PF_LOCAL +# if !defined( AF_LOCAL ) && defined( AF_UNIX ) +# define AF_LOCAL AF_UNIX +# endif +# if !defined( PF_LOCAL ) && defined( PF_UNIX ) +# define PF_LOCAL PF_UNIX +# endif +#endif + +#ifndef INET_ADDRSTRLEN +# define INET_ADDRSTRLEN 16 +#endif +#ifndef INET6_ADDRSTRLEN +# define INET6_ADDRSTRLEN 46 +#endif + +#if defined( HAVE_GETADDRINFO ) || defined( HAVE_GETNAMEINFO ) +# ifdef HAVE_GAI_STRERROR +# define AC_GAI_STRERROR(x) (gai_strerror((x))) +# else +# define AC_GAI_STRERROR(x) (ldap_pvt_gai_strerror((x))) + LDAP_F (char *) ldap_pvt_gai_strerror( int ); +# endif +#endif + +#if defined(LDAP_PF_LOCAL) && \ + !defined(HAVE_GETPEEREID) && \ + !defined(HAVE_GETPEERUCRED) && \ + !defined(SO_PEERCRED) && !defined(LOCAL_PEERCRED) && \ + defined(HAVE_SENDMSG) && (defined(HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTSLEN) || \ + defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL)) +# define LDAP_PF_LOCAL_SENDMSG 1 +#endif + +#ifdef HAVE_GETPEEREID +#define LUTIL_GETPEEREID( s, uid, gid, bv ) getpeereid( s, uid, gid ) +#elif defined(LDAP_PF_LOCAL_SENDMSG) +struct berval; +LDAP_LUTIL_F( int ) lutil_getpeereid( int s, uid_t *, gid_t *, struct berval *bv ); +#define LUTIL_GETPEEREID( s, uid, gid, bv ) lutil_getpeereid( s, uid, gid, bv ) +#else +LDAP_LUTIL_F( int ) lutil_getpeereid( int s, uid_t *, gid_t * ); +#define LUTIL_GETPEEREID( s, uid, gid, bv ) lutil_getpeereid( s, uid, gid ) +#endif + +/* DNS RFC defines max host name as 255. New systems seem to use 1024 */ +#ifndef NI_MAXHOST +#define NI_MAXHOST 256 +#endif + +#ifdef HAVE_POLL +# ifndef INFTIM +# define INFTIM (-1) +# endif +#undef POLL_OTHER +#define POLL_OTHER (POLLERR|POLLHUP) +#undef POLL_READ +#define POLL_READ (POLLIN|POLLPRI|POLL_OTHER) +#undef POLL_WRITE +#define POLL_WRITE (POLLOUT|POLL_OTHER) +#endif + +#endif /* _AC_SOCKET_H_ */ diff --git a/deps/include/ac/stdarg.h b/deps/include/ac/stdarg.h new file mode 100644 index 0000000..db2ad76 --- /dev/null +++ b/deps/include/ac/stdarg.h @@ -0,0 +1,28 @@ +/* Generic stdarg.h */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _AC_STDARG_H +#define _AC_STDARG_H 1 + +/* require STDC variable argument support */ + +#include + +#ifndef HAVE_STDARG +# define HAVE_STDARG 1 +#endif + +#endif /* _AC_STDARG_H */ diff --git a/deps/include/ac/stdlib.h b/deps/include/ac/stdlib.h new file mode 100644 index 0000000..5b3a861 --- /dev/null +++ b/deps/include/ac/stdlib.h @@ -0,0 +1,48 @@ +/* Generic stdlib.h */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _AC_STDLIB_H +#define _AC_STDLIB_H + +#if defined( HAVE_CSRIMALLOC ) +#include +#define MALLOC_TRACE +#include +#endif + +#include + +/* Ignore malloc.h if we have STDC_HEADERS */ +#if defined(HAVE_MALLOC_H) && !defined(STDC_HEADERS) +# include +#endif + +#ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# define EXIT_FAILURE 1 +#endif + +#ifdef HAVE_LIMITS_H +#include +#endif + +#if defined(LINE_MAX) +# define AC_LINE_MAX LINE_MAX +#else +# define AC_LINE_MAX 2048 /* POSIX MIN */ +#endif + +#endif /* _AC_STDLIB_H */ diff --git a/deps/include/ac/string.h b/deps/include/ac/string.h new file mode 100644 index 0000000..3c11f6d --- /dev/null +++ b/deps/include/ac/string.h @@ -0,0 +1,118 @@ +/* Generic string.h */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _AC_STRING_H +#define _AC_STRING_H + +#ifdef STDC_HEADERS +# include + +#else +# ifdef HAVE_STRING_H +# include +# endif +# if defined(HAVE_STRINGS_H) && (!defined(HAVE_STRING_H) || defined(BOTH_STRINGS_H)) +# include +# endif + +# ifdef HAVE_MEMORY_H +# include +# endif + +# ifndef HAVE_STRRCHR +# undef strchr +# define strchr index +# undef strrchr +# define strrchr rindex +# endif + +# ifndef HAVE_MEMCPY +# undef memcpy +# define memcpy(d, s, n) ((void) bcopy ((s), (d), (n))) +# undef memmove +# define memmove(d, s, n) ((void) bcopy ((s), (d), (n))) +# endif +#endif + +/* use ldap_pvt_strtok instead of strtok or strtok_r! */ +LDAP_F(char *) ldap_pvt_strtok LDAP_P(( char *str, + const char *delim, char **pos )); + +#ifndef HAVE_STRDUP + /* strdup() is missing, declare our own version */ +# undef strdup +# define strdup(s) ber_strdup(s) +#elif !defined(_WIN32) + /* some systems fail to declare strdup */ + /* Windows does not require this declaration */ + LDAP_LIBC_F(char *) (strdup)(); +#endif + +/* + * some systems fail to declare strcasecmp() and strncasecmp() + * we need them declared so we can obtain pointers to them + */ + +/* we don't want these declared for Windows or Mingw */ +#ifndef _WIN32 +int (strcasecmp)(); +int (strncasecmp)(); +#endif + +#ifndef SAFEMEMCPY +# if defined( HAVE_MEMMOVE ) +# define SAFEMEMCPY( d, s, n ) memmove((d), (s), (n)) +# elif defined( HAVE_BCOPY ) +# define SAFEMEMCPY( d, s, n ) bcopy((s), (d), (n)) +# else + /* nothing left but memcpy() */ +# define SAFEMEMCPY( d, s, n ) memcpy((d), (s), (n)) +# endif +#endif + +#define AC_MEMCPY( d, s, n ) (SAFEMEMCPY((d),(s),(n))) +#define AC_FMEMCPY( d, s, n ) do { \ + if((n) == 1) *((char*)(d)) = *((char*)(s)); \ + else AC_MEMCPY( (d), (s), (n) ); \ + } while(0) + +#ifdef NEED_MEMCMP_REPLACEMENT + int (lutil_memcmp)(const void *b1, const void *b2, size_t len); +#define memcmp lutil_memcmp +#endif + +void *(lutil_memrchr)(const void *b, int c, size_t n); +/* GNU extension (glibc >= 2.1.91), only declared when defined(_GNU_SOURCE) */ +#if defined(HAVE_MEMRCHR) && defined(_GNU_SOURCE) +#define lutil_memrchr(b, c, n) memrchr(b, c, n) +#endif /* ! HAVE_MEMRCHR */ + +#define STRLENOF(s) (sizeof(s)-1) + +#if defined( HAVE_NONPOSIX_STRERROR_R ) +# define AC_STRERROR_R(e,b,l) (strerror_r((e), (b), (l))) +#elif defined( HAVE_STRERROR_R ) +# define AC_STRERROR_R(e,b,l) (strerror_r((e), (b), (l)) == 0 ? (b) : "Unknown error") +#elif defined( HAVE_SYS_ERRLIST ) +# define AC_STRERROR_R(e,b,l) ((e) > -1 && (e) < sys_nerr \ + ? sys_errlist[(e)] : "Unknown error" ) +#elif defined( HAVE_STRERROR ) +# define AC_STRERROR_R(e,b,l) (strerror(e)) /* NOTE: may be NULL */ +#else +# define AC_STRERROR_R(e,b,l) ("Unknown error") +#endif + +#endif /* _AC_STRING_H */ diff --git a/deps/include/ac/sysexits.h b/deps/include/ac/sysexits.h new file mode 100644 index 0000000..e9dec93 --- /dev/null +++ b/deps/include/ac/sysexits.h @@ -0,0 +1,26 @@ +/* Generic sysexits */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _AC_SYSEXITS_H_ +#define _AC_SYSEXITS_H_ + +#ifdef HAVE_SYSEXITS_H +# include +#else +# include +#endif + +#endif /* _AC_SYSEXITS_H_ */ diff --git a/deps/include/ac/syslog.h b/deps/include/ac/syslog.h new file mode 100644 index 0000000..457581a --- /dev/null +++ b/deps/include/ac/syslog.h @@ -0,0 +1,38 @@ +/* Generic syslog.h */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _AC_SYSLOG_H_ +#define _AC_SYSLOG_H_ + +#if defined( HAVE_SYSLOG_H ) +#include +#elif defined ( HAVE_SYS_SYSLOG_H ) +#include +#endif + +#if defined( LOG_NDELAY ) && defined( LOG_NOWAIT ) +# define OPENLOG_OPTIONS ( LOG_PID | LOG_NDELAY | LOG_NOWAIT ) +#elif defined( LOG_NDELAY ) +# define OPENLOG_OPTIONS ( LOG_PID | LOG_NDELAY ) +#elif defined( LOG_NOWAIT ) +# define OPENLOG_OPTIONS ( LOG_PID | LOG_NOWAIT ) +#elif defined( LOG_PID ) +# define OPENLOG_OPTIONS ( LOG_PID ) +#else +# define OPENLOG_OPTIONS ( 0 ) +#endif + +#endif /* _AC_SYSLOG_H_ */ diff --git a/deps/include/ac/termios.h b/deps/include/ac/termios.h new file mode 100644 index 0000000..84a505e --- /dev/null +++ b/deps/include/ac/termios.h @@ -0,0 +1,50 @@ +/* Generic termios.h */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _AC_TERMIOS_H +#define _AC_TERMIOS_H + +#ifdef HAVE_TERMIOS_H +#include + +#ifdef GCWINSZ_IN_SYS_IOCTL +#include +#endif + +#define TERMIO_TYPE struct termios +#define TERMFLAG_TYPE tcflag_t +#define GETATTR( fd, tiop ) tcgetattr((fd), (tiop)) +#define SETATTR( fd, tiop ) tcsetattr((fd), TCSANOW /* 0 */, (tiop)) +#define GETFLAGS( tio ) ((tio).c_lflag) +#define SETFLAGS( tio, flags ) ((tio).c_lflag = (flags)) + +#elif defined( HAVE_SGTTY_H ) +#include + +#ifdef HAVE_SYS_IOCTL_H +#include +#endif + +#define TERMIO_TYPE struct sgttyb +#define TERMFLAG_TYPE int +#define GETATTR( fd, tiop ) ioctl((fd), TIOCGETP, (caddr_t)(tiop)) +#define SETATTR( fd, tiop ) ioctl((fd), TIOCSETP, (caddr_t)(tiop)) +#define GETFLAGS( tio ) ((tio).sg_flags) +#define SETFLAGS( tio, flags ) ((tio).sg_flags = (flags)) + +#endif /* HAVE_SGTTY_H */ + +#endif /* _AC_TERMIOS_H */ diff --git a/deps/include/ac/time.h b/deps/include/ac/time.h new file mode 100644 index 0000000..a3049c5 --- /dev/null +++ b/deps/include/ac/time.h @@ -0,0 +1,32 @@ +/* Generic time.h */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _AC_TIME_H +#define _AC_TIME_H + +#ifdef TIME_WITH_SYS_TIME +# include +# include +#elif defined(HAVE_SYS_TIME_H) +# include +# ifdef HAVE_SYS_TIMEB_H +# include +# endif +#else +# include +#endif + +#endif /* _AC_TIME_H */ diff --git a/deps/include/ac/unistd.h b/deps/include/ac/unistd.h new file mode 100644 index 0000000..85a7a1c --- /dev/null +++ b/deps/include/ac/unistd.h @@ -0,0 +1,72 @@ +/* Generic unistd.h */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _AC_UNISTD_H +#define _AC_UNISTD_H + +#ifdef HAVE_SYS_TYPES_H +# include +#endif + +#ifdef HAVE_UNISTD_H +# include +#endif + +#ifdef HAVE_PROCESS_H +# include +#endif + +/* note: callers of crypt(3) should include */ + +#if defined(HAVE_GETPASSPHRASE) +LDAP_LIBC_F(char*)(getpassphrase)(); + +#else +#define getpassphrase(p) lutil_getpass(p) +LDAP_LUTIL_F(char*)(lutil_getpass) LDAP_P((const char *getpass)); +#endif + +/* getopt() defines may be in separate include file */ +#ifdef HAVE_GETOPT_H +# include + +#elif !defined(HAVE_GETOPT) + /* no getopt, assume we need getopt-compat.h */ +# include + +#else + /* assume we need to declare these externs */ + LDAP_LIBC_V (char *) optarg; + LDAP_LIBC_V (int) optind, opterr, optopt; +#endif + +/* use lutil file locking */ +#define ldap_lockf(x) lutil_lockf(x) +#define ldap_unlockf(x) lutil_unlockf(x) +#include + +/* + * Windows: although sleep() will be resolved by both MSVC and Mingw GCC + * linkers, the function is not declared in header files. This is + * because Windows' version of the function is called _sleep(), and it + * is declared in stdlib.h + */ + +#ifdef _WIN32 +#define sleep _sleep +#endif + +#endif /* _AC_UNISTD_H */ diff --git a/deps/include/ac/wait.h b/deps/include/ac/wait.h new file mode 100644 index 0000000..befe9cd --- /dev/null +++ b/deps/include/ac/wait.h @@ -0,0 +1,56 @@ +/* Generic wait.h */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _AC_WAIT_H +#define _AC_WAIT_H + +#include + +#ifdef HAVE_SYS_WAIT_H +# include +#endif + +#define LDAP_HI(s) (((s) >> 8) & 0377) +#define LDAP_LO(s) ((s) & 0377) + +/* These should work on non-POSIX UNIX platforms, + all bets on off on non-POSIX non-UNIX platforms... */ +#ifndef WIFEXITED +# define WIFEXITED(s) (LDAP_LO(s) == 0) +#endif +#ifndef WEXITSTATUS +# define WEXITSTATUS(s) LDAP_HI(s) +#endif +#ifndef WIFSIGNALED +# define WIFSIGNALED(s) (LDAP_LO(s) > 0 && LDAP_HI(s) == 0) +#endif +#ifndef WTERMSIG +# define WTERMSIG(s) (LDAP_LO(s) & 0177) +#endif +#ifndef WIFSTOPPED +# define WIFSTOPPED(s) (LDAP_LO(s) == 0177 && LDAP_HI(s) != 0) +#endif +#ifndef WSTOPSIG +# define WSTOPSIG(s) LDAP_HI(s) +#endif + +#ifdef WCONTINUED +# define WAIT_FLAGS ( WNOHANG | WUNTRACED | WCONTINUED ) +#else +# define WAIT_FLAGS ( WNOHANG | WUNTRACED ) +#endif + +#endif /* _AC_WAIT_H */ diff --git a/deps/include/avl.h b/deps/include/avl.h new file mode 100644 index 0000000..bddad0d --- /dev/null +++ b/deps/include/avl.h @@ -0,0 +1,158 @@ +/* avl.h - avl tree definitions */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ +/* Portions Copyright (c) 1993 Regents of the University of Michigan. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and that due credit is given + * to the University of Michigan at Ann Arbor. The name of the University + * may not be used to endorse or promote products derived from this + * software without specific prior written permission. This software + * is provided ``as is'' without express or implied warranty. + */ + + +#ifndef _AVL +#define _AVL + +#include + +/* + * this structure represents a generic avl tree node. + */ + +LDAP_BEGIN_DECL + +typedef struct avlnode Avlnode; + +struct avlnode { + void* avl_data; + struct avlnode *avl_link[2]; + char avl_bits[2]; + signed char avl_bf; +}; + +#define avl_left avl_link[0] +#define avl_right avl_link[1] +#define avl_lbit avl_bits[0] +#define avl_rbit avl_bits[1] + +#ifdef AVL_INTERNAL + +#define NULLAVL ((Avlnode *) NULL) + +/* balance factor values */ +#define LH (-1) +#define EH 0 +#define RH 1 + +#define avl_bf2str(bf) ((bf) == -1 ? "LH" : (bf) == 0 ? "EH" : (bf) == 1 ? "RH" : "(unknown)" ) + +/* thread bits */ +#define AVL_THREAD 0 +#define AVL_CHILD 1 + +/* avl routines */ +#define avl_getone(x) ((x) == 0 ? 0 : (x)->avl_data) +#define avl_onenode(x) ((x) == 0 || ((x)->avl_left == 0 && (x)->avl_right == 0)) + +#endif /* AVL_INTERNALS */ + +#define avl_child(x,dir) ((x)->avl_bits[dir]) == AVL_CHILD ? \ + (x)->avl_link[dir] : NULL +#define avl_lchild(x) avl_child(x,0) +#define avl_rchild(x) avl_child(x,1) + +typedef int (*AVL_APPLY) LDAP_P((void *, void*)); +typedef int (*AVL_CMP) LDAP_P((const void*, const void*)); +typedef int (*AVL_DUP) LDAP_P((void*, void*)); +typedef void (*AVL_FREE) LDAP_P((void*)); + +LDAP_AVL_F( int ) +avl_free LDAP_P(( Avlnode *root, AVL_FREE dfree )); + +LDAP_AVL_F( int ) +avl_insert LDAP_P((Avlnode **, void*, AVL_CMP, AVL_DUP)); + +LDAP_AVL_F( void* ) +avl_delete LDAP_P((Avlnode **, void*, AVL_CMP)); + +LDAP_AVL_F( void* ) +avl_find LDAP_P((Avlnode *, const void*, AVL_CMP)); + +LDAP_AVL_F( Avlnode* ) +avl_find2 LDAP_P((Avlnode *, const void*, AVL_CMP)); + +LDAP_AVL_F( void* ) +avl_find_lin LDAP_P((Avlnode *, const void*, AVL_CMP)); + +#ifdef AVL_NONREENTRANT +LDAP_AVL_F( void* ) +avl_getfirst LDAP_P((Avlnode *)); + +LDAP_AVL_F( void* ) +avl_getnext LDAP_P((void)); +#endif + +LDAP_AVL_F( int ) +avl_dup_error LDAP_P((void*, void*)); + +LDAP_AVL_F( int ) +avl_dup_ok LDAP_P((void*, void*)); + +LDAP_AVL_F( int ) +avl_apply LDAP_P((Avlnode *, AVL_APPLY, void*, int, int)); + +LDAP_AVL_F( int ) +avl_prefixapply LDAP_P((Avlnode *, void*, AVL_CMP, void*, AVL_CMP, void*, int)); + +LDAP_AVL_F( int ) +tavl_free LDAP_P(( Avlnode *root, AVL_FREE dfree )); + +LDAP_AVL_F( int ) +tavl_insert LDAP_P((Avlnode **, void*, AVL_CMP, AVL_DUP)); + +LDAP_AVL_F( void* ) +tavl_delete LDAP_P((Avlnode **, void*, AVL_CMP)); + +LDAP_AVL_F( void* ) +tavl_find LDAP_P((Avlnode *, const void*, AVL_CMP)); + +LDAP_AVL_F( Avlnode* ) +tavl_find2 LDAP_P((Avlnode *, const void*, AVL_CMP)); + +LDAP_AVL_F( Avlnode* ) +tavl_find3 LDAP_P((Avlnode *, const void*, AVL_CMP, int *ret)); + +#define TAVL_DIR_LEFT 0 +#define TAVL_DIR_RIGHT 1 + +LDAP_AVL_F( Avlnode* ) +tavl_end LDAP_P((Avlnode *, int direction )); + +LDAP_AVL_F( Avlnode* ) +tavl_next LDAP_P((Avlnode *, int direction )); + +/* apply traversal types */ +#define AVL_PREORDER 1 +#define AVL_INORDER 2 +#define AVL_POSTORDER 3 +/* what apply returns if it ran out of nodes */ +#define AVL_NOMORE (-6) + +LDAP_END_DECL + +#endif /* _AVL */ diff --git a/deps/include/getopt-compat.h b/deps/include/getopt-compat.h new file mode 100644 index 0000000..a344515 --- /dev/null +++ b/deps/include/getopt-compat.h @@ -0,0 +1,40 @@ +/* getopt-compat.h -- getopt(3) compatibility header */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +/* + * getopt(3) declarations + */ +#ifndef _GETOPT_COMPAT_H +#define _GETOPT_COMPAT_H + +#include + +LDAP_BEGIN_DECL + +/* change symbols to avoid clashing */ +#define optarg lutil_optarg +#define optind lutil_optind +#define opterr lutil_opterr +#define optopt lutil_optopt +#define getopt lutil_getopt + +LDAP_LUTIL_V (char *) optarg; +LDAP_LUTIL_V (int) optind, opterr, optopt; +LDAP_LUTIL_F (int) getopt LDAP_P(( int, char * const [], const char *)); + +LDAP_END_DECL + +#endif /* _GETOPT_COMPAT_H */ diff --git a/deps/include/lber.h b/deps/include/lber.h new file mode 100644 index 0000000..a2aaf01 --- /dev/null +++ b/deps/include/lber.h @@ -0,0 +1,681 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ +/* Portions Copyright (c) 1990 Regents of the University of Michigan. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and that due credit is given + * to the University of Michigan at Ann Arbor. The name of the University + * may not be used to endorse or promote products derived from this + * software without specific prior written permission. This software + * is provided ``as is'' without express or implied warranty. + */ + +#ifndef _LBER_H +#define _LBER_H + +#include +#include + +LDAP_BEGIN_DECL + +/* + * ber_tag_t represents the identifier octets at the beginning of BER + * elements. OpenLDAP treats them as mere big-endian unsigned integers. + * + * Actually the BER identifier octets look like this: + * + * Bits of 1st octet: + * ______ + * 8 7 | CLASS + * 0 0 = UNIVERSAL + * 0 1 = APPLICATION + * 1 0 = CONTEXT-SPECIFIC + * 1 1 = PRIVATE + * _____ + * | 6 | DATA-TYPE + * 0 = PRIMITIVE + * 1 = CONSTRUCTED + * ___________ + * | 5 ... 1 | TAG-NUMBER + * + * For ASN.1 tag numbers >= 0x1F, TAG-NUMBER above is 0x1F and the next + * BER octets contain the actual ASN.1 tag number: Big-endian, base + * 128, 8.bit = 1 in all but the last octet, minimum number of octets. + */ + +/* BER classes and mask (in 1st identifier octet) */ +#define LBER_CLASS_UNIVERSAL ((ber_tag_t) 0x00U) +#define LBER_CLASS_APPLICATION ((ber_tag_t) 0x40U) +#define LBER_CLASS_CONTEXT ((ber_tag_t) 0x80U) +#define LBER_CLASS_PRIVATE ((ber_tag_t) 0xc0U) +#define LBER_CLASS_MASK ((ber_tag_t) 0xc0U) + +/* BER encoding type and mask (in 1st identifier octet) */ +#define LBER_PRIMITIVE ((ber_tag_t) 0x00U) +#define LBER_CONSTRUCTED ((ber_tag_t) 0x20U) +#define LBER_ENCODING_MASK ((ber_tag_t) 0x20U) + +#define LBER_BIG_TAG_MASK ((ber_tag_t) 0x1fU) +#define LBER_MORE_TAG_MASK ((ber_tag_t) 0x80U) + +/* + * LBER_ERROR and LBER_DEFAULT are values that can never appear + * as valid BER tags, so it is safe to use them to report errors. + * Valid tags have (tag & (ber_tag_t) 0xFF) != 0xFF. + */ +#define LBER_ERROR ((ber_tag_t) -1) +#define LBER_DEFAULT ((ber_tag_t) -1) + +/* general BER types we know about */ +#define LBER_BOOLEAN ((ber_tag_t) 0x01UL) +#define LBER_INTEGER ((ber_tag_t) 0x02UL) +#define LBER_BITSTRING ((ber_tag_t) 0x03UL) +#define LBER_OCTETSTRING ((ber_tag_t) 0x04UL) +#define LBER_NULL ((ber_tag_t) 0x05UL) +#define LBER_ENUMERATED ((ber_tag_t) 0x0aUL) +#define LBER_SEQUENCE ((ber_tag_t) 0x30UL) /* constructed */ +#define LBER_SET ((ber_tag_t) 0x31UL) /* constructed */ + +/* LBER BerElement options */ +#define LBER_USE_DER 0x01 + +/* get/set options for BerElement */ +#define LBER_OPT_BER_OPTIONS 0x01 +#define LBER_OPT_BER_DEBUG 0x02 +#define LBER_OPT_BER_REMAINING_BYTES 0x03 +#define LBER_OPT_BER_TOTAL_BYTES 0x04 +#define LBER_OPT_BER_BYTES_TO_WRITE 0x05 +#define LBER_OPT_BER_MEMCTX 0x06 + +#define LBER_OPT_DEBUG_LEVEL LBER_OPT_BER_DEBUG +#define LBER_OPT_REMAINING_BYTES LBER_OPT_BER_REMAINING_BYTES +#define LBER_OPT_TOTAL_BYTES LBER_OPT_BER_TOTAL_BYTES +#define LBER_OPT_BYTES_TO_WRITE LBER_OPT_BER_BYTES_TO_WRITE + +#define LBER_OPT_LOG_PRINT_FN 0x8001 +#define LBER_OPT_MEMORY_FNS 0x8002 +#define LBER_OPT_ERROR_FN 0x8003 +#define LBER_OPT_LOG_PRINT_FILE 0x8004 + +/* get/set Memory Debug options */ +#define LBER_OPT_MEMORY_INUSE 0x8005 /* for memory debugging */ +#define LBER_OPT_LOG_PROC 0x8006 /* for external logging function */ + +typedef int* (*BER_ERRNO_FN) LDAP_P(( void )); + +typedef void (*BER_LOG_PRINT_FN) LDAP_P(( LDAP_CONST char *buf )); + +typedef void* (BER_MEMALLOC_FN) LDAP_P(( ber_len_t size, void *ctx )); +typedef void* (BER_MEMCALLOC_FN) LDAP_P(( ber_len_t n, ber_len_t size, void *ctx )); +typedef void* (BER_MEMREALLOC_FN) LDAP_P(( void *p, ber_len_t size, void *ctx )); +typedef void (BER_MEMFREE_FN) LDAP_P(( void *p, void *ctx )); + +typedef struct lber_memory_fns { + BER_MEMALLOC_FN *bmf_malloc; + BER_MEMCALLOC_FN *bmf_calloc; + BER_MEMREALLOC_FN *bmf_realloc; + BER_MEMFREE_FN *bmf_free; +} BerMemoryFunctions; + +/* LBER Sockbuf_IO options */ +#define LBER_SB_OPT_GET_FD 1 +#define LBER_SB_OPT_SET_FD 2 +#define LBER_SB_OPT_HAS_IO 3 +#define LBER_SB_OPT_SET_NONBLOCK 4 +#define LBER_SB_OPT_GET_SSL 7 +#define LBER_SB_OPT_DATA_READY 8 +#define LBER_SB_OPT_SET_READAHEAD 9 +#define LBER_SB_OPT_DRAIN 10 +#define LBER_SB_OPT_NEEDS_READ 11 +#define LBER_SB_OPT_NEEDS_WRITE 12 +#define LBER_SB_OPT_GET_MAX_INCOMING 13 +#define LBER_SB_OPT_SET_MAX_INCOMING 14 + +/* Only meaningful ifdef LDAP_PF_LOCAL_SENDMSG */ +#define LBER_SB_OPT_UNGET_BUF 15 + +/* Largest option used by the library */ +#define LBER_SB_OPT_OPT_MAX 15 + +/* LBER IO operations stacking levels */ +#define LBER_SBIOD_LEVEL_PROVIDER 10 +#define LBER_SBIOD_LEVEL_TRANSPORT 20 +#define LBER_SBIOD_LEVEL_APPLICATION 30 + +/* get/set options for Sockbuf */ +#define LBER_OPT_SOCKBUF_DESC 0x1000 +#define LBER_OPT_SOCKBUF_OPTIONS 0x1001 +#define LBER_OPT_SOCKBUF_DEBUG 0x1002 + +/* on/off values */ +LBER_V( char ) ber_pvt_opt_on; +#define LBER_OPT_ON ((void *) &ber_pvt_opt_on) +#define LBER_OPT_OFF ((void *) 0) + +#define LBER_OPT_SUCCESS (0) +#define LBER_OPT_ERROR (-1) + +typedef struct berelement BerElement; +typedef struct sockbuf Sockbuf; + +typedef struct sockbuf_io Sockbuf_IO; + +/* Structure for LBER IO operation descriptor */ +typedef struct sockbuf_io_desc { + int sbiod_level; + Sockbuf *sbiod_sb; + Sockbuf_IO *sbiod_io; + void *sbiod_pvt; + struct sockbuf_io_desc *sbiod_next; +} Sockbuf_IO_Desc; + +/* Structure for LBER IO operation functions */ +struct sockbuf_io { + int (*sbi_setup)( Sockbuf_IO_Desc *sbiod, void *arg ); + int (*sbi_remove)( Sockbuf_IO_Desc *sbiod ); + int (*sbi_ctrl)( Sockbuf_IO_Desc *sbiod, int opt, void *arg); + + ber_slen_t (*sbi_read)( Sockbuf_IO_Desc *sbiod, void *buf, + ber_len_t len ); + ber_slen_t (*sbi_write)( Sockbuf_IO_Desc *sbiod, void *buf, + ber_len_t len ); + + int (*sbi_close)( Sockbuf_IO_Desc *sbiod ); +}; + +/* Helper macros for LBER IO functions */ +#define LBER_SBIOD_READ_NEXT( sbiod, buf, len ) \ + ( (sbiod)->sbiod_next->sbiod_io->sbi_read( (sbiod)->sbiod_next, \ + buf, len ) ) +#define LBER_SBIOD_WRITE_NEXT( sbiod, buf, len ) \ + ( (sbiod)->sbiod_next->sbiod_io->sbi_write( (sbiod)->sbiod_next, \ + buf, len ) ) +#define LBER_SBIOD_CTRL_NEXT( sbiod, opt, arg ) \ + ( (sbiod)->sbiod_next ? \ + ( (sbiod)->sbiod_next->sbiod_io->sbi_ctrl( \ + (sbiod)->sbiod_next, opt, arg ) ) : 0 ) + +/* structure for returning a sequence of octet strings + length */ +typedef struct berval { + ber_len_t bv_len; + char *bv_val; +} BerValue; + +typedef BerValue *BerVarray; /* To distinguish from a single bv */ + +/* this should be moved to lber-int.h */ + +/* + * in bprint.c: + */ +LBER_F( void ) +ber_error_print LDAP_P(( + LDAP_CONST char *data )); + +LBER_F( void ) +ber_bprint LDAP_P(( + LDAP_CONST char *data, ber_len_t len )); + +LBER_F( void ) +ber_dump LDAP_P(( + BerElement *ber, int inout )); + +/* + * in decode.c: + */ +typedef int (*BERDecodeCallback) LDAP_P(( + BerElement *ber, + void *data, + int mode )); + +LBER_F( ber_tag_t ) +ber_get_tag LDAP_P(( + BerElement *ber )); + +LBER_F( ber_tag_t ) +ber_skip_tag LDAP_P(( + BerElement *ber, + ber_len_t *len )); + +LBER_F( ber_tag_t ) +ber_peek_tag LDAP_P(( + BerElement *ber, + ber_len_t *len )); + +LBER_F( ber_tag_t ) +ber_skip_element LDAP_P(( + BerElement *ber, + struct berval *bv )); + +LBER_F( ber_tag_t ) +ber_peek_element LDAP_P(( + LDAP_CONST BerElement *ber, + struct berval *bv )); + +LBER_F( ber_tag_t ) +ber_get_int LDAP_P(( + BerElement *ber, + ber_int_t *num )); + +LBER_F( ber_tag_t ) +ber_get_enum LDAP_P(( + BerElement *ber, + ber_int_t *num )); + +LBER_F( ber_tag_t ) +ber_get_stringb LDAP_P(( + BerElement *ber, + char *buf, + ber_len_t *len )); + +#define LBER_BV_ALLOC 0x01 /* allocate/copy result, otherwise in-place */ +#define LBER_BV_NOTERM 0x02 /* omit NUL-terminator if parsing in-place */ +#define LBER_BV_STRING 0x04 /* fail if berval contains embedded \0 */ +/* LBER_BV_STRING currently accepts a terminating \0 in the berval, because + * Active Directory sends that in at least the diagonsticMessage field. + */ + +LBER_F( ber_tag_t ) +ber_get_stringbv LDAP_P(( + BerElement *ber, + struct berval *bv, + int options )); + +LBER_F( ber_tag_t ) +ber_get_stringa LDAP_P(( + BerElement *ber, + char **buf )); + +LBER_F( ber_tag_t ) +ber_get_stringal LDAP_P(( + BerElement *ber, + struct berval **bv )); + +LBER_F( ber_tag_t ) +ber_get_bitstringa LDAP_P(( + BerElement *ber, + char **buf, + ber_len_t *len )); + +LBER_F( ber_tag_t ) +ber_get_null LDAP_P(( + BerElement *ber )); + +LBER_F( ber_tag_t ) +ber_get_boolean LDAP_P(( + BerElement *ber, + ber_int_t *boolval )); + +LBER_F( ber_tag_t ) +ber_first_element LDAP_P(( + BerElement *ber, + ber_len_t *len, + char **last )); + +LBER_F( ber_tag_t ) +ber_next_element LDAP_P(( + BerElement *ber, + ber_len_t *len, + LDAP_CONST char *last )); + +LBER_F( ber_tag_t ) +ber_scanf LDAP_P(( + BerElement *ber, + LDAP_CONST char *fmt, + ... )); + +LBER_F( int ) +ber_decode_oid LDAP_P(( + struct berval *in, + struct berval *out )); + +/* + * in encode.c + */ +LBER_F( int ) +ber_encode_oid LDAP_P(( + struct berval *in, + struct berval *out )); + +typedef int (*BEREncodeCallback) LDAP_P(( + BerElement *ber, + void *data )); + +LBER_F( int ) +ber_put_enum LDAP_P(( + BerElement *ber, + ber_int_t num, + ber_tag_t tag )); + +LBER_F( int ) +ber_put_int LDAP_P(( + BerElement *ber, + ber_int_t num, + ber_tag_t tag )); + +LBER_F( int ) +ber_put_ostring LDAP_P(( + BerElement *ber, + LDAP_CONST char *str, + ber_len_t len, + ber_tag_t tag )); + +LBER_F( int ) +ber_put_berval LDAP_P(( + BerElement *ber, + struct berval *bv, + ber_tag_t tag )); + +LBER_F( int ) +ber_put_string LDAP_P(( + BerElement *ber, + LDAP_CONST char *str, + ber_tag_t tag )); + +LBER_F( int ) +ber_put_bitstring LDAP_P(( + BerElement *ber, + LDAP_CONST char *str, + ber_len_t bitlen, + ber_tag_t tag )); + +LBER_F( int ) +ber_put_null LDAP_P(( + BerElement *ber, + ber_tag_t tag )); + +LBER_F( int ) +ber_put_boolean LDAP_P(( + BerElement *ber, + ber_int_t boolval, + ber_tag_t tag )); + +LBER_F( int ) +ber_start_seq LDAP_P(( + BerElement *ber, + ber_tag_t tag )); + +LBER_F( int ) +ber_start_set LDAP_P(( + BerElement *ber, + ber_tag_t tag )); + +LBER_F( int ) +ber_put_seq LDAP_P(( + BerElement *ber )); + +LBER_F( int ) +ber_put_set LDAP_P(( + BerElement *ber )); + +LBER_F( int ) +ber_printf LDAP_P(( + BerElement *ber, + LDAP_CONST char *fmt, + ... )); + + +/* + * in io.c: + */ + +LBER_F( ber_slen_t ) +ber_skip_data LDAP_P(( + BerElement *ber, + ber_len_t len )); + +LBER_F( ber_slen_t ) +ber_read LDAP_P(( + BerElement *ber, + char *buf, + ber_len_t len )); + +LBER_F( ber_slen_t ) +ber_write LDAP_P(( + BerElement *ber, + LDAP_CONST char *buf, + ber_len_t len, + int zero )); /* nonzero is unsupported from OpenLDAP 2.4.18 */ + +LBER_F( void ) +ber_free LDAP_P(( + BerElement *ber, + int freebuf )); + +LBER_F( void ) +ber_free_buf LDAP_P(( BerElement *ber )); + +LBER_F( int ) +ber_flush2 LDAP_P(( + Sockbuf *sb, + BerElement *ber, + int freeit )); +#define LBER_FLUSH_FREE_NEVER (0x0) /* traditional behavior */ +#define LBER_FLUSH_FREE_ON_SUCCESS (0x1) /* traditional behavior */ +#define LBER_FLUSH_FREE_ON_ERROR (0x2) +#define LBER_FLUSH_FREE_ALWAYS (LBER_FLUSH_FREE_ON_SUCCESS|LBER_FLUSH_FREE_ON_ERROR) + +LBER_F( int ) +ber_flush LDAP_P(( + Sockbuf *sb, + BerElement *ber, + int freeit )); /* DEPRECATED */ + +LBER_F( BerElement * ) +ber_alloc LDAP_P(( void )); /* DEPRECATED */ + +LBER_F( BerElement * ) +der_alloc LDAP_P(( void )); /* DEPRECATED */ + +LBER_F( BerElement * ) +ber_alloc_t LDAP_P(( + int beroptions )); + +LBER_F( BerElement * ) +ber_dup LDAP_P(( + BerElement *ber )); + +LBER_F( ber_tag_t ) +ber_get_next LDAP_P(( + Sockbuf *sb, + ber_len_t *len, + BerElement *ber )); + +LBER_F( void ) +ber_init2 LDAP_P(( + BerElement *ber, + struct berval *bv, + int options )); + +LBER_F( void ) +ber_init_w_nullc LDAP_P(( /* DEPRECATED */ + BerElement *ber, + int options )); + +LBER_F( void ) +ber_reset LDAP_P(( + BerElement *ber, + int was_writing )); + +LBER_F( BerElement * ) +ber_init LDAP_P(( + struct berval *bv )); + +LBER_F( int ) +ber_flatten LDAP_P(( + BerElement *ber, + struct berval **bvPtr )); + +LBER_F( int ) +ber_flatten2 LDAP_P(( + BerElement *ber, + struct berval *bv, + int alloc )); + +LBER_F( int ) +ber_remaining LDAP_P(( + BerElement *ber )); + +/* + * LBER ber accessor functions + */ + +LBER_F( int ) +ber_get_option LDAP_P(( + void *item, + int option, + void *outvalue)); + +LBER_F( int ) +ber_set_option LDAP_P(( + void *item, + int option, + LDAP_CONST void *invalue)); + +/* + * LBER sockbuf.c + */ + +LBER_F( Sockbuf * ) +ber_sockbuf_alloc LDAP_P(( + void )); + +LBER_F( void ) +ber_sockbuf_free LDAP_P(( + Sockbuf *sb )); + +LBER_F( int ) +ber_sockbuf_add_io LDAP_P(( + Sockbuf *sb, + Sockbuf_IO *sbio, + int layer, + void *arg )); + +LBER_F( int ) +ber_sockbuf_remove_io LDAP_P(( + Sockbuf *sb, + Sockbuf_IO *sbio, + int layer )); + +LBER_F( int ) +ber_sockbuf_ctrl LDAP_P(( + Sockbuf *sb, + int opt, + void *arg )); + +LBER_V( Sockbuf_IO ) ber_sockbuf_io_tcp; +LBER_V( Sockbuf_IO ) ber_sockbuf_io_readahead; +LBER_V( Sockbuf_IO ) ber_sockbuf_io_fd; +LBER_V( Sockbuf_IO ) ber_sockbuf_io_debug; +LBER_V( Sockbuf_IO ) ber_sockbuf_io_udp; + +/* + * LBER memory.c + */ +LBER_F( void * ) +ber_memalloc LDAP_P(( + ber_len_t s )); + +LBER_F( void * ) +ber_memrealloc LDAP_P(( + void* p, + ber_len_t s )); + +LBER_F( void * ) +ber_memcalloc LDAP_P(( + ber_len_t n, + ber_len_t s )); + +LBER_F( void ) +ber_memfree LDAP_P(( + void* p )); + +LBER_F( void ) +ber_memvfree LDAP_P(( + void** vector )); + +LBER_F( void ) +ber_bvfree LDAP_P(( + struct berval *bv )); + +LBER_F( void ) +ber_bvecfree LDAP_P(( + struct berval **bv )); + +LBER_F( int ) +ber_bvecadd LDAP_P(( + struct berval ***bvec, + struct berval *bv )); + +LBER_F( struct berval * ) +ber_dupbv LDAP_P(( + struct berval *dst, struct berval *src )); + +LBER_F( struct berval * ) +ber_bvdup LDAP_P(( + struct berval *src )); + +LBER_F( struct berval * ) +ber_mem2bv LDAP_P(( + LDAP_CONST char *, ber_len_t len, int duplicate, struct berval *bv)); + +LBER_F( struct berval * ) +ber_str2bv LDAP_P(( + LDAP_CONST char *, ber_len_t len, int duplicate, struct berval *bv)); + +#define ber_bvstr(a) ((ber_str2bv)((a), 0, 0, NULL)) +#define ber_bvstrdup(a) ((ber_str2bv)((a), 0, 1, NULL)) + +LBER_F( char * ) +ber_strdup LDAP_P(( + LDAP_CONST char * )); + +LBER_F( ber_len_t ) +ber_strnlen LDAP_P(( + LDAP_CONST char *s, ber_len_t len )); + +LBER_F( char * ) +ber_strndup LDAP_P(( + LDAP_CONST char *s, ber_len_t l )); + +LBER_F( struct berval * ) +ber_bvreplace LDAP_P(( + struct berval *dst, LDAP_CONST struct berval *src )); + +LBER_F( void ) +ber_bvarray_free LDAP_P(( BerVarray p )); + +LBER_F( int ) +ber_bvarray_add LDAP_P(( BerVarray *p, BerValue *bv )); + +#define ber_bvcmp(v1,v2) \ + ((v1)->bv_len < (v2)->bv_len \ + ? -1 : ((v1)->bv_len > (v2)->bv_len \ + ? 1 : memcmp((v1)->bv_val, (v2)->bv_val, (v1)->bv_len) )) + +/* + * error.c + */ +LBER_F( int * ) ber_errno_addr LDAP_P((void)); +#define ber_errno (*(ber_errno_addr)()) + +#define LBER_ERROR_NONE 0 +#define LBER_ERROR_PARAM 0x1 +#define LBER_ERROR_MEMORY 0x2 + +LDAP_END_DECL + +#endif /* _LBER_H */ diff --git a/deps/include/lber_pvt.h b/deps/include/lber_pvt.h new file mode 100644 index 0000000..b963f41 --- /dev/null +++ b/deps/include/lber_pvt.h @@ -0,0 +1,222 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +/* + * lber_pvt.h - Header for ber_pvt_ functions. + * These are meant to be internal to OpenLDAP Software. + */ + +#ifndef _LBER_PVT_H +#define _LBER_PVT_H 1 + +#include + +LDAP_BEGIN_DECL + +/* for allocating aligned buffers (on the stack) */ +#define LBER_ALIGNED_BUFFER(uname,size) \ + union uname { \ + char buffer[size]; \ + /* force alignment */ \ + int ialign; \ + long lalign; \ + float falign; \ + double dalign; \ + char* palign; \ + } + +#define LBER_ELEMENT_SIZEOF (256) /* must be >= sizeof(BerElement) */ +typedef LBER_ALIGNED_BUFFER(lber_berelement_u,LBER_ELEMENT_SIZEOF) + BerElementBuffer; + +typedef struct sockbuf_buf { + ber_len_t buf_size; + ber_len_t buf_ptr; + ber_len_t buf_end; + char *buf_base; +} Sockbuf_Buf; + +/* + * bprint.c + */ +LBER_V( BER_LOG_PRINT_FN ) ber_pvt_log_print; + +LBER_F( int ) +ber_pvt_log_printf LDAP_P(( + int errlvl, + int loglvl, + const char *fmt, + ... )) LDAP_GCCATTR((format(printf, 3, 4))); + +/* + * sockbuf.c + */ +LBER_F( ber_slen_t ) +ber_pvt_sb_do_write LDAP_P(( Sockbuf_IO_Desc *sbiod, Sockbuf_Buf *buf_out )); + +LBER_F( void ) +ber_pvt_sb_buf_init LDAP_P(( Sockbuf_Buf *buf )); + +LBER_F( void ) +ber_pvt_sb_buf_destroy LDAP_P(( Sockbuf_Buf *buf )); + +LBER_F( int ) +ber_pvt_sb_grow_buffer LDAP_P(( Sockbuf_Buf *buf, ber_len_t minsize )); + +LBER_F( ber_len_t ) +ber_pvt_sb_copy_out LDAP_P(( Sockbuf_Buf *sbb, char *buf, ber_len_t len )); + +LBER_F( int ) +ber_pvt_socket_set_nonblock LDAP_P(( ber_socket_t sd, int nb )); + +/* + * memory.c + */ +LBER_F( void * ) +ber_memalloc_x LDAP_P(( + ber_len_t s, void *ctx)); + +LBER_F( void * ) +ber_memrealloc_x LDAP_P(( + void* p, + ber_len_t s, void *ctx )); + +LBER_F( void * ) +ber_memcalloc_x LDAP_P(( + ber_len_t n, + ber_len_t s, void *ctx )); + +LBER_F( void ) +ber_memfree_x LDAP_P(( + void* p, void *ctx )); + +LBER_F( void ) +ber_memvfree_x LDAP_P(( + void** vector, void *ctx )); + +LBER_F( void ) +ber_bvfree_x LDAP_P(( + struct berval *bv, void *ctx )); + +LBER_F( void ) +ber_bvecfree_x LDAP_P(( + struct berval **bv, void *ctx )); + +LBER_F( int ) +ber_bvecadd_x LDAP_P(( + struct berval ***bvec, + struct berval *bv, void *ctx )); + +LBER_F( struct berval * ) +ber_dupbv_x LDAP_P(( + struct berval *dst, struct berval *src, void *ctx )); + +LBER_F( struct berval * ) +ber_str2bv_x LDAP_P(( + LDAP_CONST char *, ber_len_t len, int dup, struct berval *bv, void *ctx)); + +LBER_F( struct berval * ) +ber_mem2bv_x LDAP_P(( + LDAP_CONST char *, ber_len_t len, int dup, struct berval *bv, void *ctx)); + +LBER_F( char * ) +ber_strdup_x LDAP_P(( + LDAP_CONST char *, void *ctx )); + +LBER_F( struct berval * ) +ber_bvreplace_x LDAP_P(( + struct berval *dst, LDAP_CONST struct berval *src, void *ctx )); + +LBER_F( void ) +ber_bvarray_free_x LDAP_P(( BerVarray p, void *ctx )); + +LBER_F( int ) +ber_bvarray_add_x LDAP_P(( BerVarray *p, BerValue *bv, void *ctx )); + +LBER_F( int ) +ber_bvarray_dup_x LDAP_P(( BerVarray *dst, BerVarray src, void *ctx )); + +#if 0 +#define ber_bvstrcmp(v1,v2) \ + ((v1)->bv_len < (v2)->bv_len \ + ? -1 : ((v1)->bv_len > (v2)->bv_len \ + ? 1 : strncmp((v1)->bv_val, (v2)->bv_val, (v1)->bv_len) )) +#else + /* avoid strncmp() */ +#define ber_bvstrcmp(v1,v2) ber_bvcmp((v1),(v2)) +#endif + +#define ber_bvstrcasecmp(v1,v2) \ + ((v1)->bv_len < (v2)->bv_len \ + ? -1 : ((v1)->bv_len > (v2)->bv_len \ + ? 1 : strncasecmp((v1)->bv_val, (v2)->bv_val, (v1)->bv_len) )) + +#define ber_bvccmp(v1,c) \ + ( (v1)->bv_len == 1 && (v1)->bv_val[0] == (c) ) + +#define ber_strccmp(s,c) \ + ( (s)[0] == (c) && (s)[1] == '\0' ) + +#define ber_bvchr(bv,c) \ + ((char *) memchr( (bv)->bv_val, (c), (bv)->bv_len )) + +#define ber_bvrchr(bv,c) \ + ((char *) lutil_memrchr( (bv)->bv_val, (c), (bv)->bv_len )) + +#define ber_bvchr_post(dst,bv,c) \ + do { \ + (dst)->bv_val = memchr( (bv)->bv_val, (c), (bv)->bv_len ); \ + (dst)->bv_len = (dst)->bv_val ? (bv)->bv_len - ((dst)->bv_val - (bv)->bv_val) : 0; \ + } while (0) + +#define ber_bvchr_pre(dst,bv,c) \ + do { \ + (dst)->bv_val = memchr( (bv)->bv_val, (c), (bv)->bv_len ); \ + (dst)->bv_len = (dst)->bv_val ? ((dst)->bv_val - (bv)->bv_val) : (bv)->bv_len; \ + (dst)->bv_val = (bv)->bv_val; \ + } while (0) + +#define ber_bvrchr_post(dst,bv,c) \ + do { \ + (dst)->bv_val = lutil_memrchr( (bv)->bv_val, (c), (bv)->bv_len ); \ + (dst)->bv_len = (dst)->bv_val ? (bv)->bv_len - ((dst)->bv_val - (bv)->bv_val) : 0; \ + } while (0) + +#define ber_bvrchr_pre(dst,bv,c) \ + do { \ + (dst)->bv_val = lutil_memrchr( (bv)->bv_val, (c), (bv)->bv_len ); \ + (dst)->bv_len = (dst)->bv_val ? ((dst)->bv_val - (bv)->bv_val) : (bv)->bv_len; \ + (dst)->bv_val = (bv)->bv_val; \ + } while (0) + +#define BER_BVC(s) { STRLENOF(s), (char *)(s) } +#define BER_BVNULL { 0L, NULL } +#define BER_BVZERO(bv) \ + do { \ + (bv)->bv_len = 0; \ + (bv)->bv_val = NULL; \ + } while (0) +#define BER_BVSTR(bv,s) \ + do { \ + (bv)->bv_len = STRLENOF(s); \ + (bv)->bv_val = (s); \ + } while (0) +#define BER_BVISNULL(bv) ((bv)->bv_val == NULL) +#define BER_BVISEMPTY(bv) ((bv)->bv_len == 0) + +LDAP_END_DECL + +#endif + diff --git a/deps/include/lber_types.h b/deps/include/lber_types.h new file mode 100644 index 0000000..0e04ad9 --- /dev/null +++ b/deps/include/lber_types.h @@ -0,0 +1,63 @@ +/* include/lber_types.h. Generated from lber_types.hin by configure. */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +/* + * LBER types + */ + +#ifndef _LBER_TYPES_H +#define _LBER_TYPES_H + +#include + +LDAP_BEGIN_DECL + +/* LBER boolean, enum, integers (32 bits or larger) */ +#define LBER_INT_T int + +/* LBER tags (32 bits or larger) */ +#define LBER_TAG_T long + +/* LBER socket descriptor */ +#define LBER_SOCKET_T int + +/* LBER lengths (32 bits or larger) */ +#define LBER_LEN_T long + +/* ------------------------------------------------------------ */ + +/* booleans, enumerations, and integers */ +typedef LBER_INT_T ber_int_t; + +/* signed and unsigned versions */ +typedef signed LBER_INT_T ber_sint_t; +typedef unsigned LBER_INT_T ber_uint_t; + +/* tags */ +typedef unsigned LBER_TAG_T ber_tag_t; + +/* "socket" descriptors */ +typedef LBER_SOCKET_T ber_socket_t; + +/* lengths */ +typedef unsigned LBER_LEN_T ber_len_t; + +/* signed lengths */ +typedef signed LBER_LEN_T ber_slen_t; + +LDAP_END_DECL + +#endif /* _LBER_TYPES_H */ diff --git a/deps/include/lber_types.hin b/deps/include/lber_types.hin new file mode 100644 index 0000000..8d988b8 --- /dev/null +++ b/deps/include/lber_types.hin @@ -0,0 +1,62 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +/* + * LBER types + */ + +#ifndef _LBER_TYPES_H +#define _LBER_TYPES_H + +#include + +LDAP_BEGIN_DECL + +/* LBER boolean, enum, integers (32 bits or larger) */ +#undef LBER_INT_T + +/* LBER tags (32 bits or larger) */ +#undef LBER_TAG_T + +/* LBER socket descriptor */ +#undef LBER_SOCKET_T + +/* LBER lengths (32 bits or larger) */ +#undef LBER_LEN_T + +/* ------------------------------------------------------------ */ + +/* booleans, enumerations, and integers */ +typedef LBER_INT_T ber_int_t; + +/* signed and unsigned versions */ +typedef signed LBER_INT_T ber_sint_t; +typedef unsigned LBER_INT_T ber_uint_t; + +/* tags */ +typedef unsigned LBER_TAG_T ber_tag_t; + +/* "socket" descriptors */ +typedef LBER_SOCKET_T ber_socket_t; + +/* lengths */ +typedef unsigned LBER_LEN_T ber_len_t; + +/* signed lengths */ +typedef signed LBER_LEN_T ber_slen_t; + +LDAP_END_DECL + +#endif /* _LBER_TYPES_H */ diff --git a/deps/include/ldap.h b/deps/include/ldap.h new file mode 100644 index 0000000..b3f2af5 --- /dev/null +++ b/deps/include/ldap.h @@ -0,0 +1,2529 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ +/* Portions Copyright (c) 1990 Regents of the University of Michigan. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and that due credit is given + * to the University of Michigan at Ann Arbor. The name of the University + * may not be used to endorse or promote products derived from this + * software without specific prior written permission. This software + * is provided ``as is'' without express or implied warranty. + */ + +#ifndef _LDAP_H +#define _LDAP_H + +/* pull in lber */ +#include + +/* include version and API feature defines */ +#include + +LDAP_BEGIN_DECL + +#define LDAP_VERSION1 1 +#define LDAP_VERSION2 2 +#define LDAP_VERSION3 3 + +#define LDAP_VERSION_MIN LDAP_VERSION2 +#define LDAP_VERSION LDAP_VERSION2 +#define LDAP_VERSION_MAX LDAP_VERSION3 + +/* + * We use 3000+n here because it is above 1823 (for RFC 1823), + * above 2000+rev of IETF LDAPEXT draft (now quite dated), + * yet below allocations for new RFCs (just in case there is + * someday an RFC produced). + */ +#define LDAP_API_VERSION 3001 +#define LDAP_VENDOR_NAME "OpenLDAP" + +/* OpenLDAP API Features */ +#define LDAP_API_FEATURE_X_OPENLDAP LDAP_VENDOR_VERSION + +#if defined( LDAP_API_FEATURE_X_OPENLDAP_REENTRANT ) || \ + ( defined( LDAP_THREAD_SAFE ) && \ + defined( LDAP_API_FEATURE_X_OPENLDAP_THREAD_SAFE ) ) + /* -lldap may or may not be thread safe */ + /* -lldap_r, if available, is always thread safe */ +# define LDAP_API_FEATURE_THREAD_SAFE 1 +# define LDAP_API_FEATURE_SESSION_THREAD_SAFE 1 +# define LDAP_API_FEATURE_OPERATION_THREAD_SAFE 1 +#endif +#if defined( LDAP_THREAD_SAFE ) && \ + defined( LDAP_API_FEATURE_X_OPENLDAP_THREAD_SAFE ) +/* #define LDAP_API_FEATURE_SESSION_SAFE 1 */ +/* #define LDAP_API_OPERATION_SESSION_SAFE 1 */ +#endif + + +#define LDAP_PORT 389 /* ldap:/// default LDAP port */ +#define LDAPS_PORT 636 /* ldaps:/// default LDAP over TLS port */ + +#define LDAP_ROOT_DSE "" +#define LDAP_NO_ATTRS "1.1" +#define LDAP_ALL_USER_ATTRIBUTES "*" +#define LDAP_ALL_OPERATIONAL_ATTRIBUTES "+" /* RFC 3673 */ + +/* RFC 4511: maxInt INTEGER ::= 2147483647 -- (2^^31 - 1) -- */ +#define LDAP_MAXINT (2147483647) + +/* + * LDAP_OPTions + * 0x0000 - 0x0fff reserved for api options + * 0x1000 - 0x3fff reserved for api extended options + * 0x4000 - 0x7fff reserved for private and experimental options + */ + +#define LDAP_OPT_API_INFO 0x0000 +#define LDAP_OPT_DESC 0x0001 /* historic */ +#define LDAP_OPT_DEREF 0x0002 +#define LDAP_OPT_SIZELIMIT 0x0003 +#define LDAP_OPT_TIMELIMIT 0x0004 +/* 0x05 - 0x07 not defined */ +#define LDAP_OPT_REFERRALS 0x0008 +#define LDAP_OPT_RESTART 0x0009 +/* 0x0a - 0x10 not defined */ +#define LDAP_OPT_PROTOCOL_VERSION 0x0011 +#define LDAP_OPT_SERVER_CONTROLS 0x0012 +#define LDAP_OPT_CLIENT_CONTROLS 0x0013 +/* 0x14 not defined */ +#define LDAP_OPT_API_FEATURE_INFO 0x0015 +/* 0x16 - 0x2f not defined */ +#define LDAP_OPT_HOST_NAME 0x0030 +#define LDAP_OPT_RESULT_CODE 0x0031 +#define LDAP_OPT_ERROR_NUMBER LDAP_OPT_RESULT_CODE +#define LDAP_OPT_DIAGNOSTIC_MESSAGE 0x0032 +#define LDAP_OPT_ERROR_STRING LDAP_OPT_DIAGNOSTIC_MESSAGE +#define LDAP_OPT_MATCHED_DN 0x0033 +/* 0x0034 - 0x3fff not defined */ +/* 0x0091 used by Microsoft for LDAP_OPT_AUTO_RECONNECT */ +#define LDAP_OPT_SSPI_FLAGS 0x0092 +/* 0x0093 used by Microsoft for LDAP_OPT_SSL_INFO */ +/* 0x0094 used by Microsoft for LDAP_OPT_REF_DEREF_CONN_PER_MSG */ +#define LDAP_OPT_SIGN 0x0095 +#define LDAP_OPT_ENCRYPT 0x0096 +#define LDAP_OPT_SASL_METHOD 0x0097 +/* 0x0098 used by Microsoft for LDAP_OPT_AREC_EXCLUSIVE */ +#define LDAP_OPT_SECURITY_CONTEXT 0x0099 +/* 0x009A used by Microsoft for LDAP_OPT_ROOTDSE_CACHE */ +/* 0x009B - 0x3fff not defined */ + +/* API Extensions */ +#define LDAP_OPT_API_EXTENSION_BASE 0x4000 /* API extensions */ + +/* private and experimental options */ +/* OpenLDAP specific options */ +#define LDAP_OPT_DEBUG_LEVEL 0x5001 /* debug level */ +#define LDAP_OPT_TIMEOUT 0x5002 /* default timeout */ +#define LDAP_OPT_REFHOPLIMIT 0x5003 /* ref hop limit */ +#define LDAP_OPT_NETWORK_TIMEOUT 0x5005 /* socket level timeout */ +#define LDAP_OPT_URI 0x5006 +#define LDAP_OPT_REFERRAL_URLS 0x5007 /* Referral URLs */ +#define LDAP_OPT_SOCKBUF 0x5008 /* sockbuf */ +#define LDAP_OPT_DEFBASE 0x5009 /* searchbase */ +#define LDAP_OPT_CONNECT_ASYNC 0x5010 /* create connections asynchronously */ +#define LDAP_OPT_CONNECT_CB 0x5011 /* connection callbacks */ +#define LDAP_OPT_SESSION_REFCNT 0x5012 /* session reference count */ + +/* OpenLDAP TLS options */ +#define LDAP_OPT_X_TLS 0x6000 +#define LDAP_OPT_X_TLS_CTX 0x6001 /* OpenSSL CTX* */ +#define LDAP_OPT_X_TLS_CACERTFILE 0x6002 +#define LDAP_OPT_X_TLS_CACERTDIR 0x6003 +#define LDAP_OPT_X_TLS_CERTFILE 0x6004 +#define LDAP_OPT_X_TLS_KEYFILE 0x6005 +#define LDAP_OPT_X_TLS_REQUIRE_CERT 0x6006 +#define LDAP_OPT_X_TLS_PROTOCOL_MIN 0x6007 +#define LDAP_OPT_X_TLS_CIPHER_SUITE 0x6008 +#define LDAP_OPT_X_TLS_RANDOM_FILE 0x6009 +#define LDAP_OPT_X_TLS_SSL_CTX 0x600a /* OpenSSL SSL* */ +#define LDAP_OPT_X_TLS_CRLCHECK 0x600b +#define LDAP_OPT_X_TLS_CONNECT_CB 0x600c +#define LDAP_OPT_X_TLS_CONNECT_ARG 0x600d +#define LDAP_OPT_X_TLS_DHFILE 0x600e +#define LDAP_OPT_X_TLS_NEWCTX 0x600f +#define LDAP_OPT_X_TLS_CRLFILE 0x6010 /* GNUtls only */ +#define LDAP_OPT_X_TLS_PACKAGE 0x6011 +#define LDAP_OPT_X_TLS_ECNAME 0x6012 + +#define LDAP_OPT_X_TLS_NEVER 0 +#define LDAP_OPT_X_TLS_HARD 1 +#define LDAP_OPT_X_TLS_DEMAND 2 +#define LDAP_OPT_X_TLS_ALLOW 3 +#define LDAP_OPT_X_TLS_TRY 4 + +#define LDAP_OPT_X_TLS_CRL_NONE 0 +#define LDAP_OPT_X_TLS_CRL_PEER 1 +#define LDAP_OPT_X_TLS_CRL_ALL 2 + +/* for LDAP_OPT_X_TLS_PROTOCOL_MIN */ +#define LDAP_OPT_X_TLS_PROTOCOL(maj,min) (((maj) << 8) + (min)) +#define LDAP_OPT_X_TLS_PROTOCOL_SSL2 (2 << 8) +#define LDAP_OPT_X_TLS_PROTOCOL_SSL3 (3 << 8) +#define LDAP_OPT_X_TLS_PROTOCOL_TLS1_0 ((3 << 8) + 1) +#define LDAP_OPT_X_TLS_PROTOCOL_TLS1_1 ((3 << 8) + 2) +#define LDAP_OPT_X_TLS_PROTOCOL_TLS1_2 ((3 << 8) + 3) + +/* OpenLDAP SASL options */ +#define LDAP_OPT_X_SASL_MECH 0x6100 +#define LDAP_OPT_X_SASL_REALM 0x6101 +#define LDAP_OPT_X_SASL_AUTHCID 0x6102 +#define LDAP_OPT_X_SASL_AUTHZID 0x6103 +#define LDAP_OPT_X_SASL_SSF 0x6104 /* read-only */ +#define LDAP_OPT_X_SASL_SSF_EXTERNAL 0x6105 /* write-only */ +#define LDAP_OPT_X_SASL_SECPROPS 0x6106 /* write-only */ +#define LDAP_OPT_X_SASL_SSF_MIN 0x6107 +#define LDAP_OPT_X_SASL_SSF_MAX 0x6108 +#define LDAP_OPT_X_SASL_MAXBUFSIZE 0x6109 +#define LDAP_OPT_X_SASL_MECHLIST 0x610a /* read-only */ +#define LDAP_OPT_X_SASL_NOCANON 0x610b +#define LDAP_OPT_X_SASL_USERNAME 0x610c /* read-only */ +#define LDAP_OPT_X_SASL_GSS_CREDS 0x610d + +/* OpenLDAP GSSAPI options */ +#define LDAP_OPT_X_GSSAPI_DO_NOT_FREE_CONTEXT 0x6200 +#define LDAP_OPT_X_GSSAPI_ALLOW_REMOTE_PRINCIPAL 0x6201 + +/* + * OpenLDAP per connection tcp-keepalive settings + * (Linux only, ignored where unsupported) + */ +#define LDAP_OPT_X_KEEPALIVE_IDLE 0x6300 +#define LDAP_OPT_X_KEEPALIVE_PROBES 0x6301 +#define LDAP_OPT_X_KEEPALIVE_INTERVAL 0x6302 + +/* Private API Extensions -- reserved for application use */ +#define LDAP_OPT_PRIVATE_EXTENSION_BASE 0x7000 /* Private API inclusive */ + +/* + * ldap_get_option() and ldap_set_option() return values. + * As later versions may return other values indicating + * failure, current applications should only compare returned + * value against LDAP_OPT_SUCCESS. + */ +#define LDAP_OPT_SUCCESS 0 +#define LDAP_OPT_ERROR (-1) + +/* option on/off values */ +#define LDAP_OPT_ON ((void *) &ber_pvt_opt_on) +#define LDAP_OPT_OFF ((void *) 0) + +typedef struct ldapapiinfo { + int ldapai_info_version; /* version of LDAPAPIInfo */ +#define LDAP_API_INFO_VERSION (1) + int ldapai_api_version; /* revision of API supported */ + int ldapai_protocol_version; /* highest LDAP version supported */ + char **ldapai_extensions; /* names of API extensions */ + char *ldapai_vendor_name; /* name of supplier */ + int ldapai_vendor_version; /* supplier-specific version * 100 */ +} LDAPAPIInfo; + +typedef struct ldap_apifeature_info { + int ldapaif_info_version; /* version of LDAPAPIFeatureInfo */ +#define LDAP_FEATURE_INFO_VERSION (1) /* apifeature_info struct version */ + char* ldapaif_name; /* LDAP_API_FEATURE_* (less prefix) */ + int ldapaif_version; /* value of LDAP_API_FEATURE_... */ +} LDAPAPIFeatureInfo; + +/* + * LDAP Control structure + */ +typedef struct ldapcontrol { + char * ldctl_oid; /* numericoid of control */ + struct berval ldctl_value; /* encoded value of control */ + char ldctl_iscritical; /* criticality */ +} LDAPControl; + +/* LDAP Controls */ +/* standard track controls */ +#define LDAP_CONTROL_MANAGEDSAIT "2.16.840.1.113730.3.4.2" /* RFC 3296 */ +#define LDAP_CONTROL_PROXY_AUTHZ "2.16.840.1.113730.3.4.18" /* RFC 4370 */ +#define LDAP_CONTROL_SUBENTRIES "1.3.6.1.4.1.4203.1.10.1" /* RFC 3672 */ + +#define LDAP_CONTROL_VALUESRETURNFILTER "1.2.826.0.1.3344810.2.3"/* RFC 3876 */ + +#define LDAP_CONTROL_ASSERT "1.3.6.1.1.12" /* RFC 4528 */ +#define LDAP_CONTROL_PRE_READ "1.3.6.1.1.13.1" /* RFC 4527 */ +#define LDAP_CONTROL_POST_READ "1.3.6.1.1.13.2" /* RFC 4527 */ + +#define LDAP_CONTROL_SORTREQUEST "1.2.840.113556.1.4.473" /* RFC 2891 */ +#define LDAP_CONTROL_SORTRESPONSE "1.2.840.113556.1.4.474" /* RFC 2891 */ + +/* non-standard track controls */ +#define LDAP_CONTROL_PAGEDRESULTS "1.2.840.113556.1.4.319" /* RFC 2696 */ + +/* LDAP Content Synchronization Operation -- RFC 4533 */ +#define LDAP_SYNC_OID "1.3.6.1.4.1.4203.1.9.1" +#define LDAP_CONTROL_SYNC LDAP_SYNC_OID ".1" +#define LDAP_CONTROL_SYNC_STATE LDAP_SYNC_OID ".2" +#define LDAP_CONTROL_SYNC_DONE LDAP_SYNC_OID ".3" +#define LDAP_SYNC_INFO LDAP_SYNC_OID ".4" + +#define LDAP_SYNC_NONE 0x00 +#define LDAP_SYNC_REFRESH_ONLY 0x01 +#define LDAP_SYNC_RESERVED 0x02 +#define LDAP_SYNC_REFRESH_AND_PERSIST 0x03 + +#define LDAP_SYNC_REFRESH_PRESENTS 0 +#define LDAP_SYNC_REFRESH_DELETES 1 + +#define LDAP_TAG_SYNC_NEW_COOKIE ((ber_tag_t) 0x80U) +#define LDAP_TAG_SYNC_REFRESH_DELETE ((ber_tag_t) 0xa1U) +#define LDAP_TAG_SYNC_REFRESH_PRESENT ((ber_tag_t) 0xa2U) +#define LDAP_TAG_SYNC_ID_SET ((ber_tag_t) 0xa3U) + +#define LDAP_TAG_SYNC_COOKIE ((ber_tag_t) 0x04U) +#define LDAP_TAG_REFRESHDELETES ((ber_tag_t) 0x01U) +#define LDAP_TAG_REFRESHDONE ((ber_tag_t) 0x01U) +#define LDAP_TAG_RELOAD_HINT ((ber_tag_t) 0x01U) + +#define LDAP_SYNC_PRESENT 0 +#define LDAP_SYNC_ADD 1 +#define LDAP_SYNC_MODIFY 2 +#define LDAP_SYNC_DELETE 3 +#define LDAP_SYNC_NEW_COOKIE 4 + +/* LDAP Don't Use Copy Control (RFC 6171) */ +#define LDAP_CONTROL_DONTUSECOPY "1.3.6.1.1.22" + +/* Password policy Controls *//* work in progress */ +/* ITS#3458: released; disabled by default */ +#define LDAP_CONTROL_PASSWORDPOLICYREQUEST "1.3.6.1.4.1.42.2.27.8.5.1" +#define LDAP_CONTROL_PASSWORDPOLICYRESPONSE "1.3.6.1.4.1.42.2.27.8.5.1" + +/* various works in progress */ +#define LDAP_CONTROL_NOOP "1.3.6.1.4.1.4203.666.5.2" +#define LDAP_CONTROL_NO_SUBORDINATES "1.3.6.1.4.1.4203.666.5.11" +#define LDAP_CONTROL_RELAX "1.3.6.1.4.1.4203.666.5.12" +#define LDAP_CONTROL_MANAGEDIT LDAP_CONTROL_RELAX +#define LDAP_CONTROL_SLURP "1.3.6.1.4.1.4203.666.5.13" +#define LDAP_CONTROL_VALSORT "1.3.6.1.4.1.4203.666.5.14" +#define LDAP_CONTROL_X_DEREF "1.3.6.1.4.1.4203.666.5.16" +#define LDAP_CONTROL_X_WHATFAILED "1.3.6.1.4.1.4203.666.5.17" + +/* LDAP Chaining Behavior Control *//* work in progress */ +/* ; + * see also LDAP_NO_REFERRALS_FOUND, LDAP_CANNOT_CHAIN */ +#define LDAP_CONTROL_X_CHAINING_BEHAVIOR "1.3.6.1.4.1.4203.666.11.3" + +#define LDAP_CHAINING_PREFERRED 0 +#define LDAP_CHAINING_REQUIRED 1 +#define LDAP_REFERRALS_PREFERRED 2 +#define LDAP_REFERRALS_REQUIRED 3 + +/* MS Active Directory controls (for compatibility) */ +#define LDAP_CONTROL_X_INCREMENTAL_VALUES "1.2.840.113556.1.4.802" +#define LDAP_CONTROL_X_DOMAIN_SCOPE "1.2.840.113556.1.4.1339" +#define LDAP_CONTROL_X_PERMISSIVE_MODIFY "1.2.840.113556.1.4.1413" +#define LDAP_CONTROL_X_SEARCH_OPTIONS "1.2.840.113556.1.4.1340" +#define LDAP_SEARCH_FLAG_DOMAIN_SCOPE 1 /* do not generate referrals */ +#define LDAP_SEARCH_FLAG_PHANTOM_ROOT 2 /* search all subordinate NCs */ +#define LDAP_CONTROL_X_TREE_DELETE "1.2.840.113556.1.4.805" + +/* MS Active Directory controls - not implemented in slapd(8) */ +#define LDAP_CONTROL_X_EXTENDED_DN "1.2.840.113556.1.4.529" + +/* */ +#define LDAP_CONTROL_X_SESSION_TRACKING "1.3.6.1.4.1.21008.108.63.1" +#define LDAP_CONTROL_X_SESSION_TRACKING_RADIUS_ACCT_SESSION_ID \ + LDAP_CONTROL_X_SESSION_TRACKING ".1" +#define LDAP_CONTROL_X_SESSION_TRACKING_RADIUS_ACCT_MULTI_SESSION_ID \ + LDAP_CONTROL_X_SESSION_TRACKING ".2" +#define LDAP_CONTROL_X_SESSION_TRACKING_USERNAME \ + LDAP_CONTROL_X_SESSION_TRACKING ".3" +/* various expired works */ + +/* LDAP Duplicated Entry Control Extension *//* not implemented in slapd(8) */ +#define LDAP_CONTROL_DUPENT_REQUEST "2.16.840.1.113719.1.27.101.1" +#define LDAP_CONTROL_DUPENT_RESPONSE "2.16.840.1.113719.1.27.101.2" +#define LDAP_CONTROL_DUPENT_ENTRY "2.16.840.1.113719.1.27.101.3" +#define LDAP_CONTROL_DUPENT LDAP_CONTROL_DUPENT_REQUEST + +/* LDAP Persistent Search Control *//* not implemented in slapd(8) */ +#define LDAP_CONTROL_PERSIST_REQUEST "2.16.840.1.113730.3.4.3" +#define LDAP_CONTROL_PERSIST_ENTRY_CHANGE_NOTICE "2.16.840.1.113730.3.4.7" +#define LDAP_CONTROL_PERSIST_ENTRY_CHANGE_ADD 0x1 +#define LDAP_CONTROL_PERSIST_ENTRY_CHANGE_DELETE 0x2 +#define LDAP_CONTROL_PERSIST_ENTRY_CHANGE_MODIFY 0x4 +#define LDAP_CONTROL_PERSIST_ENTRY_CHANGE_RENAME 0x8 + +/* LDAP VLV */ +#define LDAP_CONTROL_VLVREQUEST "2.16.840.1.113730.3.4.9" +#define LDAP_CONTROL_VLVRESPONSE "2.16.840.1.113730.3.4.10" + +/* LDAP Unsolicited Notifications */ +#define LDAP_NOTICE_OF_DISCONNECTION "1.3.6.1.4.1.1466.20036" /* RFC 4511 */ +#define LDAP_NOTICE_DISCONNECT LDAP_NOTICE_OF_DISCONNECTION + +/* LDAP Extended Operations */ +#define LDAP_EXOP_START_TLS "1.3.6.1.4.1.1466.20037" /* RFC 4511 */ + +#define LDAP_EXOP_MODIFY_PASSWD "1.3.6.1.4.1.4203.1.11.1" /* RFC 3062 */ +#define LDAP_TAG_EXOP_MODIFY_PASSWD_ID ((ber_tag_t) 0x80U) +#define LDAP_TAG_EXOP_MODIFY_PASSWD_OLD ((ber_tag_t) 0x81U) +#define LDAP_TAG_EXOP_MODIFY_PASSWD_NEW ((ber_tag_t) 0x82U) +#define LDAP_TAG_EXOP_MODIFY_PASSWD_GEN ((ber_tag_t) 0x80U) + +#define LDAP_EXOP_CANCEL "1.3.6.1.1.8" /* RFC 3909 */ +#define LDAP_EXOP_X_CANCEL LDAP_EXOP_CANCEL + +#define LDAP_EXOP_REFRESH "1.3.6.1.4.1.1466.101.119.1" /* RFC 2589 */ +#define LDAP_TAG_EXOP_REFRESH_REQ_DN ((ber_tag_t) 0x80U) +#define LDAP_TAG_EXOP_REFRESH_REQ_TTL ((ber_tag_t) 0x81U) +#define LDAP_TAG_EXOP_REFRESH_RES_TTL ((ber_tag_t) 0x81U) + +#define LDAP_EXOP_WHO_AM_I "1.3.6.1.4.1.4203.1.11.3" /* RFC 4532 */ +#define LDAP_EXOP_X_WHO_AM_I LDAP_EXOP_WHO_AM_I + +/* various works in progress */ +#define LDAP_EXOP_TURN "1.3.6.1.1.19" /* RFC 4531 */ +#define LDAP_EXOP_X_TURN LDAP_EXOP_TURN + +/* LDAP Distributed Procedures */ +/* a work in progress */ +#define LDAP_X_DISTPROC_BASE "1.3.6.1.4.1.4203.666.11.6" +#define LDAP_EXOP_X_CHAINEDREQUEST LDAP_X_DISTPROC_BASE ".1" +#define LDAP_FEATURE_X_CANCHAINOPS LDAP_X_DISTPROC_BASE ".2" +#define LDAP_CONTROL_X_RETURNCONTREF LDAP_X_DISTPROC_BASE ".3" +#define LDAP_URLEXT_X_LOCALREFOID LDAP_X_DISTPROC_BASE ".4" +#define LDAP_URLEXT_X_REFTYPEOID LDAP_X_DISTPROC_BASE ".5" +#define LDAP_URLEXT_X_SEARCHEDSUBTREEOID \ + LDAP_X_DISTPROC_BASE ".6" +#define LDAP_URLEXT_X_FAILEDNAMEOID LDAP_X_DISTPROC_BASE ".7" +#define LDAP_URLEXT_X_LOCALREF "x-localReference" +#define LDAP_URLEXT_X_REFTYPE "x-referenceType" +#define LDAP_URLEXT_X_SEARCHEDSUBTREE "x-searchedSubtree" +#define LDAP_URLEXT_X_FAILEDNAME "x-failedName" + +#ifdef LDAP_DEVEL +#define LDAP_X_TXN "1.3.6.1.4.1.4203.666.11.7" /* tmp */ +#define LDAP_EXOP_X_TXN_START LDAP_X_TXN ".1" +#define LDAP_CONTROL_X_TXN_SPEC LDAP_X_TXN ".2" +#define LDAP_EXOP_X_TXN_END LDAP_X_TXN ".3" +#define LDAP_EXOP_X_TXN_ABORTED_NOTICE LDAP_X_TXN ".4" +#endif + +/* LDAP Features */ +#define LDAP_FEATURE_ALL_OP_ATTRS "1.3.6.1.4.1.4203.1.5.1" /* RFC 3673 */ +#define LDAP_FEATURE_OBJECTCLASS_ATTRS \ + "1.3.6.1.4.1.4203.1.5.2" /* @objectClass - new number to be assigned */ +#define LDAP_FEATURE_ABSOLUTE_FILTERS "1.3.6.1.4.1.4203.1.5.3" /* (&) (|) */ +#define LDAP_FEATURE_LANGUAGE_TAG_OPTIONS "1.3.6.1.4.1.4203.1.5.4" +#define LDAP_FEATURE_LANGUAGE_RANGE_OPTIONS "1.3.6.1.4.1.4203.1.5.5" +#define LDAP_FEATURE_MODIFY_INCREMENT "1.3.6.1.1.14" + +/* LDAP Experimental (works in progress) Features */ +#define LDAP_FEATURE_SUBORDINATE_SCOPE \ + "1.3.6.1.4.1.4203.666.8.1" /* "children" */ +#define LDAP_FEATURE_CHILDREN_SCOPE LDAP_FEATURE_SUBORDINATE_SCOPE + +/* + * specific LDAP instantiations of BER types we know about + */ + +/* Overview of LBER tag construction + * + * Bits + * ______ + * 8 7 | CLASS + * 0 0 = UNIVERSAL + * 0 1 = APPLICATION + * 1 0 = CONTEXT-SPECIFIC + * 1 1 = PRIVATE + * _____ + * | 6 | DATA-TYPE + * 0 = PRIMITIVE + * 1 = CONSTRUCTED + * ___________ + * | 5 ... 1 | TAG-NUMBER + */ + +/* general stuff */ +#define LDAP_TAG_MESSAGE ((ber_tag_t) 0x30U) /* constructed + 16 */ +#define LDAP_TAG_MSGID ((ber_tag_t) 0x02U) /* integer */ + +#define LDAP_TAG_LDAPDN ((ber_tag_t) 0x04U) /* octet string */ +#define LDAP_TAG_LDAPCRED ((ber_tag_t) 0x04U) /* octet string */ + +#define LDAP_TAG_CONTROLS ((ber_tag_t) 0xa0U) /* context specific + constructed + 0 */ +#define LDAP_TAG_REFERRAL ((ber_tag_t) 0xa3U) /* context specific + constructed + 3 */ + +#define LDAP_TAG_NEWSUPERIOR ((ber_tag_t) 0x80U) /* context-specific + primitive + 0 */ + +#define LDAP_TAG_EXOP_REQ_OID ((ber_tag_t) 0x80U) /* context specific + primitive */ +#define LDAP_TAG_EXOP_REQ_VALUE ((ber_tag_t) 0x81U) /* context specific + primitive */ +#define LDAP_TAG_EXOP_RES_OID ((ber_tag_t) 0x8aU) /* context specific + primitive */ +#define LDAP_TAG_EXOP_RES_VALUE ((ber_tag_t) 0x8bU) /* context specific + primitive */ + +#define LDAP_TAG_IM_RES_OID ((ber_tag_t) 0x80U) /* context specific + primitive */ +#define LDAP_TAG_IM_RES_VALUE ((ber_tag_t) 0x81U) /* context specific + primitive */ + +#define LDAP_TAG_SASL_RES_CREDS ((ber_tag_t) 0x87U) /* context specific + primitive */ + +/* LDAP Request Messages */ +#define LDAP_REQ_BIND ((ber_tag_t) 0x60U) /* application + constructed */ +#define LDAP_REQ_UNBIND ((ber_tag_t) 0x42U) /* application + primitive */ +#define LDAP_REQ_SEARCH ((ber_tag_t) 0x63U) /* application + constructed */ +#define LDAP_REQ_MODIFY ((ber_tag_t) 0x66U) /* application + constructed */ +#define LDAP_REQ_ADD ((ber_tag_t) 0x68U) /* application + constructed */ +#define LDAP_REQ_DELETE ((ber_tag_t) 0x4aU) /* application + primitive */ +#define LDAP_REQ_MODDN ((ber_tag_t) 0x6cU) /* application + constructed */ +#define LDAP_REQ_MODRDN LDAP_REQ_MODDN +#define LDAP_REQ_RENAME LDAP_REQ_MODDN +#define LDAP_REQ_COMPARE ((ber_tag_t) 0x6eU) /* application + constructed */ +#define LDAP_REQ_ABANDON ((ber_tag_t) 0x50U) /* application + primitive */ +#define LDAP_REQ_EXTENDED ((ber_tag_t) 0x77U) /* application + constructed */ + +/* LDAP Response Messages */ +#define LDAP_RES_BIND ((ber_tag_t) 0x61U) /* application + constructed */ +#define LDAP_RES_SEARCH_ENTRY ((ber_tag_t) 0x64U) /* application + constructed */ +#define LDAP_RES_SEARCH_REFERENCE ((ber_tag_t) 0x73U) /* V3: application + constructed */ +#define LDAP_RES_SEARCH_RESULT ((ber_tag_t) 0x65U) /* application + constructed */ +#define LDAP_RES_MODIFY ((ber_tag_t) 0x67U) /* application + constructed */ +#define LDAP_RES_ADD ((ber_tag_t) 0x69U) /* application + constructed */ +#define LDAP_RES_DELETE ((ber_tag_t) 0x6bU) /* application + constructed */ +#define LDAP_RES_MODDN ((ber_tag_t) 0x6dU) /* application + constructed */ +#define LDAP_RES_MODRDN LDAP_RES_MODDN /* application + constructed */ +#define LDAP_RES_RENAME LDAP_RES_MODDN /* application + constructed */ +#define LDAP_RES_COMPARE ((ber_tag_t) 0x6fU) /* application + constructed */ +#define LDAP_RES_EXTENDED ((ber_tag_t) 0x78U) /* V3: application + constructed */ +#define LDAP_RES_INTERMEDIATE ((ber_tag_t) 0x79U) /* V3+: application + constructed */ + +#define LDAP_RES_ANY (-1) +#define LDAP_RES_UNSOLICITED (0) + + +/* sasl methods */ +#define LDAP_SASL_SIMPLE ((char*)0) +#define LDAP_SASL_NULL ("") + + +/* authentication methods available */ +#define LDAP_AUTH_NONE ((ber_tag_t) 0x00U) /* no authentication */ +#define LDAP_AUTH_SIMPLE ((ber_tag_t) 0x80U) /* context specific + primitive */ +#define LDAP_AUTH_SASL ((ber_tag_t) 0xa3U) /* context specific + constructed */ +#define LDAP_AUTH_KRBV4 ((ber_tag_t) 0xffU) /* means do both of the following */ +#define LDAP_AUTH_KRBV41 ((ber_tag_t) 0x81U) /* context specific + primitive */ +#define LDAP_AUTH_KRBV42 ((ber_tag_t) 0x82U) /* context specific + primitive */ + +/* used by the Windows API but not used on the wire */ +#define LDAP_AUTH_NEGOTIATE ((ber_tag_t) 0x04FFU) + +/* filter types */ +#define LDAP_FILTER_AND ((ber_tag_t) 0xa0U) /* context specific + constructed */ +#define LDAP_FILTER_OR ((ber_tag_t) 0xa1U) /* context specific + constructed */ +#define LDAP_FILTER_NOT ((ber_tag_t) 0xa2U) /* context specific + constructed */ +#define LDAP_FILTER_EQUALITY ((ber_tag_t) 0xa3U) /* context specific + constructed */ +#define LDAP_FILTER_SUBSTRINGS ((ber_tag_t) 0xa4U) /* context specific + constructed */ +#define LDAP_FILTER_GE ((ber_tag_t) 0xa5U) /* context specific + constructed */ +#define LDAP_FILTER_LE ((ber_tag_t) 0xa6U) /* context specific + constructed */ +#define LDAP_FILTER_PRESENT ((ber_tag_t) 0x87U) /* context specific + primitive */ +#define LDAP_FILTER_APPROX ((ber_tag_t) 0xa8U) /* context specific + constructed */ +#define LDAP_FILTER_EXT ((ber_tag_t) 0xa9U) /* context specific + constructed */ + +/* extended filter component types */ +#define LDAP_FILTER_EXT_OID ((ber_tag_t) 0x81U) /* context specific */ +#define LDAP_FILTER_EXT_TYPE ((ber_tag_t) 0x82U) /* context specific */ +#define LDAP_FILTER_EXT_VALUE ((ber_tag_t) 0x83U) /* context specific */ +#define LDAP_FILTER_EXT_DNATTRS ((ber_tag_t) 0x84U) /* context specific */ + +/* substring filter component types */ +#define LDAP_SUBSTRING_INITIAL ((ber_tag_t) 0x80U) /* context specific */ +#define LDAP_SUBSTRING_ANY ((ber_tag_t) 0x81U) /* context specific */ +#define LDAP_SUBSTRING_FINAL ((ber_tag_t) 0x82U) /* context specific */ + +/* search scopes */ +#define LDAP_SCOPE_BASE ((ber_int_t) 0x0000) +#define LDAP_SCOPE_BASEOBJECT LDAP_SCOPE_BASE +#define LDAP_SCOPE_ONELEVEL ((ber_int_t) 0x0001) +#define LDAP_SCOPE_ONE LDAP_SCOPE_ONELEVEL +#define LDAP_SCOPE_SUBTREE ((ber_int_t) 0x0002) +#define LDAP_SCOPE_SUB LDAP_SCOPE_SUBTREE +#define LDAP_SCOPE_SUBORDINATE ((ber_int_t) 0x0003) /* OpenLDAP extension */ +#define LDAP_SCOPE_CHILDREN LDAP_SCOPE_SUBORDINATE +#define LDAP_SCOPE_DEFAULT ((ber_int_t) -1) /* OpenLDAP extension */ + +/* substring filter component types */ +#define LDAP_SUBSTRING_INITIAL ((ber_tag_t) 0x80U) /* context specific */ +#define LDAP_SUBSTRING_ANY ((ber_tag_t) 0x81U) /* context specific */ +#define LDAP_SUBSTRING_FINAL ((ber_tag_t) 0x82U) /* context specific */ + +/* + * LDAP Result Codes + */ +#define LDAP_SUCCESS 0x00 + +#define LDAP_RANGE(n,x,y) (((x) <= (n)) && ((n) <= (y))) + +#define LDAP_OPERATIONS_ERROR 0x01 +#define LDAP_PROTOCOL_ERROR 0x02 +#define LDAP_TIMELIMIT_EXCEEDED 0x03 +#define LDAP_SIZELIMIT_EXCEEDED 0x04 +#define LDAP_COMPARE_FALSE 0x05 +#define LDAP_COMPARE_TRUE 0x06 +#define LDAP_AUTH_METHOD_NOT_SUPPORTED 0x07 +#define LDAP_STRONG_AUTH_NOT_SUPPORTED LDAP_AUTH_METHOD_NOT_SUPPORTED +#define LDAP_STRONG_AUTH_REQUIRED 0x08 +#define LDAP_STRONGER_AUTH_REQUIRED LDAP_STRONG_AUTH_REQUIRED +#define LDAP_PARTIAL_RESULTS 0x09 /* LDAPv2+ (not LDAPv3) */ + +#define LDAP_REFERRAL 0x0a /* LDAPv3 */ +#define LDAP_ADMINLIMIT_EXCEEDED 0x0b /* LDAPv3 */ +#define LDAP_UNAVAILABLE_CRITICAL_EXTENSION 0x0c /* LDAPv3 */ +#define LDAP_CONFIDENTIALITY_REQUIRED 0x0d /* LDAPv3 */ +#define LDAP_SASL_BIND_IN_PROGRESS 0x0e /* LDAPv3 */ + +#define LDAP_ATTR_ERROR(n) LDAP_RANGE((n),0x10,0x15) /* 16-21 */ + +#define LDAP_NO_SUCH_ATTRIBUTE 0x10 +#define LDAP_UNDEFINED_TYPE 0x11 +#define LDAP_INAPPROPRIATE_MATCHING 0x12 +#define LDAP_CONSTRAINT_VIOLATION 0x13 +#define LDAP_TYPE_OR_VALUE_EXISTS 0x14 +#define LDAP_INVALID_SYNTAX 0x15 + +#define LDAP_NAME_ERROR(n) LDAP_RANGE((n),0x20,0x24) /* 32-34,36 */ + +#define LDAP_NO_SUCH_OBJECT 0x20 +#define LDAP_ALIAS_PROBLEM 0x21 +#define LDAP_INVALID_DN_SYNTAX 0x22 +#define LDAP_IS_LEAF 0x23 /* not LDAPv3 */ +#define LDAP_ALIAS_DEREF_PROBLEM 0x24 + +#define LDAP_SECURITY_ERROR(n) LDAP_RANGE((n),0x2F,0x32) /* 47-50 */ + +#define LDAP_X_PROXY_AUTHZ_FAILURE 0x2F /* LDAPv3 proxy authorization */ +#define LDAP_INAPPROPRIATE_AUTH 0x30 +#define LDAP_INVALID_CREDENTIALS 0x31 +#define LDAP_INSUFFICIENT_ACCESS 0x32 + +#define LDAP_SERVICE_ERROR(n) LDAP_RANGE((n),0x33,0x36) /* 51-54 */ + +#define LDAP_BUSY 0x33 +#define LDAP_UNAVAILABLE 0x34 +#define LDAP_UNWILLING_TO_PERFORM 0x35 +#define LDAP_LOOP_DETECT 0x36 + +#define LDAP_UPDATE_ERROR(n) LDAP_RANGE((n),0x40,0x47) /* 64-69,71 */ + +#define LDAP_NAMING_VIOLATION 0x40 +#define LDAP_OBJECT_CLASS_VIOLATION 0x41 +#define LDAP_NOT_ALLOWED_ON_NONLEAF 0x42 +#define LDAP_NOT_ALLOWED_ON_RDN 0x43 +#define LDAP_ALREADY_EXISTS 0x44 +#define LDAP_NO_OBJECT_CLASS_MODS 0x45 +#define LDAP_RESULTS_TOO_LARGE 0x46 /* CLDAP */ +#define LDAP_AFFECTS_MULTIPLE_DSAS 0x47 + +#define LDAP_VLV_ERROR 0x4C + +#define LDAP_OTHER 0x50 + +/* LCUP operation codes (113-117) - not implemented */ +#define LDAP_CUP_RESOURCES_EXHAUSTED 0x71 +#define LDAP_CUP_SECURITY_VIOLATION 0x72 +#define LDAP_CUP_INVALID_DATA 0x73 +#define LDAP_CUP_UNSUPPORTED_SCHEME 0x74 +#define LDAP_CUP_RELOAD_REQUIRED 0x75 + +/* Cancel operation codes (118-121) */ +#define LDAP_CANCELLED 0x76 +#define LDAP_NO_SUCH_OPERATION 0x77 +#define LDAP_TOO_LATE 0x78 +#define LDAP_CANNOT_CANCEL 0x79 + +/* Assertion control (122) */ +#define LDAP_ASSERTION_FAILED 0x7A + +/* Proxied Authorization Denied (123) */ +#define LDAP_PROXIED_AUTHORIZATION_DENIED 0x7B + +/* Experimental result codes */ +#define LDAP_E_ERROR(n) LDAP_RANGE((n),0x1000,0x3FFF) + +/* LDAP Sync (4096) */ +#define LDAP_SYNC_REFRESH_REQUIRED 0x1000 + + +/* Private Use result codes */ +#define LDAP_X_ERROR(n) LDAP_RANGE((n),0x4000,0xFFFF) + +#define LDAP_X_SYNC_REFRESH_REQUIRED 0x4100 /* defunct */ +#define LDAP_X_ASSERTION_FAILED 0x410f /* defunct */ + +/* for the LDAP No-Op control */ +#define LDAP_X_NO_OPERATION 0x410e + +/* for the Chaining Behavior control (consecutive result codes requested; + * see ) */ +#ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR +#define LDAP_X_NO_REFERRALS_FOUND 0x4110 +#define LDAP_X_CANNOT_CHAIN 0x4111 +#endif + +/* for Distributed Procedures (see ) */ +#ifdef LDAP_X_DISTPROC_BASE +#define LDAP_X_INVALIDREFERENCE 0x4112 +#endif + +#ifdef LDAP_X_TXN +#define LDAP_X_TXN_SPECIFY_OKAY 0x4120 +#define LDAP_X_TXN_ID_INVALID 0x4121 +#endif + +/* API Error Codes + * + * Based on draft-ietf-ldap-c-api-xx + * but with new negative code values + */ +#define LDAP_API_ERROR(n) ((n)<0) +#define LDAP_API_RESULT(n) ((n)<=0) + +#define LDAP_SERVER_DOWN (-1) +#define LDAP_LOCAL_ERROR (-2) +#define LDAP_ENCODING_ERROR (-3) +#define LDAP_DECODING_ERROR (-4) +#define LDAP_TIMEOUT (-5) +#define LDAP_AUTH_UNKNOWN (-6) +#define LDAP_FILTER_ERROR (-7) +#define LDAP_USER_CANCELLED (-8) +#define LDAP_PARAM_ERROR (-9) +#define LDAP_NO_MEMORY (-10) +#define LDAP_CONNECT_ERROR (-11) +#define LDAP_NOT_SUPPORTED (-12) +#define LDAP_CONTROL_NOT_FOUND (-13) +#define LDAP_NO_RESULTS_RETURNED (-14) +#define LDAP_MORE_RESULTS_TO_RETURN (-15) /* Obsolete */ +#define LDAP_CLIENT_LOOP (-16) +#define LDAP_REFERRAL_LIMIT_EXCEEDED (-17) +#define LDAP_X_CONNECTING (-18) + + +/* + * This structure represents both ldap messages and ldap responses. + * These are really the same, except in the case of search responses, + * where a response has multiple messages. + */ + +typedef struct ldapmsg LDAPMessage; + +/* for modifications */ +typedef struct ldapmod { + int mod_op; + +#define LDAP_MOD_OP (0x0007) +#define LDAP_MOD_ADD (0x0000) +#define LDAP_MOD_DELETE (0x0001) +#define LDAP_MOD_REPLACE (0x0002) +#define LDAP_MOD_INCREMENT (0x0003) /* OpenLDAP extension */ +#define LDAP_MOD_BVALUES (0x0080) +/* IMPORTANT: do not use code 0x1000 (or above), + * it is used internally by the backends! + * (see ldap/servers/slapd/slap.h) + */ + + char *mod_type; + union mod_vals_u { + char **modv_strvals; + struct berval **modv_bvals; + } mod_vals; +#define mod_values mod_vals.modv_strvals +#define mod_bvalues mod_vals.modv_bvals +} LDAPMod; + +/* + * structure representing an ldap session which can + * encompass connections to multiple servers (in the + * face of referrals). + */ +typedef struct ldap LDAP; + +#define LDAP_DEREF_NEVER 0x00 +#define LDAP_DEREF_SEARCHING 0x01 +#define LDAP_DEREF_FINDING 0x02 +#define LDAP_DEREF_ALWAYS 0x03 + +#define LDAP_NO_LIMIT 0 + +/* how many messages to retrieve results for */ +#define LDAP_MSG_ONE 0x00 +#define LDAP_MSG_ALL 0x01 +#define LDAP_MSG_RECEIVED 0x02 + +/* + * types for ldap URL handling + */ +typedef struct ldap_url_desc { + struct ldap_url_desc *lud_next; + char *lud_scheme; + char *lud_host; + int lud_port; + char *lud_dn; + char **lud_attrs; + int lud_scope; + char *lud_filter; + char **lud_exts; + int lud_crit_exts; +} LDAPURLDesc; + +#define LDAP_URL_SUCCESS 0x00 /* Success */ +#define LDAP_URL_ERR_MEM 0x01 /* can't allocate memory space */ +#define LDAP_URL_ERR_PARAM 0x02 /* parameter is bad */ + +#define LDAP_URL_ERR_BADSCHEME 0x03 /* URL doesn't begin with "ldap[si]://" */ +#define LDAP_URL_ERR_BADENCLOSURE 0x04 /* URL is missing trailing ">" */ +#define LDAP_URL_ERR_BADURL 0x05 /* URL is bad */ +#define LDAP_URL_ERR_BADHOST 0x06 /* host port is bad */ +#define LDAP_URL_ERR_BADATTRS 0x07 /* bad (or missing) attributes */ +#define LDAP_URL_ERR_BADSCOPE 0x08 /* scope string is invalid (or missing) */ +#define LDAP_URL_ERR_BADFILTER 0x09 /* bad or missing filter */ +#define LDAP_URL_ERR_BADEXTS 0x0a /* bad or missing extensions */ + +/* + * LDAP sync (RFC4533) API + */ + +typedef struct ldap_sync_t ldap_sync_t; + +typedef enum { + /* these are private - the client should never see them */ + LDAP_SYNC_CAPI_NONE = -1, + + LDAP_SYNC_CAPI_PHASE_FLAG = 0x10U, + LDAP_SYNC_CAPI_IDSET_FLAG = 0x20U, + LDAP_SYNC_CAPI_DONE_FLAG = 0x40U, + + /* these are passed to ls_search_entry() */ + LDAP_SYNC_CAPI_PRESENT = LDAP_SYNC_PRESENT, + LDAP_SYNC_CAPI_ADD = LDAP_SYNC_ADD, + LDAP_SYNC_CAPI_MODIFY = LDAP_SYNC_MODIFY, + LDAP_SYNC_CAPI_DELETE = LDAP_SYNC_DELETE, + + /* these are passed to ls_intermediate() */ + LDAP_SYNC_CAPI_PRESENTS = ( LDAP_SYNC_CAPI_PHASE_FLAG | LDAP_SYNC_CAPI_PRESENT ), + LDAP_SYNC_CAPI_DELETES = ( LDAP_SYNC_CAPI_PHASE_FLAG | LDAP_SYNC_CAPI_DELETE ), + + LDAP_SYNC_CAPI_PRESENTS_IDSET = ( LDAP_SYNC_CAPI_PRESENTS | LDAP_SYNC_CAPI_IDSET_FLAG ), + LDAP_SYNC_CAPI_DELETES_IDSET = ( LDAP_SYNC_CAPI_DELETES | LDAP_SYNC_CAPI_IDSET_FLAG ), + + LDAP_SYNC_CAPI_DONE = ( LDAP_SYNC_CAPI_DONE_FLAG | LDAP_SYNC_CAPI_PRESENTS ) +} ldap_sync_refresh_t; + +/* + * Called when an entry is returned by ldap_result(). + * If phase is LDAP_SYNC_CAPI_ADD or LDAP_SYNC_CAPI_MODIFY, + * the entry has been either added or modified, and thus + * the complete view of the entry should be in the LDAPMessage. + * If phase is LDAP_SYNC_CAPI_PRESENT or LDAP_SYNC_CAPI_DELETE, + * only the DN should be in the LDAPMessage. + */ +typedef int (*ldap_sync_search_entry_f) LDAP_P(( + ldap_sync_t *ls, + LDAPMessage *msg, + struct berval *entryUUID, + ldap_sync_refresh_t phase )); + +/* + * Called when a reference is returned; the client should know + * what to do with it. + */ +typedef int (*ldap_sync_search_reference_f) LDAP_P(( + ldap_sync_t *ls, + LDAPMessage *msg )); + +/* + * Called when specific intermediate/final messages are returned. + * If phase is LDAP_SYNC_CAPI_PRESENTS or LDAP_SYNC_CAPI_DELETES, + * a "presents" or "deletes" phase begins. + * If phase is LDAP_SYNC_CAPI_DONE, a special "presents" phase + * with refreshDone set to "TRUE" has been returned, to indicate + * that the refresh phase of a refreshAndPersist is complete. + * In the above cases, syncUUIDs is NULL. + * + * If phase is LDAP_SYNC_CAPI_PRESENTS_IDSET or + * LDAP_SYNC_CAPI_DELETES_IDSET, syncUUIDs is an array of UUIDs + * that are either present or have been deleted. + */ +typedef int (*ldap_sync_intermediate_f) LDAP_P(( + ldap_sync_t *ls, + LDAPMessage *msg, + BerVarray syncUUIDs, + ldap_sync_refresh_t phase )); + +/* + * Called when a searchResultDone is returned. In refreshAndPersist, + * this can only occur if the search for any reason is being terminated + * by the server. + */ +typedef int (*ldap_sync_search_result_f) LDAP_P(( + ldap_sync_t *ls, + LDAPMessage *msg, + int refreshDeletes )); + +/* + * This structure contains all information about the persistent search; + * the caller is responsible for connecting, setting version, binding, tls... + */ +struct ldap_sync_t { + /* conf search params */ + char *ls_base; + int ls_scope; + char *ls_filter; + char **ls_attrs; + int ls_timelimit; + int ls_sizelimit; + + /* poll timeout */ + int ls_timeout; + + /* helpers - add as appropriate */ + ldap_sync_search_entry_f ls_search_entry; + ldap_sync_search_reference_f ls_search_reference; + ldap_sync_intermediate_f ls_intermediate; + ldap_sync_search_result_f ls_search_result; + + /* set by the caller as appropriate */ + void *ls_private; + + /* conn stuff */ + LDAP *ls_ld; + + /* --- the parameters below are private - do not modify --- */ + + /* FIXME: make the structure opaque, and provide an interface + * to modify the public values? */ + + /* result stuff */ + int ls_msgid; + + /* sync stuff */ + /* needed by refreshOnly */ + int ls_reloadHint; + + /* opaque - need to pass between sessions, updated by the API */ + struct berval ls_cookie; + + /* state variable - do not modify */ + ldap_sync_refresh_t ls_refreshPhase; +}; + +/* + * End of LDAP sync (RFC4533) API + */ + +/* + * Connection callbacks... + */ +struct ldap_conncb; +struct sockaddr; + +/* Called after a connection is established */ +typedef int (ldap_conn_add_f) LDAP_P(( LDAP *ld, Sockbuf *sb, LDAPURLDesc *srv, struct sockaddr *addr, + struct ldap_conncb *ctx )); +/* Called before a connection is closed */ +typedef void (ldap_conn_del_f) LDAP_P(( LDAP *ld, Sockbuf *sb, struct ldap_conncb *ctx )); + +/* Callbacks are pushed on a stack. Last one pushed is first one executed. The + * delete callback is called with a NULL Sockbuf just before freeing the LDAP handle. + */ +typedef struct ldap_conncb { + ldap_conn_add_f *lc_add; + ldap_conn_del_f *lc_del; + void *lc_arg; +} ldap_conncb; + +/* + * The API draft spec says we should declare (or cause to be declared) + * 'struct timeval'. We don't. See IETF LDAPext discussions. + */ +struct timeval; + +/* + * in options.c: + */ +LDAP_F( int ) +ldap_get_option LDAP_P(( + LDAP *ld, + int option, + void *outvalue)); + +LDAP_F( int ) +ldap_set_option LDAP_P(( + LDAP *ld, + int option, + LDAP_CONST void *invalue)); + +/* V3 REBIND Function Callback Prototype */ +typedef int (LDAP_REBIND_PROC) LDAP_P(( + LDAP *ld, LDAP_CONST char *url, + ber_tag_t request, ber_int_t msgid, + void *params )); + +LDAP_F( int ) +ldap_set_rebind_proc LDAP_P(( + LDAP *ld, + LDAP_REBIND_PROC *rebind_proc, + void *params )); + +/* V3 referral selection Function Callback Prototype */ +typedef int (LDAP_NEXTREF_PROC) LDAP_P(( + LDAP *ld, char ***refsp, int *cntp, + void *params )); + +LDAP_F( int ) +ldap_set_nextref_proc LDAP_P(( + LDAP *ld, + LDAP_NEXTREF_PROC *nextref_proc, + void *params )); + +/* V3 URLLIST Function Callback Prototype */ +typedef int (LDAP_URLLIST_PROC) LDAP_P(( + LDAP *ld, + LDAPURLDesc **urllist, + LDAPURLDesc **url, + void *params )); + +LDAP_F( int ) +ldap_set_urllist_proc LDAP_P(( + LDAP *ld, + LDAP_URLLIST_PROC *urllist_proc, + void *params )); + +/* + * in controls.c: + */ +#if LDAP_DEPRECATED +LDAP_F( int ) +ldap_create_control LDAP_P(( /* deprecated, use ldap_control_create */ + LDAP_CONST char *requestOID, + BerElement *ber, + int iscritical, + LDAPControl **ctrlp )); + +LDAP_F( LDAPControl * ) +ldap_find_control LDAP_P(( /* deprecated, use ldap_control_find */ + LDAP_CONST char *oid, + LDAPControl **ctrls )); +#endif + +LDAP_F( int ) +ldap_control_create LDAP_P(( + LDAP_CONST char *requestOID, + int iscritical, + struct berval *value, + int dupval, + LDAPControl **ctrlp )); + +LDAP_F( LDAPControl * ) +ldap_control_find LDAP_P(( + LDAP_CONST char *oid, + LDAPControl **ctrls, + LDAPControl ***nextctrlp )); + +LDAP_F( void ) +ldap_control_free LDAP_P(( + LDAPControl *ctrl )); + +LDAP_F( void ) +ldap_controls_free LDAP_P(( + LDAPControl **ctrls )); + +LDAP_F( LDAPControl ** ) +ldap_controls_dup LDAP_P(( + LDAPControl *LDAP_CONST *controls )); + +LDAP_F( LDAPControl * ) +ldap_control_dup LDAP_P(( + LDAP_CONST LDAPControl *c )); + +/* + * in dnssrv.c: + */ +LDAP_F( int ) +ldap_domain2dn LDAP_P(( + LDAP_CONST char* domain, + char** dn )); + +LDAP_F( int ) +ldap_dn2domain LDAP_P(( + LDAP_CONST char* dn, + char** domain )); + +LDAP_F( int ) +ldap_domain2hostlist LDAP_P(( + LDAP_CONST char *domain, + char** hostlist )); + +/* + * in extended.c: + */ +LDAP_F( int ) +ldap_extended_operation LDAP_P(( + LDAP *ld, + LDAP_CONST char *reqoid, + struct berval *reqdata, + LDAPControl **serverctrls, + LDAPControl **clientctrls, + int *msgidp )); + +LDAP_F( int ) +ldap_extended_operation_s LDAP_P(( + LDAP *ld, + LDAP_CONST char *reqoid, + struct berval *reqdata, + LDAPControl **serverctrls, + LDAPControl **clientctrls, + char **retoidp, + struct berval **retdatap )); + +LDAP_F( int ) +ldap_parse_extended_result LDAP_P(( + LDAP *ld, + LDAPMessage *res, + char **retoidp, + struct berval **retdatap, + int freeit )); + +LDAP_F( int ) +ldap_parse_intermediate LDAP_P(( + LDAP *ld, + LDAPMessage *res, + char **retoidp, + struct berval **retdatap, + LDAPControl ***serverctrls, + int freeit )); + + +/* + * in abandon.c: + */ +LDAP_F( int ) +ldap_abandon_ext LDAP_P(( + LDAP *ld, + int msgid, + LDAPControl **serverctrls, + LDAPControl **clientctrls )); + +#if LDAP_DEPRECATED +LDAP_F( int ) +ldap_abandon LDAP_P(( /* deprecated, use ldap_abandon_ext */ + LDAP *ld, + int msgid )); +#endif + +/* + * in add.c: + */ +LDAP_F( int ) +ldap_add_ext LDAP_P(( + LDAP *ld, + LDAP_CONST char *dn, + LDAPMod **attrs, + LDAPControl **serverctrls, + LDAPControl **clientctrls, + int *msgidp )); + +LDAP_F( int ) +ldap_add_ext_s LDAP_P(( + LDAP *ld, + LDAP_CONST char *dn, + LDAPMod **attrs, + LDAPControl **serverctrls, + LDAPControl **clientctrls )); + +#if LDAP_DEPRECATED +LDAP_F( int ) +ldap_add LDAP_P(( /* deprecated, use ldap_add_ext */ + LDAP *ld, + LDAP_CONST char *dn, + LDAPMod **attrs )); + +LDAP_F( int ) +ldap_add_s LDAP_P(( /* deprecated, use ldap_add_ext_s */ + LDAP *ld, + LDAP_CONST char *dn, + LDAPMod **attrs )); +#endif + + +/* + * in sasl.c: + */ +LDAP_F( int ) +ldap_sasl_bind LDAP_P(( + LDAP *ld, + LDAP_CONST char *dn, + LDAP_CONST char *mechanism, + struct berval *cred, + LDAPControl **serverctrls, + LDAPControl **clientctrls, + int *msgidp )); + +/* Interaction flags (should be passed about in a control) + * Automatic (default): use defaults, prompt otherwise + * Interactive: prompt always + * Quiet: never prompt + */ +#define LDAP_SASL_AUTOMATIC 0U +#define LDAP_SASL_INTERACTIVE 1U +#define LDAP_SASL_QUIET 2U + +/* + * V3 SASL Interaction Function Callback Prototype + * when using Cyrus SASL, interact is pointer to sasl_interact_t + * should likely passed in a control (and provided controls) + */ +typedef int (LDAP_SASL_INTERACT_PROC) LDAP_P(( + LDAP *ld, unsigned flags, void* defaults, void *interact )); + +LDAP_F( int ) +ldap_sasl_interactive_bind LDAP_P(( + LDAP *ld, + LDAP_CONST char *dn, /* usually NULL */ + LDAP_CONST char *saslMechanism, + LDAPControl **serverControls, + LDAPControl **clientControls, + + /* should be client controls */ + unsigned flags, + LDAP_SASL_INTERACT_PROC *proc, + void *defaults, + + /* as obtained from ldap_result() */ + LDAPMessage *result, + + /* returned during bind processing */ + const char **rmech, + int *msgid )); + +LDAP_F( int ) +ldap_sasl_interactive_bind_s LDAP_P(( + LDAP *ld, + LDAP_CONST char *dn, /* usually NULL */ + LDAP_CONST char *saslMechanism, + LDAPControl **serverControls, + LDAPControl **clientControls, + + /* should be client controls */ + unsigned flags, + LDAP_SASL_INTERACT_PROC *proc, + void *defaults )); + +LDAP_F( int ) +ldap_sasl_bind_s LDAP_P(( + LDAP *ld, + LDAP_CONST char *dn, + LDAP_CONST char *mechanism, + struct berval *cred, + LDAPControl **serverctrls, + LDAPControl **clientctrls, + struct berval **servercredp )); + +LDAP_F( int ) +ldap_parse_sasl_bind_result LDAP_P(( + LDAP *ld, + LDAPMessage *res, + struct berval **servercredp, + int freeit )); + +#if LDAP_DEPRECATED +/* + * in bind.c: + * (deprecated) + */ +LDAP_F( int ) +ldap_bind LDAP_P(( /* deprecated, use ldap_sasl_bind */ + LDAP *ld, + LDAP_CONST char *who, + LDAP_CONST char *passwd, + int authmethod )); + +LDAP_F( int ) +ldap_bind_s LDAP_P(( /* deprecated, use ldap_sasl_bind_s */ + LDAP *ld, + LDAP_CONST char *who, + LDAP_CONST char *cred, + int authmethod )); + +/* + * in sbind.c: + */ +LDAP_F( int ) +ldap_simple_bind LDAP_P(( /* deprecated, use ldap_sasl_bind */ + LDAP *ld, + LDAP_CONST char *who, + LDAP_CONST char *passwd )); + +LDAP_F( int ) +ldap_simple_bind_s LDAP_P(( /* deprecated, use ldap_sasl_bind_s */ + LDAP *ld, + LDAP_CONST char *who, + LDAP_CONST char *passwd )); + +#endif + + +/* + * in compare.c: + */ +LDAP_F( int ) +ldap_compare_ext LDAP_P(( + LDAP *ld, + LDAP_CONST char *dn, + LDAP_CONST char *attr, + struct berval *bvalue, + LDAPControl **serverctrls, + LDAPControl **clientctrls, + int *msgidp )); + +LDAP_F( int ) +ldap_compare_ext_s LDAP_P(( + LDAP *ld, + LDAP_CONST char *dn, + LDAP_CONST char *attr, + struct berval *bvalue, + LDAPControl **serverctrls, + LDAPControl **clientctrls )); + +#if LDAP_DEPRECATED +LDAP_F( int ) +ldap_compare LDAP_P(( /* deprecated, use ldap_compare_ext */ + LDAP *ld, + LDAP_CONST char *dn, + LDAP_CONST char *attr, + LDAP_CONST char *value )); + +LDAP_F( int ) +ldap_compare_s LDAP_P(( /* deprecated, use ldap_compare_ext_s */ + LDAP *ld, + LDAP_CONST char *dn, + LDAP_CONST char *attr, + LDAP_CONST char *value )); +#endif + + +/* + * in delete.c: + */ +LDAP_F( int ) +ldap_delete_ext LDAP_P(( + LDAP *ld, + LDAP_CONST char *dn, + LDAPControl **serverctrls, + LDAPControl **clientctrls, + int *msgidp )); + +LDAP_F( int ) +ldap_delete_ext_s LDAP_P(( + LDAP *ld, + LDAP_CONST char *dn, + LDAPControl **serverctrls, + LDAPControl **clientctrls )); + +#if LDAP_DEPRECATED +LDAP_F( int ) +ldap_delete LDAP_P(( /* deprecated, use ldap_delete_ext */ + LDAP *ld, + LDAP_CONST char *dn )); + +LDAP_F( int ) +ldap_delete_s LDAP_P(( /* deprecated, use ldap_delete_ext_s */ + LDAP *ld, + LDAP_CONST char *dn )); +#endif + + +/* + * in error.c: + */ +LDAP_F( int ) +ldap_parse_result LDAP_P(( + LDAP *ld, + LDAPMessage *res, + int *errcodep, + char **matcheddnp, + char **errmsgp, + char ***referralsp, + LDAPControl ***serverctrls, + int freeit )); + +LDAP_F( char * ) +ldap_err2string LDAP_P(( + int err )); + +#if LDAP_DEPRECATED +LDAP_F( int ) +ldap_result2error LDAP_P(( /* deprecated, use ldap_parse_result */ + LDAP *ld, + LDAPMessage *r, + int freeit )); + +LDAP_F( void ) +ldap_perror LDAP_P(( /* deprecated, use ldap_err2string */ + LDAP *ld, + LDAP_CONST char *s )); +#endif + + +/* + * gssapi.c: + */ +LDAP_F( int ) +ldap_gssapi_bind LDAP_P(( + LDAP *ld, + LDAP_CONST char *dn, + LDAP_CONST char *creds )); + +LDAP_F( int ) +ldap_gssapi_bind_s LDAP_P(( + LDAP *ld, + LDAP_CONST char *dn, + LDAP_CONST char *creds )); + + +/* + * in modify.c: + */ +LDAP_F( int ) +ldap_modify_ext LDAP_P(( + LDAP *ld, + LDAP_CONST char *dn, + LDAPMod **mods, + LDAPControl **serverctrls, + LDAPControl **clientctrls, + int *msgidp )); + +LDAP_F( int ) +ldap_modify_ext_s LDAP_P(( + LDAP *ld, + LDAP_CONST char *dn, + LDAPMod **mods, + LDAPControl **serverctrls, + LDAPControl **clientctrls )); + +#if LDAP_DEPRECATED +LDAP_F( int ) +ldap_modify LDAP_P(( /* deprecated, use ldap_modify_ext */ + LDAP *ld, + LDAP_CONST char *dn, + LDAPMod **mods )); + +LDAP_F( int ) +ldap_modify_s LDAP_P(( /* deprecated, use ldap_modify_ext_s */ + LDAP *ld, + LDAP_CONST char *dn, + LDAPMod **mods )); +#endif + + +/* + * in modrdn.c: + */ +LDAP_F( int ) +ldap_rename LDAP_P(( + LDAP *ld, + LDAP_CONST char *dn, + LDAP_CONST char *newrdn, + LDAP_CONST char *newSuperior, + int deleteoldrdn, + LDAPControl **sctrls, + LDAPControl **cctrls, + int *msgidp )); + +LDAP_F( int ) +ldap_rename_s LDAP_P(( + LDAP *ld, + LDAP_CONST char *dn, + LDAP_CONST char *newrdn, + LDAP_CONST char *newSuperior, + int deleteoldrdn, + LDAPControl **sctrls, + LDAPControl **cctrls )); + +#if LDAP_DEPRECATED +LDAP_F( int ) +ldap_rename2 LDAP_P(( /* deprecated, use ldap_rename */ + LDAP *ld, + LDAP_CONST char *dn, + LDAP_CONST char *newrdn, + LDAP_CONST char *newSuperior, + int deleteoldrdn )); + +LDAP_F( int ) +ldap_rename2_s LDAP_P(( /* deprecated, use ldap_rename_s */ + LDAP *ld, + LDAP_CONST char *dn, + LDAP_CONST char *newrdn, + LDAP_CONST char *newSuperior, + int deleteoldrdn )); + +LDAP_F( int ) +ldap_modrdn LDAP_P(( /* deprecated, use ldap_rename */ + LDAP *ld, + LDAP_CONST char *dn, + LDAP_CONST char *newrdn )); + +LDAP_F( int ) +ldap_modrdn_s LDAP_P(( /* deprecated, use ldap_rename_s */ + LDAP *ld, + LDAP_CONST char *dn, + LDAP_CONST char *newrdn )); + +LDAP_F( int ) +ldap_modrdn2 LDAP_P(( /* deprecated, use ldap_rename */ + LDAP *ld, + LDAP_CONST char *dn, + LDAP_CONST char *newrdn, + int deleteoldrdn )); + +LDAP_F( int ) +ldap_modrdn2_s LDAP_P(( /* deprecated, use ldap_rename_s */ + LDAP *ld, + LDAP_CONST char *dn, + LDAP_CONST char *newrdn, + int deleteoldrdn)); +#endif + + +/* + * in open.c: + */ +#if LDAP_DEPRECATED +LDAP_F( LDAP * ) +ldap_init LDAP_P(( /* deprecated, use ldap_create or ldap_initialize */ + LDAP_CONST char *host, + int port )); + +LDAP_F( LDAP * ) +ldap_open LDAP_P(( /* deprecated, use ldap_create or ldap_initialize */ + LDAP_CONST char *host, + int port )); +#endif + +LDAP_F( int ) +ldap_create LDAP_P(( + LDAP **ldp )); + +LDAP_F( int ) +ldap_initialize LDAP_P(( + LDAP **ldp, + LDAP_CONST char *url )); + +LDAP_F( LDAP * ) +ldap_dup LDAP_P(( + LDAP *old )); + +/* + * in tls.c + */ + +LDAP_F( int ) +ldap_tls_inplace LDAP_P(( + LDAP *ld )); + +LDAP_F( int ) +ldap_start_tls LDAP_P(( + LDAP *ld, + LDAPControl **serverctrls, + LDAPControl **clientctrls, + int *msgidp )); + +LDAP_F( int ) +ldap_install_tls LDAP_P(( + LDAP *ld )); + +LDAP_F( int ) +ldap_start_tls_s LDAP_P(( + LDAP *ld, + LDAPControl **serverctrls, + LDAPControl **clientctrls )); + +/* + * in messages.c: + */ +LDAP_F( LDAPMessage * ) +ldap_first_message LDAP_P(( + LDAP *ld, + LDAPMessage *chain )); + +LDAP_F( LDAPMessage * ) +ldap_next_message LDAP_P(( + LDAP *ld, + LDAPMessage *msg )); + +LDAP_F( int ) +ldap_count_messages LDAP_P(( + LDAP *ld, + LDAPMessage *chain )); + +/* + * in references.c: + */ +LDAP_F( LDAPMessage * ) +ldap_first_reference LDAP_P(( + LDAP *ld, + LDAPMessage *chain )); + +LDAP_F( LDAPMessage * ) +ldap_next_reference LDAP_P(( + LDAP *ld, + LDAPMessage *ref )); + +LDAP_F( int ) +ldap_count_references LDAP_P(( + LDAP *ld, + LDAPMessage *chain )); + +LDAP_F( int ) +ldap_parse_reference LDAP_P(( + LDAP *ld, + LDAPMessage *ref, + char ***referralsp, + LDAPControl ***serverctrls, + int freeit)); + + +/* + * in getentry.c: + */ +LDAP_F( LDAPMessage * ) +ldap_first_entry LDAP_P(( + LDAP *ld, + LDAPMessage *chain )); + +LDAP_F( LDAPMessage * ) +ldap_next_entry LDAP_P(( + LDAP *ld, + LDAPMessage *entry )); + +LDAP_F( int ) +ldap_count_entries LDAP_P(( + LDAP *ld, + LDAPMessage *chain )); + +LDAP_F( int ) +ldap_get_entry_controls LDAP_P(( + LDAP *ld, + LDAPMessage *entry, + LDAPControl ***serverctrls)); + + +/* + * in addentry.c + */ +LDAP_F( LDAPMessage * ) +ldap_delete_result_entry LDAP_P(( + LDAPMessage **list, + LDAPMessage *e )); + +LDAP_F( void ) +ldap_add_result_entry LDAP_P(( + LDAPMessage **list, + LDAPMessage *e )); + + +/* + * in getdn.c + */ +LDAP_F( char * ) +ldap_get_dn LDAP_P(( + LDAP *ld, + LDAPMessage *entry )); + +typedef struct ldap_ava { + struct berval la_attr; + struct berval la_value; + unsigned la_flags; +#define LDAP_AVA_NULL 0x0000U +#define LDAP_AVA_STRING 0x0001U +#define LDAP_AVA_BINARY 0x0002U +#define LDAP_AVA_NONPRINTABLE 0x0004U +#define LDAP_AVA_FREE_ATTR 0x0010U +#define LDAP_AVA_FREE_VALUE 0x0020U + + void *la_private; +} LDAPAVA; + +typedef LDAPAVA** LDAPRDN; +typedef LDAPRDN* LDAPDN; + +/* DN formats */ +#define LDAP_DN_FORMAT_LDAP 0x0000U +#define LDAP_DN_FORMAT_LDAPV3 0x0010U +#define LDAP_DN_FORMAT_LDAPV2 0x0020U +#define LDAP_DN_FORMAT_DCE 0x0030U +#define LDAP_DN_FORMAT_UFN 0x0040U /* dn2str only */ +#define LDAP_DN_FORMAT_AD_CANONICAL 0x0050U /* dn2str only */ +#define LDAP_DN_FORMAT_LBER 0x00F0U /* for testing only */ +#define LDAP_DN_FORMAT_MASK 0x00F0U + +/* DN flags */ +#define LDAP_DN_PRETTY 0x0100U +#define LDAP_DN_SKIP 0x0200U +#define LDAP_DN_P_NOLEADTRAILSPACES 0x1000U +#define LDAP_DN_P_NOSPACEAFTERRDN 0x2000U +#define LDAP_DN_PEDANTIC 0xF000U + +LDAP_F( void ) ldap_rdnfree LDAP_P(( LDAPRDN rdn )); +LDAP_F( void ) ldap_dnfree LDAP_P(( LDAPDN dn )); + +LDAP_F( int ) +ldap_bv2dn LDAP_P(( + struct berval *bv, + LDAPDN *dn, + unsigned flags )); + +LDAP_F( int ) +ldap_str2dn LDAP_P(( + LDAP_CONST char *str, + LDAPDN *dn, + unsigned flags )); + +LDAP_F( int ) +ldap_dn2bv LDAP_P(( + LDAPDN dn, + struct berval *bv, + unsigned flags )); + +LDAP_F( int ) +ldap_dn2str LDAP_P(( + LDAPDN dn, + char **str, + unsigned flags )); + +LDAP_F( int ) +ldap_bv2rdn LDAP_P(( + struct berval *bv, + LDAPRDN *rdn, + char **next, + unsigned flags )); + +LDAP_F( int ) +ldap_str2rdn LDAP_P(( + LDAP_CONST char *str, + LDAPRDN *rdn, + char **next, + unsigned flags )); + +LDAP_F( int ) +ldap_rdn2bv LDAP_P(( + LDAPRDN rdn, + struct berval *bv, + unsigned flags )); + +LDAP_F( int ) +ldap_rdn2str LDAP_P(( + LDAPRDN rdn, + char **str, + unsigned flags )); + +LDAP_F( int ) +ldap_dn_normalize LDAP_P(( + LDAP_CONST char *in, unsigned iflags, + char **out, unsigned oflags )); + +LDAP_F( char * ) +ldap_dn2ufn LDAP_P(( /* deprecated, use ldap_str2dn/dn2str */ + LDAP_CONST char *dn )); + +LDAP_F( char ** ) +ldap_explode_dn LDAP_P(( /* deprecated, ldap_str2dn */ + LDAP_CONST char *dn, + int notypes )); + +LDAP_F( char ** ) +ldap_explode_rdn LDAP_P(( /* deprecated, ldap_str2rdn */ + LDAP_CONST char *rdn, + int notypes )); + +typedef int LDAPDN_rewrite_func + LDAP_P(( LDAPDN dn, unsigned flags, void *ctx )); + +LDAP_F( int ) +ldap_X509dn2bv LDAP_P(( void *x509_name, struct berval *dn, + LDAPDN_rewrite_func *func, unsigned flags )); + +LDAP_F( char * ) +ldap_dn2dcedn LDAP_P(( /* deprecated, ldap_str2dn/dn2str */ + LDAP_CONST char *dn )); + +LDAP_F( char * ) +ldap_dcedn2dn LDAP_P(( /* deprecated, ldap_str2dn/dn2str */ + LDAP_CONST char *dce )); + +LDAP_F( char * ) +ldap_dn2ad_canonical LDAP_P(( /* deprecated, ldap_str2dn/dn2str */ + LDAP_CONST char *dn )); + +LDAP_F( int ) +ldap_get_dn_ber LDAP_P(( + LDAP *ld, LDAPMessage *e, BerElement **berout, struct berval *dn )); + +LDAP_F( int ) +ldap_get_attribute_ber LDAP_P(( + LDAP *ld, LDAPMessage *e, BerElement *ber, struct berval *attr, + struct berval **vals )); + +/* + * in getattr.c + */ +LDAP_F( char * ) +ldap_first_attribute LDAP_P(( + LDAP *ld, + LDAPMessage *entry, + BerElement **ber )); + +LDAP_F( char * ) +ldap_next_attribute LDAP_P(( + LDAP *ld, + LDAPMessage *entry, + BerElement *ber )); + + +/* + * in getvalues.c + */ +LDAP_F( struct berval ** ) +ldap_get_values_len LDAP_P(( + LDAP *ld, + LDAPMessage *entry, + LDAP_CONST char *target )); + +LDAP_F( int ) +ldap_count_values_len LDAP_P(( + struct berval **vals )); + +LDAP_F( void ) +ldap_value_free_len LDAP_P(( + struct berval **vals )); + +#if LDAP_DEPRECATED +LDAP_F( char ** ) +ldap_get_values LDAP_P(( /* deprecated, use ldap_get_values_len */ + LDAP *ld, + LDAPMessage *entry, + LDAP_CONST char *target )); + +LDAP_F( int ) +ldap_count_values LDAP_P(( /* deprecated, use ldap_count_values_len */ + char **vals )); + +LDAP_F( void ) +ldap_value_free LDAP_P(( /* deprecated, use ldap_value_free_len */ + char **vals )); +#endif + +/* + * in result.c: + */ +LDAP_F( int ) +ldap_result LDAP_P(( + LDAP *ld, + int msgid, + int all, + struct timeval *timeout, + LDAPMessage **result )); + +LDAP_F( int ) +ldap_msgtype LDAP_P(( + LDAPMessage *lm )); + +LDAP_F( int ) +ldap_msgid LDAP_P(( + LDAPMessage *lm )); + +LDAP_F( int ) +ldap_msgfree LDAP_P(( + LDAPMessage *lm )); + +LDAP_F( int ) +ldap_msgdelete LDAP_P(( + LDAP *ld, + int msgid )); + + +/* + * in search.c: + */ +LDAP_F( int ) +ldap_bv2escaped_filter_value LDAP_P(( + struct berval *in, + struct berval *out )); + +LDAP_F( int ) +ldap_search_ext LDAP_P(( + LDAP *ld, + LDAP_CONST char *base, + int scope, + LDAP_CONST char *filter, + char **attrs, + int attrsonly, + LDAPControl **serverctrls, + LDAPControl **clientctrls, + struct timeval *timeout, + int sizelimit, + int *msgidp )); + +LDAP_F( int ) +ldap_search_ext_s LDAP_P(( + LDAP *ld, + LDAP_CONST char *base, + int scope, + LDAP_CONST char *filter, + char **attrs, + int attrsonly, + LDAPControl **serverctrls, + LDAPControl **clientctrls, + struct timeval *timeout, + int sizelimit, + LDAPMessage **res )); + +#if LDAP_DEPRECATED +LDAP_F( int ) +ldap_search LDAP_P(( /* deprecated, use ldap_search_ext */ + LDAP *ld, + LDAP_CONST char *base, + int scope, + LDAP_CONST char *filter, + char **attrs, + int attrsonly )); + +LDAP_F( int ) +ldap_search_s LDAP_P(( /* deprecated, use ldap_search_ext_s */ + LDAP *ld, + LDAP_CONST char *base, + int scope, + LDAP_CONST char *filter, + char **attrs, + int attrsonly, + LDAPMessage **res )); + +LDAP_F( int ) +ldap_search_st LDAP_P(( /* deprecated, use ldap_search_ext_s */ + LDAP *ld, + LDAP_CONST char *base, + int scope, + LDAP_CONST char *filter, + char **attrs, + int attrsonly, + struct timeval *timeout, + LDAPMessage **res )); +#endif + +/* + * in unbind.c + */ +LDAP_F( int ) +ldap_unbind_ext LDAP_P(( + LDAP *ld, + LDAPControl **serverctrls, + LDAPControl **clientctrls)); + +LDAP_F( int ) +ldap_unbind_ext_s LDAP_P(( + LDAP *ld, + LDAPControl **serverctrls, + LDAPControl **clientctrls)); + +LDAP_F( int ) +ldap_destroy LDAP_P(( + LDAP *ld)); + +#if LDAP_DEPRECATED +LDAP_F( int ) +ldap_unbind LDAP_P(( /* deprecated, use ldap_unbind_ext */ + LDAP *ld )); + +LDAP_F( int ) +ldap_unbind_s LDAP_P(( /* deprecated, use ldap_unbind_ext_s */ + LDAP *ld )); +#endif + +/* + * in filter.c + */ +LDAP_F( int ) +ldap_put_vrFilter LDAP_P(( + BerElement *ber, + const char *vrf )); + +/* + * in free.c + */ + +LDAP_F( void * ) +ldap_memalloc LDAP_P(( + ber_len_t s )); + +LDAP_F( void * ) +ldap_memrealloc LDAP_P(( + void* p, + ber_len_t s )); + +LDAP_F( void * ) +ldap_memcalloc LDAP_P(( + ber_len_t n, + ber_len_t s )); + +LDAP_F( void ) +ldap_memfree LDAP_P(( + void* p )); + +LDAP_F( void ) +ldap_memvfree LDAP_P(( + void** v )); + +LDAP_F( char * ) +ldap_strdup LDAP_P(( + LDAP_CONST char * )); + +LDAP_F( void ) +ldap_mods_free LDAP_P(( + LDAPMod **mods, + int freemods )); + + +#if LDAP_DEPRECATED +/* + * in sort.c (deprecated, use custom code instead) + */ +typedef int (LDAP_SORT_AD_CMP_PROC) LDAP_P(( /* deprecated */ + LDAP_CONST char *left, + LDAP_CONST char *right )); + +typedef int (LDAP_SORT_AV_CMP_PROC) LDAP_P(( /* deprecated */ + LDAP_CONST void *left, + LDAP_CONST void *right )); + +LDAP_F( int ) /* deprecated */ +ldap_sort_entries LDAP_P(( LDAP *ld, + LDAPMessage **chain, + LDAP_CONST char *attr, + LDAP_SORT_AD_CMP_PROC *cmp )); + +LDAP_F( int ) /* deprecated */ +ldap_sort_values LDAP_P(( + LDAP *ld, + char **vals, + LDAP_SORT_AV_CMP_PROC *cmp )); + +LDAP_F( int ) /* deprecated */ +ldap_sort_strcasecmp LDAP_P(( + LDAP_CONST void *a, + LDAP_CONST void *b )); +#endif + +/* + * in url.c + */ +LDAP_F( int ) +ldap_is_ldap_url LDAP_P(( + LDAP_CONST char *url )); + +LDAP_F( int ) +ldap_is_ldaps_url LDAP_P(( + LDAP_CONST char *url )); + +LDAP_F( int ) +ldap_is_ldapi_url LDAP_P(( + LDAP_CONST char *url )); + +#ifdef LDAP_CONNECTIONLESS +LDAP_F( int ) +ldap_is_ldapc_url LDAP_P(( + LDAP_CONST char *url )); +#endif + +LDAP_F( int ) +ldap_url_parse LDAP_P(( + LDAP_CONST char *url, + LDAPURLDesc **ludpp )); + +LDAP_F( char * ) +ldap_url_desc2str LDAP_P(( + LDAPURLDesc *ludp )); + +LDAP_F( void ) +ldap_free_urldesc LDAP_P(( + LDAPURLDesc *ludp )); + + +/* + * LDAP Cancel Extended Operation + * in cancel.c + */ +#define LDAP_API_FEATURE_CANCEL 1000 + +LDAP_F( int ) +ldap_cancel LDAP_P(( LDAP *ld, + int cancelid, + LDAPControl **sctrls, + LDAPControl **cctrls, + int *msgidp )); + +LDAP_F( int ) +ldap_cancel_s LDAP_P(( LDAP *ld, + int cancelid, + LDAPControl **sctrl, + LDAPControl **cctrl )); + +/* + * LDAP Turn Extended Operation + * in turn.c + */ +#define LDAP_API_FEATURE_TURN 1000 + +LDAP_F( int ) +ldap_turn LDAP_P(( LDAP *ld, + int mutual, + LDAP_CONST char* identifier, + LDAPControl **sctrls, + LDAPControl **cctrls, + int *msgidp )); + +LDAP_F( int ) +ldap_turn_s LDAP_P(( LDAP *ld, + int mutual, + LDAP_CONST char* identifier, + LDAPControl **sctrl, + LDAPControl **cctrl )); + +/* + * LDAP Paged Results + * in pagectrl.c + */ +#define LDAP_API_FEATURE_PAGED_RESULTS 2000 + +LDAP_F( int ) +ldap_create_page_control_value LDAP_P(( + LDAP *ld, + ber_int_t pagesize, + struct berval *cookie, + struct berval *value )); + +LDAP_F( int ) +ldap_create_page_control LDAP_P(( + LDAP *ld, + ber_int_t pagesize, + struct berval *cookie, + int iscritical, + LDAPControl **ctrlp )); + +#if LDAP_DEPRECATED +LDAP_F( int ) +ldap_parse_page_control LDAP_P(( + /* deprecated, use ldap_parse_pageresponse_control */ + LDAP *ld, + LDAPControl **ctrls, + ber_int_t *count, + struct berval **cookie )); +#endif + +LDAP_F( int ) +ldap_parse_pageresponse_control LDAP_P(( + LDAP *ld, + LDAPControl *ctrl, + ber_int_t *count, + struct berval *cookie )); + +/* + * LDAP Server Side Sort + * in sortctrl.c + */ +#define LDAP_API_FEATURE_SERVER_SIDE_SORT 2000 + +/* structure for a sort-key */ +typedef struct ldapsortkey { + char *attributeType; + char *orderingRule; + int reverseOrder; +} LDAPSortKey; + +LDAP_F( int ) +ldap_create_sort_keylist LDAP_P(( + LDAPSortKey ***sortKeyList, + char *keyString )); + +LDAP_F( void ) +ldap_free_sort_keylist LDAP_P(( + LDAPSortKey **sortkeylist )); + +LDAP_F( int ) +ldap_create_sort_control_value LDAP_P(( + LDAP *ld, + LDAPSortKey **keyList, + struct berval *value )); + +LDAP_F( int ) +ldap_create_sort_control LDAP_P(( + LDAP *ld, + LDAPSortKey **keyList, + int iscritical, + LDAPControl **ctrlp )); + +LDAP_F( int ) +ldap_parse_sortresponse_control LDAP_P(( + LDAP *ld, + LDAPControl *ctrl, + ber_int_t *result, + char **attribute )); + +/* + * LDAP Virtual List View + * in vlvctrl.c + */ +#define LDAP_API_FEATURE_VIRTUAL_LIST_VIEW 2000 + +/* structure for virtual list */ +typedef struct ldapvlvinfo { + ber_int_t ldvlv_version; + ber_int_t ldvlv_before_count; + ber_int_t ldvlv_after_count; + ber_int_t ldvlv_offset; + ber_int_t ldvlv_count; + struct berval * ldvlv_attrvalue; + struct berval * ldvlv_context; + void * ldvlv_extradata; +} LDAPVLVInfo; + +LDAP_F( int ) +ldap_create_vlv_control_value LDAP_P(( + LDAP *ld, + LDAPVLVInfo *ldvlistp, + struct berval *value)); + +LDAP_F( int ) +ldap_create_vlv_control LDAP_P(( + LDAP *ld, + LDAPVLVInfo *ldvlistp, + LDAPControl **ctrlp )); + +LDAP_F( int ) +ldap_parse_vlvresponse_control LDAP_P(( + LDAP *ld, + LDAPControl *ctrls, + ber_int_t *target_posp, + ber_int_t *list_countp, + struct berval **contextp, + int *errcodep )); + +/* + * LDAP Who Am I? + * in whoami.c + */ +#define LDAP_API_FEATURE_WHOAMI 1000 + +LDAP_F( int ) +ldap_parse_whoami LDAP_P(( + LDAP *ld, + LDAPMessage *res, + struct berval **authzid )); + +LDAP_F( int ) +ldap_whoami LDAP_P(( LDAP *ld, + LDAPControl **sctrls, + LDAPControl **cctrls, + int *msgidp )); + +LDAP_F( int ) +ldap_whoami_s LDAP_P(( + LDAP *ld, + struct berval **authzid, + LDAPControl **sctrls, + LDAPControl **cctrls )); + +/* + * LDAP Password Modify + * in passwd.c + */ +#define LDAP_API_FEATURE_PASSWD_MODIFY 1000 + +LDAP_F( int ) +ldap_parse_passwd LDAP_P(( + LDAP *ld, + LDAPMessage *res, + struct berval *newpasswd )); + +LDAP_F( int ) +ldap_passwd LDAP_P(( LDAP *ld, + struct berval *user, + struct berval *oldpw, + struct berval *newpw, + LDAPControl **sctrls, + LDAPControl **cctrls, + int *msgidp )); + +LDAP_F( int ) +ldap_passwd_s LDAP_P(( + LDAP *ld, + struct berval *user, + struct berval *oldpw, + struct berval *newpw, + struct berval *newpasswd, + LDAPControl **sctrls, + LDAPControl **cctrls )); + +#ifdef LDAP_CONTROL_PASSWORDPOLICYREQUEST +/* + * LDAP Password Policy controls + * in ppolicy.c + */ +#define LDAP_API_FEATURE_PASSWORD_POLICY 1000 + +typedef enum passpolicyerror_enum { + PP_passwordExpired = 0, + PP_accountLocked = 1, + PP_changeAfterReset = 2, + PP_passwordModNotAllowed = 3, + PP_mustSupplyOldPassword = 4, + PP_insufficientPasswordQuality = 5, + PP_passwordTooShort = 6, + PP_passwordTooYoung = 7, + PP_passwordInHistory = 8, + PP_noError = 65535 +} LDAPPasswordPolicyError; + +LDAP_F( int ) +ldap_create_passwordpolicy_control LDAP_P(( + LDAP *ld, + LDAPControl **ctrlp )); + +LDAP_F( int ) +ldap_parse_passwordpolicy_control LDAP_P(( + LDAP *ld, + LDAPControl *ctrl, + ber_int_t *expirep, + ber_int_t *gracep, + LDAPPasswordPolicyError *errorp )); + +LDAP_F( const char * ) +ldap_passwordpolicy_err2txt LDAP_P(( LDAPPasswordPolicyError )); +#endif /* LDAP_CONTROL_PASSWORDPOLICYREQUEST */ + +/* + * LDAP Dynamic Directory Services Refresh -- RFC 2589 + * in dds.c + */ +#define LDAP_API_FEATURE_REFRESH 1000 + +LDAP_F( int ) +ldap_parse_refresh LDAP_P(( + LDAP *ld, + LDAPMessage *res, + ber_int_t *newttl )); + +LDAP_F( int ) +ldap_refresh LDAP_P(( LDAP *ld, + struct berval *dn, + ber_int_t ttl, + LDAPControl **sctrls, + LDAPControl **cctrls, + int *msgidp )); + +LDAP_F( int ) +ldap_refresh_s LDAP_P(( + LDAP *ld, + struct berval *dn, + ber_int_t ttl, + ber_int_t *newttl, + LDAPControl **sctrls, + LDAPControl **cctrls )); + +/* + * LDAP Transactions + */ +#ifdef LDAP_X_TXN +LDAP_F( int ) +ldap_txn_start LDAP_P(( LDAP *ld, + LDAPControl **sctrls, + LDAPControl **cctrls, + int *msgidp )); + +LDAP_F( int ) +ldap_txn_start_s LDAP_P(( LDAP *ld, + LDAPControl **sctrl, + LDAPControl **cctrl, + struct berval **rettxnid )); + +LDAP_F( int ) +ldap_txn_end LDAP_P(( LDAP *ld, + int commit, + struct berval *txnid, + LDAPControl **sctrls, + LDAPControl **cctrls, + int *msgidp )); + +LDAP_F( int ) +ldap_txn_end_s LDAP_P(( LDAP *ld, + int commit, + struct berval *txnid, + LDAPControl **sctrl, + LDAPControl **cctrl, + int *retidp )); +#endif + +/* + * in ldap_sync.c + */ + +/* + * initialize the persistent search structure + */ +LDAP_F( ldap_sync_t * ) +ldap_sync_initialize LDAP_P(( + ldap_sync_t *ls )); + +/* + * destroy the persistent search structure + */ +LDAP_F( void ) +ldap_sync_destroy LDAP_P(( + ldap_sync_t *ls, + int freeit )); + +/* + * initialize a refreshOnly sync + */ +LDAP_F( int ) +ldap_sync_init LDAP_P(( + ldap_sync_t *ls, + int mode )); + +/* + * initialize a refreshOnly sync + */ +LDAP_F( int ) +ldap_sync_init_refresh_only LDAP_P(( + ldap_sync_t *ls )); + +/* + * initialize a refreshAndPersist sync + */ +LDAP_F( int ) +ldap_sync_init_refresh_and_persist LDAP_P(( + ldap_sync_t *ls )); + +/* + * poll for new responses + */ +LDAP_F( int ) +ldap_sync_poll LDAP_P(( + ldap_sync_t *ls )); + +#ifdef LDAP_CONTROL_X_SESSION_TRACKING + +/* + * in stctrl.c + */ +LDAP_F( int ) +ldap_create_session_tracking_value LDAP_P(( + LDAP *ld, + char *sessionSourceIp, + char *sessionSourceName, + char *formatOID, + struct berval *sessionTrackingIdentifier, + struct berval *value )); + +LDAP_F( int ) +ldap_create_session_tracking_control LDAP_P(( + LDAP *ld, + char *sessionSourceIp, + char *sessionSourceName, + char *formatOID, + struct berval *sessionTrackingIdentifier, + LDAPControl **ctrlp )); + +LDAP_F( int ) +ldap_parse_session_tracking_control LDAP_P(( + LDAP *ld, + LDAPControl *ctrl, + struct berval *ip, + struct berval *name, + struct berval *oid, + struct berval *id )); + +#endif /* LDAP_CONTROL_X_SESSION_TRACKING */ + +/* + * in assertion.c + */ +LDAP_F (int) +ldap_create_assertion_control_value LDAP_P(( + LDAP *ld, + char *assertion, + struct berval *value )); + +LDAP_F( int ) +ldap_create_assertion_control LDAP_P(( + LDAP *ld, + char *filter, + int iscritical, + LDAPControl **ctrlp )); + +/* + * in deref.c + */ + +typedef struct LDAPDerefSpec { + char *derefAttr; + char **attributes; +} LDAPDerefSpec; + +typedef struct LDAPDerefVal { + char *type; + BerVarray vals; + struct LDAPDerefVal *next; +} LDAPDerefVal; + +typedef struct LDAPDerefRes { + char *derefAttr; + struct berval derefVal; + LDAPDerefVal *attrVals; + struct LDAPDerefRes *next; +} LDAPDerefRes; + +LDAP_F( int ) +ldap_create_deref_control_value LDAP_P(( + LDAP *ld, + LDAPDerefSpec *ds, + struct berval *value )); + +LDAP_F( int ) +ldap_create_deref_control LDAP_P(( + LDAP *ld, + LDAPDerefSpec *ds, + int iscritical, + LDAPControl **ctrlp )); + +LDAP_F( void ) +ldap_derefresponse_free LDAP_P(( + LDAPDerefRes *dr )); + +LDAP_F( int ) +ldap_parse_derefresponse_control LDAP_P(( + LDAP *ld, + LDAPControl *ctrl, + LDAPDerefRes **drp )); + +LDAP_F( int ) +ldap_parse_deref_control LDAP_P(( + LDAP *ld, + LDAPControl **ctrls, + LDAPDerefRes **drp )); + +LDAP_END_DECL +#endif /* _LDAP_H */ diff --git a/deps/include/ldap_cdefs.h b/deps/include/ldap_cdefs.h new file mode 100644 index 0000000..178bcec --- /dev/null +++ b/deps/include/ldap_cdefs.h @@ -0,0 +1,248 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ +/* LDAP C Defines */ + +#ifndef _LDAP_CDEFS_H +#define _LDAP_CDEFS_H + +#if defined(__cplusplus) || defined(c_plusplus) +# define LDAP_BEGIN_DECL extern "C" { +# define LDAP_END_DECL } +#else +# define LDAP_BEGIN_DECL /* begin declarations */ +# define LDAP_END_DECL /* end declarations */ +#endif + +#if !defined(LDAP_NO_PROTOTYPES) && ( defined(LDAP_NEEDS_PROTOTYPES) || \ + defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus) ) + + /* ANSI C or C++ */ +# define LDAP_P(protos) protos +# define LDAP_CONCAT1(x,y) x ## y +# define LDAP_CONCAT(x,y) LDAP_CONCAT1(x,y) +# define LDAP_STRING(x) #x /* stringify without expanding x */ +# define LDAP_XSTRING(x) LDAP_STRING(x) /* expand x, then stringify */ + +#ifndef LDAP_CONST +# define LDAP_CONST const +#endif + +#else /* no prototypes */ + + /* traditional C */ +# define LDAP_P(protos) () +# define LDAP_CONCAT(x,y) x/**/y +# define LDAP_STRING(x) "x" + +#ifndef LDAP_CONST +# define LDAP_CONST /* no const */ +#endif + +#endif /* no prototypes */ + +#if (__GNUC__) * 1000 + (__GNUC_MINOR__) >= 2006 +# define LDAP_GCCATTR(attrs) __attribute__(attrs) +#else +# define LDAP_GCCATTR(attrs) +#endif + +/* + * Support for Windows DLLs. + * + * When external source code includes header files for dynamic libraries, + * the external source code is "importing" DLL symbols into its resulting + * object code. On Windows, symbols imported from DLLs must be explicitly + * indicated in header files with the __declspec(dllimport) directive. + * This is not totally necessary for functions because the compiler + * (gcc or MSVC) will generate stubs when this directive is absent. + * However, this is required for imported variables. + * + * The LDAP libraries, i.e. liblber and libldap, can be built as + * static or shared, based on configuration. Just about all other source + * code in OpenLDAP use these libraries. If the LDAP libraries + * are configured as shared, 'configure' defines the LDAP_LIBS_DYNAMIC + * macro. When other source files include LDAP library headers, the + * LDAP library symbols will automatically be marked as imported. When + * the actual LDAP libraries are being built, the symbols will not + * be marked as imported because the LBER_LIBRARY or LDAP_LIBRARY macros + * will be respectively defined. + * + * Any project outside of OpenLDAP with source code wanting to use + * LDAP dynamic libraries should explicitly define LDAP_LIBS_DYNAMIC. + * This will ensure that external source code appropriately marks symbols + * that will be imported. + * + * The slapd executable, itself, can be used as a dynamic library. + * For example, if a backend module is compiled as shared, it will + * import symbols from slapd. When this happens, the slapd symbols + * must be marked as imported in header files that the backend module + * includes. Remember that slapd links with various static libraries. + * If the LDAP libraries were configured as static, their object + * code is also part of the monolithic slapd executable. Thus, when + * a backend module imports symbols from slapd, it imports symbols from + * all of the static libraries in slapd as well. Thus, the SLAP_IMPORT + * macro, when defined, will appropriately mark symbols as imported. + * This macro should be used by shared backend modules as well as any + * other external source code that imports symbols from the slapd + * executable as if it were a DLL. + * + * Note that we don't actually have to worry about using the + * __declspec(dllexport) directive anywhere. This is because both + * MSVC and Mingw provide alternate (more effective) methods for exporting + * symbols out of binaries, i.e. the use of a DEF file. + * + * NOTE ABOUT BACKENDS: Backends can be configured as static or dynamic. + * When a backend is configured as dynamic, slapd will load the backend + * explicitly and populate function pointer structures by calling + * the backend's well-known initialization function. Because of this + * procedure, slapd never implicitly imports symbols from dynamic backends. + * This makes it unnecessary to tag various backend functions with the + * __declspec(dllimport) directive. This is because neither slapd nor + * any other external binary should ever be implicitly loading a backend + * dynamic module. + * + * Backends are supposed to be self-contained. However, it appears that + * back-meta DOES implicitly import symbols from back-ldap. This means + * that the __declspec(dllimport) directive should be marked on back-ldap + * functions (in its header files) if and only if we're compiling for + * windows AND back-ldap has been configured as dynamic AND back-meta + * is the client of back-ldap. When client is slapd, there is no effect + * since slapd does not implicitly import symbols. + * + * TODO(?): Currently, back-meta nor back-ldap is supported for Mingw32. + * Thus, there's no need to worry about this right now. This is something that + * may or may not have to be addressed in the future. + */ + +/* LBER library */ +#if defined(_WIN32) && \ + ((defined(LDAP_LIBS_DYNAMIC) && !defined(LBER_LIBRARY)) || \ + (!defined(LDAP_LIBS_DYNAMIC) && defined(SLAPD_IMPORT))) +# define LBER_F(type) extern __declspec(dllimport) type +# define LBER_V(type) extern __declspec(dllimport) type +#else +# define LBER_F(type) extern type +# define LBER_V(type) extern type +#endif + +/* LDAP library */ +#if defined(_WIN32) && \ + ((defined(LDAP_LIBS_DYNAMIC) && !defined(LDAP_LIBRARY)) || \ + (!defined(LDAP_LIBS_DYNAMIC) && defined(SLAPD_IMPORT))) +# define LDAP_F(type) extern __declspec(dllimport) type +# define LDAP_V(type) extern __declspec(dllimport) type +#else +# define LDAP_F(type) extern type +# define LDAP_V(type) extern type +#endif + +/* AVL library */ +#if defined(_WIN32) && defined(SLAPD_IMPORT) +# define LDAP_AVL_F(type) extern __declspec(dllimport) type +# define LDAP_AVL_V(type) extern __declspec(dllimport) type +#else +# define LDAP_AVL_F(type) extern type +# define LDAP_AVL_V(type) extern type +#endif + +/* LDIF library */ +#if defined(_WIN32) && defined(SLAPD_IMPORT) +# define LDAP_LDIF_F(type) extern __declspec(dllimport) type +# define LDAP_LDIF_V(type) extern __declspec(dllimport) type +#else +# define LDAP_LDIF_F(type) extern type +# define LDAP_LDIF_V(type) extern type +#endif + +/* LUNICODE library */ +#if defined(_WIN32) && defined(SLAPD_IMPORT) +# define LDAP_LUNICODE_F(type) extern __declspec(dllimport) type +# define LDAP_LUNICODE_V(type) extern __declspec(dllimport) type +#else +# define LDAP_LUNICODE_F(type) extern type +# define LDAP_LUNICODE_V(type) extern type +#endif + +/* LUTIL library */ +#if defined(_WIN32) && defined(SLAPD_IMPORT) +# define LDAP_LUTIL_F(type) extern __declspec(dllimport) type +# define LDAP_LUTIL_V(type) extern __declspec(dllimport) type +#else +# define LDAP_LUTIL_F(type) extern type +# define LDAP_LUTIL_V(type) extern type +#endif + +/* REWRITE library */ +#if defined(_WIN32) && defined(SLAPD_IMPORT) +# define LDAP_REWRITE_F(type) extern __declspec(dllimport) type +# define LDAP_REWRITE_V(type) extern __declspec(dllimport) type +#else +# define LDAP_REWRITE_F(type) extern type +# define LDAP_REWRITE_V(type) extern type +#endif + +/* SLAPD (as a dynamic library exporting symbols) */ +#if defined(_WIN32) && defined(SLAPD_IMPORT) +# define LDAP_SLAPD_F(type) extern __declspec(dllimport) type +# define LDAP_SLAPD_V(type) extern __declspec(dllimport) type +#else +# define LDAP_SLAPD_F(type) extern type +# define LDAP_SLAPD_V(type) extern type +#endif + +/* SLAPD (as a dynamic library exporting symbols) */ +#if defined(_WIN32) && defined(SLAPD_IMPORT) +# define LDAP_SLAPI_F(type) extern __declspec(dllimport) type +# define LDAP_SLAPI_V(type) extern __declspec(dllimport) type +#else +# define LDAP_SLAPI_F(type) extern type +# define LDAP_SLAPI_V(type) extern type +#endif + +/* SLAPD (as a dynamic library exporting symbols) */ +#if defined(_WIN32) && defined(SLAPD_IMPORT) +# define SLAPI_F(type) extern __declspec(dllimport) type +# define SLAPI_V(type) extern __declspec(dllimport) type +#else +# define SLAPI_F(type) extern type +# define SLAPI_V(type) extern type +#endif + +/* + * C library. Mingw32 links with the dynamic C run-time library by default, + * so the explicit definition of CSTATIC will keep dllimport from + * being defined, if desired. + * + * MSVC defines the _DLL macro when the compiler is invoked with /MD or /MDd, + * which means the resulting object code will be linked with the dynamic + * C run-time library. + * + * Technically, it shouldn't be necessary to redefine any functions that + * the headers for the C library should already contain. Nevertheless, this + * is here as a safe-guard. + * + * TODO: Determine if these macros ever get expanded for Windows. If not, + * the declspec expansion can probably be removed. + */ +#if (defined(__MINGW32__) && !defined(CSTATIC)) || \ + (defined(_MSC_VER) && defined(_DLL)) +# define LDAP_LIBC_F(type) extern __declspec(dllimport) type +# define LDAP_LIBC_V(type) extern __declspec(dllimport) type +#else +# define LDAP_LIBC_F(type) extern type +# define LDAP_LIBC_V(type) extern type +#endif + +#endif /* _LDAP_CDEFS_H */ diff --git a/deps/include/ldap_config.h b/deps/include/ldap_config.h new file mode 100644 index 0000000..b3d182c --- /dev/null +++ b/deps/include/ldap_config.h @@ -0,0 +1,74 @@ +/* Generated from ./ldap_config.hin on Tue Jun 30 15:03:11 UTC 2020 */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +/* + * This file works in confunction with OpenLDAP configure system. + * If you do no like the values below, adjust your configure options. + */ + +#ifndef _LDAP_CONFIG_H +#define _LDAP_CONFIG_H + +/* directory separator */ +#ifndef LDAP_DIRSEP +#ifndef _WIN32 +#define LDAP_DIRSEP "/" +#else +#define LDAP_DIRSEP "\\" +#endif +#endif + +/* directory for temporary files */ +#if defined(_WIN32) +# define LDAP_TMPDIR "C:\\." /* we don't have much of a choice */ +#elif defined( _P_tmpdir ) +# define LDAP_TMPDIR _P_tmpdir +#elif defined( P_tmpdir ) +# define LDAP_TMPDIR P_tmpdir +#elif defined( _PATH_TMPDIR ) +# define LDAP_TMPDIR _PATH_TMPDIR +#else +# define LDAP_TMPDIR LDAP_DIRSEP "tmp" +#endif + +/* directories */ +#ifndef LDAP_BINDIR +#define LDAP_BINDIR "/usr/local/bin" +#endif +#ifndef LDAP_SBINDIR +#define LDAP_SBINDIR "/usr/local/sbin" +#endif +#ifndef LDAP_DATADIR +#define LDAP_DATADIR "/usr/local/share/openldap" +#endif +#ifndef LDAP_SYSCONFDIR +#define LDAP_SYSCONFDIR "/usr/local/etc/openldap" +#endif +#ifndef LDAP_LIBEXECDIR +#define LDAP_LIBEXECDIR "/usr/local/libexec" +#endif +#ifndef LDAP_MODULEDIR +#define LDAP_MODULEDIR "/usr/local/libexec/openldap" +#endif +#ifndef LDAP_RUNDIR +#define LDAP_RUNDIR "/usr/local/var" +#endif +#ifndef LDAP_LOCALEDIR +#define LDAP_LOCALEDIR "" +#endif + + +#endif /* _LDAP_CONFIG_H */ diff --git a/deps/include/ldap_config.hin b/deps/include/ldap_config.hin new file mode 100644 index 0000000..d7dba87 --- /dev/null +++ b/deps/include/ldap_config.hin @@ -0,0 +1,73 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +/* + * This file works in confunction with OpenLDAP configure system. + * If you do no like the values below, adjust your configure options. + */ + +#ifndef _LDAP_CONFIG_H +#define _LDAP_CONFIG_H + +/* directory separator */ +#ifndef LDAP_DIRSEP +#ifndef _WIN32 +#define LDAP_DIRSEP "/" +#else +#define LDAP_DIRSEP "\\" +#endif +#endif + +/* directory for temporary files */ +#if defined(_WIN32) +# define LDAP_TMPDIR "C:\\." /* we don't have much of a choice */ +#elif defined( _P_tmpdir ) +# define LDAP_TMPDIR _P_tmpdir +#elif defined( P_tmpdir ) +# define LDAP_TMPDIR P_tmpdir +#elif defined( _PATH_TMPDIR ) +# define LDAP_TMPDIR _PATH_TMPDIR +#else +# define LDAP_TMPDIR LDAP_DIRSEP "tmp" +#endif + +/* directories */ +#ifndef LDAP_BINDIR +#define LDAP_BINDIR "%BINDIR%" +#endif +#ifndef LDAP_SBINDIR +#define LDAP_SBINDIR "%SBINDIR%" +#endif +#ifndef LDAP_DATADIR +#define LDAP_DATADIR "%DATADIR%" +#endif +#ifndef LDAP_SYSCONFDIR +#define LDAP_SYSCONFDIR "%SYSCONFDIR%" +#endif +#ifndef LDAP_LIBEXECDIR +#define LDAP_LIBEXECDIR "%LIBEXECDIR%" +#endif +#ifndef LDAP_MODULEDIR +#define LDAP_MODULEDIR "%MODULEDIR%" +#endif +#ifndef LDAP_RUNDIR +#define LDAP_RUNDIR "%RUNDIR%" +#endif +#ifndef LDAP_LOCALEDIR +#define LDAP_LOCALEDIR "%LOCALEDIR%" +#endif + + +#endif /* _LDAP_CONFIG_H */ diff --git a/deps/include/ldap_defaults.h b/deps/include/ldap_defaults.h new file mode 100644 index 0000000..9468049 --- /dev/null +++ b/deps/include/ldap_defaults.h @@ -0,0 +1,66 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ +/* Portions Copyright (c) 1994 Regents of the University of Michigan. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and that due credit is given + * to the University of Michigan at Ann Arbor. The name of the University + * may not be used to endorse or promote products derived from this + * software without specific prior written permission. This software + * is provided ``as is'' without express or implied warranty. + */ + +/* + * This file controls defaults for OpenLDAP package. + * You probably do not need to edit the defaults provided by this file. + */ + +#ifndef _LDAP_DEFAULTS_H +#define _LDAP_DEFAULTS_H + + +#include + +#define LDAP_CONF_FILE LDAP_SYSCONFDIR LDAP_DIRSEP "ldap.conf" +#define LDAP_USERRC_FILE "ldaprc" +#define LDAP_ENV_PREFIX "LDAP" + +/* default ldapi:// socket */ +#define LDAPI_SOCK LDAP_RUNDIR LDAP_DIRSEP "run" LDAP_DIRSEP "ldapi" + +/* + * SLAPD DEFINITIONS + */ + /* location of the default slapd config file */ +#define SLAPD_DEFAULT_CONFIGFILE LDAP_SYSCONFDIR LDAP_DIRSEP "slapd.conf" +#define SLAPD_DEFAULT_CONFIGDIR LDAP_SYSCONFDIR LDAP_DIRSEP "slapd.d" +#define SLAPD_DEFAULT_DB_DIR LDAP_RUNDIR LDAP_DIRSEP "openldap-data" +#define SLAPD_DEFAULT_DB_MODE 0600 +#define SLAPD_DEFAULT_UCDATA LDAP_DATADIR LDAP_DIRSEP "ucdata" + /* default max deref depth for aliases */ +#define SLAPD_DEFAULT_MAXDEREFDEPTH 15 + /* default sizelimit on number of entries from a search */ +#define SLAPD_DEFAULT_SIZELIMIT 500 + /* default timelimit to spend on a search */ +#define SLAPD_DEFAULT_TIMELIMIT 3600 + +/* the following DNs must be normalized! */ + /* dn of the default subschema subentry */ +#define SLAPD_SCHEMA_DN "cn=Subschema" + /* dn of the default "monitor" subentry */ +#define SLAPD_MONITOR_DN "cn=Monitor" + +#endif /* _LDAP_CONFIG_H */ diff --git a/deps/include/ldap_features.h b/deps/include/ldap_features.h new file mode 100644 index 0000000..88be29e --- /dev/null +++ b/deps/include/ldap_features.h @@ -0,0 +1,61 @@ +/* include/ldap_features.h. Generated from ldap_features.hin by configure. */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +/* + * LDAP Features + */ + +#ifndef _LDAP_FEATURES_H +#define _LDAP_FEATURES_H 1 + +/* OpenLDAP API version macros */ +#define LDAP_VENDOR_VERSION 20450 +#define LDAP_VENDOR_VERSION_MAJOR 2 +#define LDAP_VENDOR_VERSION_MINOR 4 +#define LDAP_VENDOR_VERSION_PATCH 50 + +/* +** WORK IN PROGRESS! +** +** OpenLDAP reentrancy/thread-safeness should be dynamically +** checked using ldap_get_option(). +** +** The -lldap implementation is not thread-safe. +** +** The -lldap_r implementation is: +** LDAP_API_FEATURE_THREAD_SAFE (basic thread safety) +** but also be: +** LDAP_API_FEATURE_SESSION_THREAD_SAFE +** LDAP_API_FEATURE_OPERATION_THREAD_SAFE +** +** The preprocessor flag LDAP_API_FEATURE_X_OPENLDAP_THREAD_SAFE +** can be used to determine if -lldap_r is available at compile +** time. You must define LDAP_THREAD_SAFE if and only if you +** link with -lldap_r. +** +** If you fail to define LDAP_THREAD_SAFE when linking with +** -lldap_r or define LDAP_THREAD_SAFE when linking with -lldap, +** provided header definations and declarations may be incorrect. +** +*/ + +/* is -lldap_r available or not */ +#define LDAP_API_FEATURE_X_OPENLDAP_THREAD_SAFE 1 + +/* LDAP v2 Referrals */ +/* #undef LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS */ + +#endif /* LDAP_FEATURES */ diff --git a/deps/include/ldap_features.hin b/deps/include/ldap_features.hin new file mode 100644 index 0000000..81650b7 --- /dev/null +++ b/deps/include/ldap_features.hin @@ -0,0 +1,60 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +/* + * LDAP Features + */ + +#ifndef _LDAP_FEATURES_H +#define _LDAP_FEATURES_H 1 + +/* OpenLDAP API version macros */ +#undef LDAP_VENDOR_VERSION +#undef LDAP_VENDOR_VERSION_MAJOR +#undef LDAP_VENDOR_VERSION_MINOR +#undef LDAP_VENDOR_VERSION_PATCH + +/* +** WORK IN PROGRESS! +** +** OpenLDAP reentrancy/thread-safeness should be dynamically +** checked using ldap_get_option(). +** +** The -lldap implementation is not thread-safe. +** +** The -lldap_r implementation is: +** LDAP_API_FEATURE_THREAD_SAFE (basic thread safety) +** but also be: +** LDAP_API_FEATURE_SESSION_THREAD_SAFE +** LDAP_API_FEATURE_OPERATION_THREAD_SAFE +** +** The preprocessor flag LDAP_API_FEATURE_X_OPENLDAP_THREAD_SAFE +** can be used to determine if -lldap_r is available at compile +** time. You must define LDAP_THREAD_SAFE if and only if you +** link with -lldap_r. +** +** If you fail to define LDAP_THREAD_SAFE when linking with +** -lldap_r or define LDAP_THREAD_SAFE when linking with -lldap, +** provided header definations and declarations may be incorrect. +** +*/ + +/* is -lldap_r available or not */ +#undef LDAP_API_FEATURE_X_OPENLDAP_THREAD_SAFE + +/* LDAP v2 Referrals */ +#undef LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS + +#endif /* LDAP_FEATURES */ diff --git a/deps/include/ldap_int_thread.h b/deps/include/ldap_int_thread.h new file mode 100644 index 0000000..881f753 --- /dev/null +++ b/deps/include/ldap_int_thread.h @@ -0,0 +1,320 @@ +/* ldap_int_thread.h - ldap internal thread wrappers header file */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + + +LDAP_BEGIN_DECL + +/* Can be done twice in libldap_r. See libldap_r/ldap_thr_debug.h. */ +LDAP_F(int) ldap_int_thread_initialize LDAP_P(( void )); +LDAP_F(int) ldap_int_thread_destroy LDAP_P(( void )); + +LDAP_END_DECL + + +#ifndef _LDAP_INT_THREAD_H +#define _LDAP_INT_THREAD_H + +#if defined( HAVE_PTHREADS ) +/********************************** + * * + * definitions for POSIX Threads * + * * + **********************************/ + +#include +#ifdef HAVE_SCHED_H +#include +#endif + +LDAP_BEGIN_DECL + +typedef pthread_t ldap_int_thread_t; +typedef pthread_mutex_t ldap_int_thread_mutex_t; +typedef pthread_cond_t ldap_int_thread_cond_t; +typedef pthread_key_t ldap_int_thread_key_t; + +#define ldap_int_thread_equal(a, b) pthread_equal((a), (b)) + +#if defined( _POSIX_REENTRANT_FUNCTIONS ) || \ + defined( _POSIX_THREAD_SAFE_FUNCTIONS ) || \ + defined( _POSIX_THREADSAFE_FUNCTIONS ) +#define HAVE_REENTRANT_FUNCTIONS 1 +#endif + +#if defined( HAVE_PTHREAD_GETCONCURRENCY ) || \ + defined( HAVE_THR_GETCONCURRENCY ) +#define LDAP_THREAD_HAVE_GETCONCURRENCY 1 +#endif + +#if defined( HAVE_PTHREAD_SETCONCURRENCY ) || \ + defined( HAVE_THR_SETCONCURRENCY ) +#define LDAP_THREAD_HAVE_SETCONCURRENCY 1 +#endif + +#if defined( HAVE_PTHREAD_RWLOCK_DESTROY ) +#define LDAP_THREAD_HAVE_RDWR 1 +typedef pthread_rwlock_t ldap_int_thread_rdwr_t; +#endif + +#ifndef LDAP_INT_MUTEX_NULL +#define LDAP_INT_MUTEX_NULL PTHREAD_MUTEX_INITIALIZER +#define LDAP_INT_MUTEX_FIRSTCREATE(m) ((void) 0) +#endif + +LDAP_END_DECL + +#elif defined ( HAVE_MACH_CTHREADS ) +/********************************** + * * + * definitions for Mach CThreads * + * * + **********************************/ + +#if defined( HAVE_MACH_CTHREADS_H ) +# include +#elif defined( HAVE_CTHREADS_H ) +# include +#endif + +LDAP_BEGIN_DECL + +typedef cthread_t ldap_int_thread_t; +typedef struct mutex ldap_int_thread_mutex_t; +typedef struct condition ldap_int_thread_cond_t; +typedef cthread_key_t ldap_int_thread_key_t; + +#ifndef LDAP_INT_MUTEX_NULL +#define LDAP_INT_MUTEX_NULL MUTEX_INITIALIZER +#define LDAP_INT_MUTEX_FIRSTCREATE(m) ((void) 0) +#endif + +LDAP_END_DECL + +#elif defined( HAVE_GNU_PTH ) +/*********************************** + * * + * thread definitions for GNU Pth * + * * + ***********************************/ + +#define PTH_SYSCALL_SOFT 1 +#include + +LDAP_BEGIN_DECL + +typedef pth_t ldap_int_thread_t; +typedef pth_mutex_t ldap_int_thread_mutex_t; +typedef pth_cond_t ldap_int_thread_cond_t; +typedef pth_key_t ldap_int_thread_key_t; + +#if 0 +#define LDAP_THREAD_HAVE_RDWR 1 +typedef pth_rwlock_t ldap_int_thread_rdwr_t; +#endif + +#ifndef LDAP_INT_MUTEX_NULL +#define LDAP_INT_MUTEX_NULL PTH_MUTEX_INIT +#define LDAP_INT_MUTEX_FIRSTCREATE(m) ((void) 0) +#endif + +LDAP_END_DECL + +#elif defined( HAVE_THR ) +/******************************************** + * * + * thread definitions for Solaris LWP (THR) * + * * + ********************************************/ + +#include +#include + +LDAP_BEGIN_DECL + +typedef thread_t ldap_int_thread_t; +typedef mutex_t ldap_int_thread_mutex_t; +typedef cond_t ldap_int_thread_cond_t; +typedef thread_key_t ldap_int_thread_key_t; + +#define HAVE_REENTRANT_FUNCTIONS 1 + +#ifdef HAVE_THR_GETCONCURRENCY +#define LDAP_THREAD_HAVE_GETCONCURRENCY 1 +#endif +#ifdef HAVE_THR_SETCONCURRENCY +#define LDAP_THREAD_HAVE_SETCONCURRENCY 1 +#endif + +#ifndef LDAP_INT_MUTEX_NULL +#define LDAP_INT_MUTEX_NULL DEFAULTMUTEX +#define LDAP_INT_MUTEX_FIRSTCREATE(m) ((void) 0) +#endif + +#elif defined(HAVE_NT_THREADS) +/************************************* + * * + * thread definitions for NT threads * + * * + *************************************/ + +#include +#include + +LDAP_BEGIN_DECL + +typedef unsigned long ldap_int_thread_t; +typedef HANDLE ldap_int_thread_mutex_t; +typedef HANDLE ldap_int_thread_cond_t; +typedef DWORD ldap_int_thread_key_t; + +LDAP_F( int ) +ldap_int_mutex_firstcreate LDAP_P(( ldap_int_thread_mutex_t *mutex )); + +#ifndef LDAP_INT_MUTEX_NULL +#define LDAP_INT_MUTEX_NULL ((HANDLE)0) +#define LDAP_INT_MUTEX_FIRSTCREATE(m) \ + ldap_int_mutex_firstcreate(&(m)) +#endif + +LDAP_END_DECL + +#else +/*********************************** + * * + * thread definitions for no * + * underlying library support * + * * + ***********************************/ + +#ifndef NO_THREADS +#define NO_THREADS 1 +#endif + +LDAP_BEGIN_DECL + +typedef int ldap_int_thread_t; +typedef int ldap_int_thread_mutex_t; +typedef int ldap_int_thread_cond_t; +typedef int ldap_int_thread_key_t; + +#define LDAP_THREAD_HAVE_TPOOL 1 +typedef int ldap_int_thread_pool_t; + +#ifndef LDAP_INT_MUTEX_NULL +#define LDAP_INT_MUTEX_NULL 0 +#define LDAP_INT_MUTEX_FIRSTCREATE(m) ((void) 0) +#endif + +LDAP_END_DECL + +#endif /* no threads support */ + + +LDAP_BEGIN_DECL + +#ifndef ldap_int_thread_equal +#define ldap_int_thread_equal(a, b) ((a) == (b)) +#endif + +#ifndef LDAP_THREAD_HAVE_RDWR +typedef struct ldap_int_thread_rdwr_s * ldap_int_thread_rdwr_t; +#endif + +LDAP_F(int) ldap_int_thread_pool_startup ( void ); +LDAP_F(int) ldap_int_thread_pool_shutdown ( void ); + +#ifndef LDAP_THREAD_HAVE_TPOOL +typedef struct ldap_int_thread_pool_s * ldap_int_thread_pool_t; +#endif + +typedef struct ldap_int_thread_rmutex_s * ldap_int_thread_rmutex_t; +LDAP_END_DECL + + +#if defined(LDAP_THREAD_DEBUG) && !((LDAP_THREAD_DEBUG +0) & 2U) +#define LDAP_THREAD_DEBUG_WRAP 1 +#endif + +#ifdef LDAP_THREAD_DEBUG_WRAP +/************************************** + * * + * definitions for type-wrapped debug * + * * + **************************************/ + +LDAP_BEGIN_DECL + +#ifndef LDAP_UINTPTR_T /* May be configured in CPPFLAGS */ +#define LDAP_UINTPTR_T unsigned long +#endif + +typedef enum { + ldap_debug_magic = -(int) (((unsigned)-1)/19) +} ldap_debug_magic_t; + +typedef enum { + /* Could fill in "locked" etc here later */ + ldap_debug_state_inited = (int) (((unsigned)-1)/11), + ldap_debug_state_destroyed +} ldap_debug_state_t; + +typedef struct { + /* Enclosed in magic numbers in the hope of catching overwrites */ + ldap_debug_magic_t magic; /* bit pattern to recognize usages */ + LDAP_UINTPTR_T self; /* ~(LDAP_UINTPTR_T)&(this struct) */ + union ldap_debug_mem_u { /* Dummy memory reference */ + unsigned char *ptr; + LDAP_UINTPTR_T num; + } mem; + ldap_debug_state_t state; /* doubles as another magic number */ +} ldap_debug_usage_info_t; + +typedef struct { + ldap_int_thread_mutex_t wrapped; + ldap_debug_usage_info_t usage; + ldap_int_thread_t owner; +} ldap_debug_thread_mutex_t; + +#define LDAP_DEBUG_MUTEX_NULL {LDAP_INT_MUTEX_NULL, {0,0,{0},0} /*,owner*/} +#define LDAP_DEBUG_MUTEX_FIRSTCREATE(m) \ + ((void) ((m).usage.state || ldap_pvt_thread_mutex_init(&(m)))) + +typedef struct { + ldap_int_thread_cond_t wrapped; + ldap_debug_usage_info_t usage; +} ldap_debug_thread_cond_t; + +typedef struct { + ldap_int_thread_rdwr_t wrapped; + ldap_debug_usage_info_t usage; +} ldap_debug_thread_rdwr_t; + +#ifndef NDEBUG +#define LDAP_INT_THREAD_ASSERT_MUTEX_OWNER(mutex) \ + ldap_debug_thread_assert_mutex_owner( \ + __FILE__, __LINE__, "owns(" #mutex ")", mutex ) +LDAP_F(void) ldap_debug_thread_assert_mutex_owner LDAP_P(( + LDAP_CONST char *file, + int line, + LDAP_CONST char *msg, + ldap_debug_thread_mutex_t *mutex )); +#endif /* NDEBUG */ + +LDAP_END_DECL + +#endif /* LDAP_THREAD_DEBUG_WRAP */ + +#endif /* _LDAP_INT_THREAD_H */ diff --git a/deps/include/ldap_log.h b/deps/include/ldap_log.h new file mode 100644 index 0000000..23b7f72 --- /dev/null +++ b/deps/include/ldap_log.h @@ -0,0 +1,268 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ +/* Portions Copyright (c) 1990 Regents of the University of Michigan. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and that due credit is given + * to the University of Michigan at Ann Arbor. The name of the University + * may not be used to endorse or promote products derived from this + * software without specific prior written permission. This software + * is provided ``as is'' without express or implied warranty. + */ + +#ifndef LDAP_LOG_H +#define LDAP_LOG_H + +#include +#include + +LDAP_BEGIN_DECL + +/* + * debug reporting levels. + * + * They start with the syslog levels, and + * go down in importance. The normal + * debugging levels begin with LDAP_LEVEL_ENTRY + * + */ + +/* + * The "OLD_DEBUG" means that all logging occurs at LOG_DEBUG + */ + +#ifdef OLD_DEBUG +/* original behavior: all logging occurs at the same severity level */ +#if defined(LDAP_DEBUG) && defined(LDAP_SYSLOG) +#define LDAP_LEVEL_EMERG ldap_syslog_level +#define LDAP_LEVEL_ALERT ldap_syslog_level +#define LDAP_LEVEL_CRIT ldap_syslog_level +#define LDAP_LEVEL_ERR ldap_syslog_level +#define LDAP_LEVEL_WARNING ldap_syslog_level +#define LDAP_LEVEL_NOTICE ldap_syslog_level +#define LDAP_LEVEL_INFO ldap_syslog_level +#define LDAP_LEVEL_DEBUG ldap_syslog_level +#else /* !LDAP_DEBUG || !LDAP_SYSLOG */ +#define LDAP_LEVEL_EMERG (7) +#define LDAP_LEVEL_ALERT (7) +#define LDAP_LEVEL_CRIT (7) +#define LDAP_LEVEL_ERR (7) +#define LDAP_LEVEL_WARNING (7) +#define LDAP_LEVEL_NOTICE (7) +#define LDAP_LEVEL_INFO (7) +#define LDAP_LEVEL_DEBUG (7) +#endif /* !LDAP_DEBUG || !LDAP_SYSLOG */ + +#else /* ! OLD_DEBUG */ +/* map syslog onto LDAP severity levels */ +#ifdef LOG_DEBUG +#define LDAP_LEVEL_EMERG LOG_EMERG +#define LDAP_LEVEL_ALERT LOG_ALERT +#define LDAP_LEVEL_CRIT LOG_CRIT +#define LDAP_LEVEL_ERR LOG_ERR +#define LDAP_LEVEL_WARNING LOG_WARNING +#define LDAP_LEVEL_NOTICE LOG_NOTICE +#define LDAP_LEVEL_INFO LOG_INFO +#define LDAP_LEVEL_DEBUG LOG_DEBUG +#else /* ! LOG_DEBUG */ +#define LDAP_LEVEL_EMERG (0) +#define LDAP_LEVEL_ALERT (1) +#define LDAP_LEVEL_CRIT (2) +#define LDAP_LEVEL_ERR (3) +#define LDAP_LEVEL_WARNING (4) +#define LDAP_LEVEL_NOTICE (5) +#define LDAP_LEVEL_INFO (6) +#define LDAP_LEVEL_DEBUG (7) +#endif /* ! LOG_DEBUG */ +#endif /* ! OLD_DEBUG */ +#if 0 +/* in case we need to reuse the unused bits of severity */ +#define LDAP_LEVEL_MASK(s) ((s) & 0x7) +#else +#define LDAP_LEVEL_MASK(s) (s) +#endif + +/* (yet) unused */ +#define LDAP_LEVEL_ENTRY (0x08) /* log function entry points */ +#define LDAP_LEVEL_ARGS (0x10) /* log function call parameters */ +#define LDAP_LEVEL_RESULTS (0x20) /* Log function results */ +#define LDAP_LEVEL_DETAIL1 (0x40) /* log level 1 function operational details */ +#define LDAP_LEVEL_DETAIL2 (0x80) /* Log level 2 function operational details */ +/* end of (yet) unused */ + +/* original subsystem selection mechanism */ +#define LDAP_DEBUG_TRACE 0x0001 +#define LDAP_DEBUG_PACKETS 0x0002 +#define LDAP_DEBUG_ARGS 0x0004 +#define LDAP_DEBUG_CONNS 0x0008 +#define LDAP_DEBUG_BER 0x0010 +#define LDAP_DEBUG_FILTER 0x0020 +#define LDAP_DEBUG_CONFIG 0x0040 +#define LDAP_DEBUG_ACL 0x0080 +#define LDAP_DEBUG_STATS 0x0100 +#define LDAP_DEBUG_STATS2 0x0200 +#define LDAP_DEBUG_SHELL 0x0400 +#define LDAP_DEBUG_PARSE 0x0800 +#if 0 /* no longer used (nor supported) */ +#define LDAP_DEBUG_CACHE 0x1000 +#define LDAP_DEBUG_INDEX 0x2000 +#endif +#define LDAP_DEBUG_SYNC 0x4000 + +#define LDAP_DEBUG_NONE 0x8000 +#define LDAP_DEBUG_ANY (-1) + +/* debugging stuff */ +#ifdef LDAP_DEBUG + /* + * This is a bogus extern declaration for the compiler. No need to ensure + * a 'proper' dllimport. + */ +#ifndef ldap_debug +extern int ldap_debug; +#endif /* !ldap_debug */ + +#ifdef LDAP_SYSLOG +extern int ldap_syslog; +extern int ldap_syslog_level; + +#ifdef HAVE_EBCDIC +#define syslog eb_syslog +extern void eb_syslog(int pri, const char *fmt, ...); +#endif /* HAVE_EBCDIC */ + +#endif /* LDAP_SYSLOG */ + +/* this doesn't below as part of ldap.h */ +#ifdef LDAP_SYSLOG +#define Log0( level, severity, fmt ) \ + do { \ + if ( ldap_debug & (level) ) \ + lutil_debug( ldap_debug, (level), (fmt) ); \ + if ( ldap_syslog & (level) ) \ + syslog( LDAP_LEVEL_MASK((severity)), (fmt) ); \ + } while ( 0 ) +#define Log1( level, severity, fmt, arg1 ) \ + do { \ + if ( ldap_debug & (level) ) \ + lutil_debug( ldap_debug, (level), (fmt), (arg1) ); \ + if ( ldap_syslog & (level) ) \ + syslog( LDAP_LEVEL_MASK((severity)), (fmt), (arg1) ); \ + } while ( 0 ) +#define Log2( level, severity, fmt, arg1, arg2 ) \ + do { \ + if ( ldap_debug & (level) ) \ + lutil_debug( ldap_debug, (level), (fmt), (arg1), (arg2) ); \ + if ( ldap_syslog & (level) ) \ + syslog( LDAP_LEVEL_MASK((severity)), (fmt), (arg1), (arg2) ); \ + } while ( 0 ) +#define Log3( level, severity, fmt, arg1, arg2, arg3 ) \ + do { \ + if ( ldap_debug & (level) ) \ + lutil_debug( ldap_debug, (level), (fmt), (arg1), (arg2), (arg3) ); \ + if ( ldap_syslog & (level) ) \ + syslog( LDAP_LEVEL_MASK((severity)), (fmt), (arg1), (arg2), (arg3) ); \ + } while ( 0 ) +#define Log4( level, severity, fmt, arg1, arg2, arg3, arg4 ) \ + do { \ + if ( ldap_debug & (level) ) \ + lutil_debug( ldap_debug, (level), (fmt), (arg1), (arg2), (arg3), (arg4) ); \ + if ( ldap_syslog & (level) ) \ + syslog( LDAP_LEVEL_MASK((severity)), (fmt), (arg1), (arg2), (arg3), (arg4) ); \ + } while ( 0 ) +#define Log5( level, severity, fmt, arg1, arg2, arg3, arg4, arg5 ) \ + do { \ + if ( ldap_debug & (level) ) \ + lutil_debug( ldap_debug, (level), (fmt), (arg1), (arg2), (arg3), (arg4), (arg5) ); \ + if ( ldap_syslog & (level) ) \ + syslog( LDAP_LEVEL_MASK((severity)), (fmt), (arg1), (arg2), (arg3), (arg4), (arg5) ); \ + } while ( 0 ) +#define Debug( level, fmt, arg1, arg2, arg3 ) \ + Log3( (level), ldap_syslog_level, (fmt), (arg1), (arg2), (arg3) ) +#define LogTest(level) ( ( ldap_debug | ldap_syslog ) & (level) ) + +#else /* ! LDAP_SYSLOG */ +#define Log0( level, severity, fmt ) \ + do { \ + if ( ldap_debug & (level) ) \ + lutil_debug( ldap_debug, (level), (fmt) ); \ + } while ( 0 ) +#define Log1( level, severity, fmt, arg1 ) \ + do { \ + if ( ldap_debug & (level) ) \ + lutil_debug( ldap_debug, (level), (fmt), (arg1) ); \ + } while ( 0 ) +#define Log2( level, severity, fmt, arg1, arg2 ) \ + do { \ + if ( ldap_debug & (level) ) \ + lutil_debug( ldap_debug, (level), (fmt), (arg1), (arg2) ); \ + } while ( 0 ) +#define Log3( level, severity, fmt, arg1, arg2, arg3 ) \ + do { \ + if ( ldap_debug & (level) ) \ + lutil_debug( ldap_debug, (level), (fmt), (arg1), (arg2), (arg3) ); \ + } while ( 0 ) +#define Log4( level, severity, fmt, arg1, arg2, arg3, arg4 ) \ + do { \ + if ( ldap_debug & (level) ) \ + lutil_debug( ldap_debug, (level), (fmt), (arg1), (arg2), (arg3), (arg4) ); \ + } while ( 0 ) +#define Log5( level, severity, fmt, arg1, arg2, arg3, arg4, arg5 ) \ + do { \ + if ( ldap_debug & (level) ) \ + lutil_debug( ldap_debug, (level), (fmt), (arg1), (arg2), (arg3), (arg4), (arg5) ); \ + } while ( 0 ) +#define Debug( level, fmt, arg1, arg2, arg3 ) \ + Log3( (level), 0, (fmt), (arg1), (arg2), (arg3) ) +#define LogTest(level) ( ldap_debug & (level) ) +#endif /* ! LDAP_SYSLOG */ +#else /* ! LDAP_DEBUG */ +/* TODO: in case LDAP_DEBUG is undefined, make sure logs with appropriate + * severity gets thru anyway */ +#define Log0( level, severity, fmt ) ((void)0) +#define Log1( level, severity, fmt, arg1 ) ((void)0) +#define Log2( level, severity, fmt, arg1, arg2 ) ((void)0) +#define Log3( level, severity, fmt, arg1, arg2, arg3 ) ((void)0) +#define Log4( level, severity, fmt, arg1, arg2, arg3, arg4 ) ((void)0) +#define Log5( level, severity, fmt, arg1, arg2, arg3, arg4, arg5 ) ((void)0) +#define Debug( level, fmt, arg1, arg2, arg3 ) ((void)0) +#define LogTest(level) ( 0 ) +#endif /* ! LDAP_DEBUG */ + +/* Actually now in liblber/debug.c */ +LDAP_LUTIL_F(int) lutil_debug_file LDAP_P(( FILE *file )); + +LDAP_LUTIL_F(void) lutil_debug LDAP_P(( + int debug, int level, + const char* fmt, ... )) LDAP_GCCATTR((format(printf, 3, 4))); + +#ifdef LDAP_DEFINE_LDAP_DEBUG +/* This struct matches the head of ldapoptions in */ +struct ldapoptions_prefix { + short ldo_valid; + int ldo_debug; +}; +#define ldap_debug \ + (*(int *) ((char *)&ldap_int_global_options \ + + offsetof(struct ldapoptions_prefix, ldo_debug))) + +struct ldapoptions; +LDAP_V ( struct ldapoptions ) ldap_int_global_options; +#endif /* LDAP_DEFINE_LDAP_DEBUG */ + +LDAP_END_DECL + +#endif /* LDAP_LOG_H */ diff --git a/deps/include/ldap_pvt.h b/deps/include/ldap_pvt.h new file mode 100644 index 0000000..ceb7c21 --- /dev/null +++ b/deps/include/ldap_pvt.h @@ -0,0 +1,538 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +/* ldap-pvt.h - Header for ldap_pvt_ functions. + * These are meant to be internal to OpenLDAP Software. + */ + +#ifndef _LDAP_PVT_H +#define _LDAP_PVT_H 1 + +#include /* get public interfaces */ +#include /* get ber_slen_t */ +#include /* get Sockbuf_Buf */ + +LDAP_BEGIN_DECL + +LDAP_F ( int ) +ldap_pvt_url_scheme2proto LDAP_P(( + const char * )); +LDAP_F ( int ) +ldap_pvt_url_scheme2tls LDAP_P(( + const char * )); + +LDAP_F ( int ) +ldap_pvt_url_scheme_port LDAP_P(( + const char *, int )); + +struct ldap_url_desc; /* avoid pulling in */ + +#define LDAP_PVT_URL_PARSE_NONE (0x00U) +#define LDAP_PVT_URL_PARSE_NOEMPTY_HOST (0x01U) +#define LDAP_PVT_URL_PARSE_DEF_PORT (0x02U) +#define LDAP_PVT_URL_PARSE_NOEMPTY_DN (0x04U) +#define LDAP_PVT_URL_PARSE_NODEF_SCOPE (0x08U) +#define LDAP_PVT_URL_PARSE_HISTORIC (LDAP_PVT_URL_PARSE_NODEF_SCOPE | \ + LDAP_PVT_URL_PARSE_NOEMPTY_HOST | \ + LDAP_PVT_URL_PARSE_DEF_PORT) + +LDAP_F( int ) +ldap_url_parse_ext LDAP_P(( + LDAP_CONST char *url, + struct ldap_url_desc **ludpp, + unsigned flags )); + +LDAP_F (int) ldap_url_parselist LDAP_P(( /* deprecated, use ldap_url_parselist_ext() */ + struct ldap_url_desc **ludlist, + const char *url )); + +LDAP_F (int) ldap_url_parselist_ext LDAP_P(( + struct ldap_url_desc **ludlist, + const char *url, + const char *sep, + unsigned flags )); + +LDAP_F (char *) ldap_url_list2urls LDAP_P(( + struct ldap_url_desc *ludlist )); + +LDAP_F (void) ldap_free_urllist LDAP_P(( + struct ldap_url_desc *ludlist )); + +LDAP_F (int) ldap_pvt_scope2bv LDAP_P (( + int scope, struct berval *bv )); + +LDAP_F (LDAP_CONST char *) ldap_pvt_scope2str LDAP_P (( + int scope )); + +LDAP_F (int) ldap_pvt_bv2scope LDAP_P (( + struct berval *bv )); + +LDAP_F (int) ldap_pvt_str2scope LDAP_P (( + LDAP_CONST char * )); + +LDAP_F( char * ) +ldap_pvt_ctime LDAP_P(( + const time_t *tp, + char *buf )); + +# if defined( HAVE_GMTIME_R ) +# define USE_GMTIME_R +# define ldap_pvt_gmtime(timep, result) gmtime_r((timep), (result)) +# else +LDAP_F( struct tm * ) +ldap_pvt_gmtime LDAP_P(( + LDAP_CONST time_t *timep, + struct tm *result )); +#endif + +# if defined( HAVE_LOCALTIME_R ) +# define USE_LOCALTIME_R +# define ldap_pvt_localtime(timep, result) localtime_r((timep), (result)) +# else +LDAP_F( struct tm * ) +ldap_pvt_localtime LDAP_P(( + LDAP_CONST time_t *timep, + struct tm *result )); +# endif + +#if defined( USE_GMTIME_R ) && defined( USE_LOCALTIME_R ) +# define ldap_pvt_gmtime_lock() (0) +# define ldap_pvt_gmtime_unlock() (0) +#else +LDAP_F( int ) +ldap_pvt_gmtime_lock LDAP_P(( void )); + +LDAP_F( int ) +ldap_pvt_gmtime_unlock LDAP_P(( void )); +#endif /* USE_GMTIME_R && USE_LOCALTIME_R */ + +/* Get current time as a structured time */ +struct lutil_tm; +LDAP_F( void ) +ldap_pvt_gettime LDAP_P(( struct lutil_tm * )); + +#ifdef _WIN32 +#define gettimeofday(tv,tz) ldap_pvt_gettimeofday(tv,tz) +struct timeval; +LDAP_F( int ) +ldap_pvt_gettimeofday LDAP_P(( struct timeval *tv, void *unused )); +#endif + +/* use this macro to allocate buffer for ldap_pvt_csnstr */ +#define LDAP_PVT_CSNSTR_BUFSIZE 64 +LDAP_F( size_t ) +ldap_pvt_csnstr( char *buf, size_t len, unsigned int replica, unsigned int mod ); + +LDAP_F( char *) ldap_pvt_get_fqdn LDAP_P(( char * )); + +struct hostent; /* avoid pulling in */ + +LDAP_F( int ) +ldap_pvt_gethostbyname_a LDAP_P(( + const char *name, + struct hostent *resbuf, + char **buf, + struct hostent **result, + int *herrno_ptr )); + +LDAP_F( int ) +ldap_pvt_gethostbyaddr_a LDAP_P(( + const char *addr, + int len, + int type, + struct hostent *resbuf, + char **buf, + struct hostent **result, + int *herrno_ptr )); + +struct sockaddr; + +LDAP_F( int ) +ldap_pvt_get_hname LDAP_P(( + const struct sockaddr * sa, + int salen, + char *name, + int namelen, + char **herr )); + + +/* charray.c */ + +LDAP_F( int ) +ldap_charray_add LDAP_P(( + char ***a, + const char *s )); + +LDAP_F( int ) +ldap_charray_merge LDAP_P(( + char ***a, + char **s )); + +LDAP_F( void ) +ldap_charray_free LDAP_P(( char **a )); + +LDAP_F( int ) +ldap_charray_inlist LDAP_P(( + char **a, + const char *s )); + +LDAP_F( char ** ) +ldap_charray_dup LDAP_P(( char **a )); + +LDAP_F( char ** ) +ldap_str2charray LDAP_P(( + const char *str, + const char *brkstr )); + +LDAP_F( char * ) +ldap_charray2str LDAP_P(( + char **array, const char* sep )); + +/* getdn.c */ + +#ifdef LDAP_AVA_NULL /* in ldap.h */ +LDAP_F( void ) ldap_rdnfree_x LDAP_P(( LDAPRDN rdn, void *ctx )); +LDAP_F( void ) ldap_dnfree_x LDAP_P(( LDAPDN dn, void *ctx )); + +LDAP_F( int ) ldap_bv2dn_x LDAP_P(( + struct berval *bv, LDAPDN *dn, unsigned flags, void *ctx )); +LDAP_F( int ) ldap_dn2bv_x LDAP_P(( + LDAPDN dn, struct berval *bv, unsigned flags, void *ctx )); +LDAP_F( int ) ldap_bv2rdn_x LDAP_P(( + struct berval *, LDAPRDN *, char **, unsigned flags, void *ctx )); +LDAP_F( int ) ldap_rdn2bv_x LDAP_P(( + LDAPRDN rdn, struct berval *bv, unsigned flags, void *ctx )); +#endif /* LDAP_AVA_NULL */ + +/* url.c */ +LDAP_F (void) ldap_pvt_hex_unescape LDAP_P(( char *s )); + +/* + * these macros assume 'x' is an ASCII x + * and assume the "C" locale + */ +#define LDAP_ASCII(c) (!((c) & 0x80)) +#define LDAP_SPACE(c) ((c) == ' ' || (c) == '\t' || (c) == '\n') +#define LDAP_DIGIT(c) ((c) >= '0' && (c) <= '9') +#define LDAP_LOWER(c) ((c) >= 'a' && (c) <= 'z') +#define LDAP_UPPER(c) ((c) >= 'A' && (c) <= 'Z') +#define LDAP_ALPHA(c) (LDAP_LOWER(c) || LDAP_UPPER(c)) +#define LDAP_ALNUM(c) (LDAP_ALPHA(c) || LDAP_DIGIT(c)) + +#define LDAP_LDH(c) (LDAP_ALNUM(c) || (c) == '-') + +#define LDAP_HEXLOWER(c) ((c) >= 'a' && (c) <= 'f') +#define LDAP_HEXUPPER(c) ((c) >= 'A' && (c) <= 'F') +#define LDAP_HEX(c) (LDAP_DIGIT(c) || \ + LDAP_HEXLOWER(c) || LDAP_HEXUPPER(c)) + +/* controls.c */ +struct ldapcontrol; +LDAP_F (int) +ldap_pvt_put_control LDAP_P(( + const struct ldapcontrol *c, + BerElement *ber )); +LDAP_F (int) ldap_pvt_get_controls LDAP_P(( + BerElement *be, + struct ldapcontrol ***ctrlsp)); + +#ifdef HAVE_CYRUS_SASL +/* cyrus.c */ +struct sasl_security_properties; /* avoid pulling in */ +LDAP_F (int) ldap_pvt_sasl_secprops LDAP_P(( + const char *in, + struct sasl_security_properties *secprops )); +LDAP_F (void) ldap_pvt_sasl_secprops_unparse LDAP_P(( + struct sasl_security_properties *secprops, + struct berval *out )); + +LDAP_F (void *) ldap_pvt_sasl_mutex_new LDAP_P((void)); +LDAP_F (int) ldap_pvt_sasl_mutex_lock LDAP_P((void *mutex)); +LDAP_F (int) ldap_pvt_sasl_mutex_unlock LDAP_P((void *mutex)); +LDAP_F (void) ldap_pvt_sasl_mutex_dispose LDAP_P((void *mutex)); +#endif /* HAVE_CYRUS_SASL */ + +struct sockbuf; /* avoid pulling in */ +LDAP_F (int) ldap_pvt_sasl_install LDAP_P(( struct sockbuf *, void * )); +LDAP_F (void) ldap_pvt_sasl_remove LDAP_P(( struct sockbuf * )); + +/* + * SASL encryption support for LBER Sockbufs + */ + +struct sb_sasl_generic_data; + +struct sb_sasl_generic_ops { + void (*init)(struct sb_sasl_generic_data *p, + ber_len_t *min_send, + ber_len_t *max_send, + ber_len_t *max_recv); + ber_int_t (*encode)(struct sb_sasl_generic_data *p, + unsigned char *buf, + ber_len_t len, + Sockbuf_Buf *dst); + ber_int_t (*decode)(struct sb_sasl_generic_data *p, + const Sockbuf_Buf *src, + Sockbuf_Buf *dst); + void (*reset_buf)(struct sb_sasl_generic_data *p, + Sockbuf_Buf *buf); + void (*fini)(struct sb_sasl_generic_data *p); +}; + +struct sb_sasl_generic_install { + const struct sb_sasl_generic_ops *ops; + void *ops_private; +}; + +struct sb_sasl_generic_data { + const struct sb_sasl_generic_ops *ops; + void *ops_private; + Sockbuf_IO_Desc *sbiod; + ber_len_t min_send; + ber_len_t max_send; + ber_len_t max_recv; + Sockbuf_Buf sec_buf_in; + Sockbuf_Buf buf_in; + Sockbuf_Buf buf_out; + unsigned int flags; +#define LDAP_PVT_SASL_PARTIAL_WRITE 1 +}; + +#ifndef LDAP_PVT_SASL_LOCAL_SSF +#define LDAP_PVT_SASL_LOCAL_SSF 71 /* SSF for Unix Domain Sockets */ +#endif /* ! LDAP_PVT_SASL_LOCAL_SSF */ + +struct ldap; +struct ldapmsg; + +/* abandon */ +LDAP_F ( int ) ldap_pvt_discard LDAP_P(( + struct ldap *ld, ber_int_t msgid )); + +/* messages.c */ +LDAP_F( BerElement * ) +ldap_get_message_ber LDAP_P(( + struct ldapmsg * )); + +/* open */ +LDAP_F (int) ldap_open_internal_connection LDAP_P(( + struct ldap **ldp, ber_socket_t *fdp )); + +/* sasl.c */ +LDAP_F (int) ldap_pvt_sasl_generic_install LDAP_P(( Sockbuf *sb, + struct sb_sasl_generic_install *install_arg )); +LDAP_F (void) ldap_pvt_sasl_generic_remove LDAP_P(( Sockbuf *sb )); + +/* search.c */ +LDAP_F( int ) ldap_pvt_put_filter LDAP_P(( + BerElement *ber, + const char *str )); + +LDAP_F( char * ) +ldap_pvt_find_wildcard LDAP_P(( const char *s )); + +LDAP_F( ber_slen_t ) +ldap_pvt_filter_value_unescape LDAP_P(( char *filter )); + +LDAP_F( ber_len_t ) +ldap_bv2escaped_filter_value_len LDAP_P(( struct berval *in )); + +LDAP_F( int ) +ldap_bv2escaped_filter_value_x LDAP_P(( struct berval *in, struct berval *out, + int inplace, void *ctx )); + +LDAP_F (int) ldap_pvt_search LDAP_P(( + struct ldap *ld, + LDAP_CONST char *base, + int scope, + LDAP_CONST char *filter, + char **attrs, + int attrsonly, + struct ldapcontrol **sctrls, + struct ldapcontrol **cctrls, + struct timeval *timeout, + int sizelimit, + int deref, + int *msgidp )); + +LDAP_F(int) ldap_pvt_search_s LDAP_P(( + struct ldap *ld, + LDAP_CONST char *base, + int scope, + LDAP_CONST char *filter, + char **attrs, + int attrsonly, + struct ldapcontrol **sctrls, + struct ldapcontrol **cctrls, + struct timeval *timeout, + int sizelimit, + int deref, + struct ldapmsg **res )); + +/* string.c */ +LDAP_F( char * ) +ldap_pvt_str2upper LDAP_P(( char *str )); + +LDAP_F( char * ) +ldap_pvt_str2lower LDAP_P(( char *str )); + +LDAP_F( struct berval * ) +ldap_pvt_str2upperbv LDAP_P(( char *str, struct berval *bv )); + +LDAP_F( struct berval * ) +ldap_pvt_str2lowerbv LDAP_P(( char *str, struct berval *bv )); + +/* tls.c */ +LDAP_F (int) ldap_int_tls_config LDAP_P(( struct ldap *ld, + int option, const char *arg )); +LDAP_F (int) ldap_pvt_tls_get_option LDAP_P(( struct ldap *ld, + int option, void *arg )); +LDAP_F (int) ldap_pvt_tls_set_option LDAP_P(( struct ldap *ld, + int option, void *arg )); + +LDAP_F (void) ldap_pvt_tls_destroy LDAP_P(( void )); +LDAP_F (int) ldap_pvt_tls_init LDAP_P(( void )); +LDAP_F (int) ldap_pvt_tls_init_def_ctx LDAP_P(( int is_server )); +LDAP_F (int) ldap_pvt_tls_accept LDAP_P(( Sockbuf *sb, void *ctx_arg )); +LDAP_F (int) ldap_pvt_tls_inplace LDAP_P(( Sockbuf *sb )); +LDAP_F (void *) ldap_pvt_tls_sb_ctx LDAP_P(( Sockbuf *sb )); +LDAP_F (void) ldap_pvt_tls_ctx_free LDAP_P(( void * )); + +typedef int LDAPDN_rewrite_dummy LDAP_P (( void *dn, unsigned flags )); + +typedef int (LDAP_TLS_CONNECT_CB) LDAP_P (( struct ldap *ld, void *ssl, + void *ctx, void *arg )); + +LDAP_F (int) ldap_pvt_tls_get_my_dn LDAP_P(( void *ctx, struct berval *dn, + LDAPDN_rewrite_dummy *func, unsigned flags )); +LDAP_F (int) ldap_pvt_tls_get_peer_dn LDAP_P(( void *ctx, struct berval *dn, + LDAPDN_rewrite_dummy *func, unsigned flags )); +LDAP_F (int) ldap_pvt_tls_get_strength LDAP_P(( void *ctx )); + +LDAP_END_DECL + +/* + * Multiple precision stuff + * + * May use OpenSSL's BIGNUM if built with TLS, + * or GNU's multiple precision library. But if + * long long is available, that's big enough + * and much more efficient. + * + * If none is available, unsigned long data is used. + */ + +LDAP_BEGIN_DECL + +#ifdef USE_MP_BIGNUM +/* + * Use OpenSSL's BIGNUM + */ +#include +#include + +typedef BIGNUM* ldap_pvt_mp_t; +#define LDAP_PVT_MP_INIT (NULL) + +#define ldap_pvt_mp_init(mp) \ + do { (mp) = BN_new(); } while (0) + +/* FIXME: we rely on mpr being initialized */ +#define ldap_pvt_mp_init_set(mpr,mpv) \ + do { ldap_pvt_mp_init((mpr)); BN_add((mpr), (mpr), (mpv)); } while (0) + +#define ldap_pvt_mp_add(mpr,mpv) \ + BN_add((mpr), (mpr), (mpv)) + +#define ldap_pvt_mp_add_ulong(mp,v) \ + BN_add_word((mp), (v)) + +#define ldap_pvt_mp_clear(mp) \ + do { BN_free((mp)); (mp) = 0; } while (0) + +#elif defined(USE_MP_GMP) +/* + * Use GNU's multiple precision library + */ +#include + +typedef mpz_t ldap_pvt_mp_t; +#define LDAP_PVT_MP_INIT { 0 } + +#define ldap_pvt_mp_init(mp) \ + mpz_init((mp)) + +#define ldap_pvt_mp_init_set(mpr,mpv) \ + mpz_init_set((mpr), (mpv)) + +#define ldap_pvt_mp_add(mpr,mpv) \ + mpz_add((mpr), (mpr), (mpv)) + +#define ldap_pvt_mp_add_ulong(mp,v) \ + mpz_add_ui((mp), (mp), (v)) + +#define ldap_pvt_mp_clear(mp) \ + mpz_clear((mp)) + +#else +/* + * Use unsigned long long + */ + +#ifdef USE_MP_LONG_LONG +typedef unsigned long long ldap_pvt_mp_t; +#define LDAP_PVT_MP_INIT (0LL) +#elif defined(USE_MP_LONG) +typedef unsigned long ldap_pvt_mp_t; +#define LDAP_PVT_MP_INIT (0L) +#elif defined(HAVE_LONG_LONG) +typedef unsigned long long ldap_pvt_mp_t; +#define LDAP_PVT_MP_INIT (0LL) +#else +typedef unsigned long ldap_pvt_mp_t; +#define LDAP_PVT_MP_INIT (0L) +#endif + +#define ldap_pvt_mp_init(mp) \ + do { (mp) = 0; } while (0) + +#define ldap_pvt_mp_init_set(mpr,mpv) \ + do { (mpr) = (mpv); } while (0) + +#define ldap_pvt_mp_add(mpr,mpv) \ + do { (mpr) += (mpv); } while (0) + +#define ldap_pvt_mp_add_ulong(mp,v) \ + do { (mp) += (v); } while (0) + +#define ldap_pvt_mp_clear(mp) \ + do { (mp) = 0; } while (0) + +#endif /* MP */ + +#include "ldap_pvt_uc.h" + +LDAP_END_DECL + +LDAP_BEGIN_DECL + +#include /* get CHAR_BIT */ + +/* Buffer space for sign, decimal digits and \0. Note: log10(2) < 146/485. */ +#define LDAP_PVT_INTTYPE_CHARS(type) (((sizeof(type)*CHAR_BIT-1)*146)/485 + 3) + +LDAP_END_DECL + +#endif /* _LDAP_PVT_H */ diff --git a/deps/include/ldap_pvt_thread.h b/deps/include/ldap_pvt_thread.h new file mode 100644 index 0000000..7509490 --- /dev/null +++ b/deps/include/ldap_pvt_thread.h @@ -0,0 +1,320 @@ +/* ldap_pvt_thread.h - ldap threads header file */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _LDAP_PVT_THREAD_H +#define _LDAP_PVT_THREAD_H /* libldap_r/ldap_thr_debug.h #undefines this */ + +#include "ldap_cdefs.h" +#include "ldap_int_thread.h" + +LDAP_BEGIN_DECL + +#ifndef LDAP_PVT_THREAD_H_DONE +typedef ldap_int_thread_t ldap_pvt_thread_t; +#ifdef LDAP_THREAD_DEBUG_WRAP +typedef ldap_debug_thread_mutex_t ldap_pvt_thread_mutex_t; +typedef ldap_debug_thread_cond_t ldap_pvt_thread_cond_t; +typedef ldap_debug_thread_rdwr_t ldap_pvt_thread_rdwr_t; +#define LDAP_PVT_MUTEX_FIRSTCREATE LDAP_DEBUG_MUTEX_FIRSTCREATE +#define LDAP_PVT_MUTEX_NULL LDAP_DEBUG_MUTEX_NULL +#else +typedef ldap_int_thread_mutex_t ldap_pvt_thread_mutex_t; +typedef ldap_int_thread_cond_t ldap_pvt_thread_cond_t; +typedef ldap_int_thread_rdwr_t ldap_pvt_thread_rdwr_t; +#define LDAP_PVT_MUTEX_FIRSTCREATE LDAP_INT_MUTEX_FIRSTCREATE +#define LDAP_PVT_MUTEX_NULL LDAP_INT_MUTEX_NULL +#endif +typedef ldap_int_thread_rmutex_t ldap_pvt_thread_rmutex_t; +typedef ldap_int_thread_key_t ldap_pvt_thread_key_t; +#endif /* !LDAP_PVT_THREAD_H_DONE */ + +#define ldap_pvt_thread_equal ldap_int_thread_equal + +LDAP_F( int ) +ldap_pvt_thread_initialize LDAP_P(( void )); + +LDAP_F( int ) +ldap_pvt_thread_destroy LDAP_P(( void )); + +LDAP_F( unsigned int ) +ldap_pvt_thread_sleep LDAP_P(( unsigned int s )); + +LDAP_F( int ) +ldap_pvt_thread_get_concurrency LDAP_P(( void )); + +LDAP_F( int ) +ldap_pvt_thread_set_concurrency LDAP_P(( int )); + +#define LDAP_PVT_THREAD_CREATE_JOINABLE 0 +#define LDAP_PVT_THREAD_CREATE_DETACHED 1 + +#ifndef LDAP_PVT_THREAD_H_DONE +#define LDAP_PVT_THREAD_SET_STACK_SIZE +/* The size may be explicitly #defined to zero to disable it. */ +#if defined( LDAP_PVT_THREAD_STACK_SIZE ) && LDAP_PVT_THREAD_STACK_SIZE == 0 +# undef LDAP_PVT_THREAD_SET_STACK_SIZE +#elif !defined( LDAP_PVT_THREAD_STACK_SIZE ) + /* LARGE stack. Will be twice as large on 64 bit machine. */ +# define LDAP_PVT_THREAD_STACK_SIZE ( 1 * 1024 * 1024 * sizeof(void *) ) +#endif +#endif /* !LDAP_PVT_THREAD_H_DONE */ + +LDAP_F( int ) +ldap_pvt_thread_create LDAP_P(( + ldap_pvt_thread_t * thread, + int detach, + void *(*start_routine)( void * ), + void *arg)); + +LDAP_F( void ) +ldap_pvt_thread_exit LDAP_P(( void *retval )); + +LDAP_F( int ) +ldap_pvt_thread_join LDAP_P(( ldap_pvt_thread_t thread, void **status )); + +LDAP_F( int ) +ldap_pvt_thread_kill LDAP_P(( ldap_pvt_thread_t thread, int signo )); + +LDAP_F( int ) +ldap_pvt_thread_yield LDAP_P(( void )); + +LDAP_F( int ) +ldap_pvt_thread_cond_init LDAP_P(( ldap_pvt_thread_cond_t *cond )); + +LDAP_F( int ) +ldap_pvt_thread_cond_destroy LDAP_P(( ldap_pvt_thread_cond_t *cond )); + +LDAP_F( int ) +ldap_pvt_thread_cond_signal LDAP_P(( ldap_pvt_thread_cond_t *cond )); + +LDAP_F( int ) +ldap_pvt_thread_cond_broadcast LDAP_P(( ldap_pvt_thread_cond_t *cond )); + +LDAP_F( int ) +ldap_pvt_thread_cond_wait LDAP_P(( + ldap_pvt_thread_cond_t *cond, + ldap_pvt_thread_mutex_t *mutex )); + +LDAP_F( int ) +ldap_pvt_thread_mutex_init LDAP_P(( ldap_pvt_thread_mutex_t *mutex )); + +LDAP_F( int ) +ldap_pvt_thread_mutex_destroy LDAP_P(( ldap_pvt_thread_mutex_t *mutex )); + +LDAP_F( int ) +ldap_pvt_thread_mutex_lock LDAP_P(( ldap_pvt_thread_mutex_t *mutex )); + +LDAP_F( int ) +ldap_pvt_thread_mutex_trylock LDAP_P(( ldap_pvt_thread_mutex_t *mutex )); + +LDAP_F( int ) +ldap_pvt_thread_mutex_unlock LDAP_P(( ldap_pvt_thread_mutex_t *mutex )); + +LDAP_F( int ) +ldap_pvt_thread_rmutex_init LDAP_P(( ldap_pvt_thread_rmutex_t *rmutex )); + +LDAP_F( int ) +ldap_pvt_thread_rmutex_destroy LDAP_P(( ldap_pvt_thread_rmutex_t *rmutex )); + +LDAP_F( int ) +ldap_pvt_thread_rmutex_lock LDAP_P(( ldap_pvt_thread_rmutex_t *rmutex, + ldap_pvt_thread_t owner)); + +LDAP_F( int ) +ldap_pvt_thread_rmutex_trylock LDAP_P(( ldap_pvt_thread_rmutex_t *rmutex, + ldap_pvt_thread_t owner)); + +LDAP_F( int ) +ldap_pvt_thread_rmutex_unlock LDAP_P(( ldap_pvt_thread_rmutex_t *rmutex, + ldap_pvt_thread_t owner)); + +LDAP_F( ldap_pvt_thread_t ) +ldap_pvt_thread_self LDAP_P(( void )); + +#ifdef LDAP_INT_THREAD_ASSERT_MUTEX_OWNER +#define LDAP_PVT_THREAD_ASSERT_MUTEX_OWNER LDAP_INT_THREAD_ASSERT_MUTEX_OWNER +#else +#define LDAP_PVT_THREAD_ASSERT_MUTEX_OWNER(mutex) ((void) 0) +#endif + +LDAP_F( int ) +ldap_pvt_thread_rdwr_init LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp)); + +LDAP_F( int ) +ldap_pvt_thread_rdwr_destroy LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp)); + +LDAP_F( int ) +ldap_pvt_thread_rdwr_rlock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp)); + +LDAP_F( int ) +ldap_pvt_thread_rdwr_rtrylock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp)); + +LDAP_F( int ) +ldap_pvt_thread_rdwr_runlock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp)); + +LDAP_F( int ) +ldap_pvt_thread_rdwr_wlock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp)); + +LDAP_F( int ) +ldap_pvt_thread_rdwr_wtrylock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp)); + +LDAP_F( int ) +ldap_pvt_thread_rdwr_wunlock LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp)); + +LDAP_F( int ) +ldap_pvt_thread_key_create LDAP_P((ldap_pvt_thread_key_t *keyp)); + +LDAP_F( int ) +ldap_pvt_thread_key_destroy LDAP_P((ldap_pvt_thread_key_t key)); + +LDAP_F( int ) +ldap_pvt_thread_key_setdata LDAP_P((ldap_pvt_thread_key_t key, void *data)); + +LDAP_F( int ) +ldap_pvt_thread_key_getdata LDAP_P((ldap_pvt_thread_key_t key, void **data)); + +#ifdef LDAP_DEBUG +LDAP_F( int ) +ldap_pvt_thread_rdwr_readers LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp)); + +LDAP_F( int ) +ldap_pvt_thread_rdwr_writers LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp)); + +LDAP_F( int ) +ldap_pvt_thread_rdwr_active LDAP_P((ldap_pvt_thread_rdwr_t *rdwrp)); +#endif /* LDAP_DEBUG */ + +#define LDAP_PVT_THREAD_EINVAL EINVAL +#define LDAP_PVT_THREAD_EBUSY EINVAL + +#ifndef LDAP_PVT_THREAD_H_DONE +typedef ldap_int_thread_pool_t ldap_pvt_thread_pool_t; + +typedef void * (ldap_pvt_thread_start_t) LDAP_P((void *ctx, void *arg)); +typedef void (ldap_pvt_thread_pool_keyfree_t) LDAP_P((void *key, void *data)); +#endif /* !LDAP_PVT_THREAD_H_DONE */ + +LDAP_F( int ) +ldap_pvt_thread_pool_init LDAP_P(( + ldap_pvt_thread_pool_t *pool_out, + int max_threads, + int max_pending )); + +LDAP_F( int ) +ldap_pvt_thread_pool_submit LDAP_P(( + ldap_pvt_thread_pool_t *pool, + ldap_pvt_thread_start_t *start, + void *arg )); + +LDAP_F( int ) +ldap_pvt_thread_pool_retract LDAP_P(( + ldap_pvt_thread_pool_t *pool, + ldap_pvt_thread_start_t *start, + void *arg )); + +LDAP_F( int ) +ldap_pvt_thread_pool_maxthreads LDAP_P(( + ldap_pvt_thread_pool_t *pool, + int max_threads )); + +#ifndef LDAP_PVT_THREAD_H_DONE +typedef enum { + LDAP_PVT_THREAD_POOL_PARAM_UNKNOWN = -1, + LDAP_PVT_THREAD_POOL_PARAM_MAX, + LDAP_PVT_THREAD_POOL_PARAM_MAX_PENDING, + LDAP_PVT_THREAD_POOL_PARAM_OPEN, + LDAP_PVT_THREAD_POOL_PARAM_STARTING, + LDAP_PVT_THREAD_POOL_PARAM_ACTIVE, + LDAP_PVT_THREAD_POOL_PARAM_PAUSING, + LDAP_PVT_THREAD_POOL_PARAM_PENDING, + LDAP_PVT_THREAD_POOL_PARAM_BACKLOAD, + LDAP_PVT_THREAD_POOL_PARAM_ACTIVE_MAX, + LDAP_PVT_THREAD_POOL_PARAM_PENDING_MAX, + LDAP_PVT_THREAD_POOL_PARAM_BACKLOAD_MAX, + LDAP_PVT_THREAD_POOL_PARAM_STATE +} ldap_pvt_thread_pool_param_t; +#endif /* !LDAP_PVT_THREAD_H_DONE */ + +LDAP_F( int ) +ldap_pvt_thread_pool_query LDAP_P(( + ldap_pvt_thread_pool_t *pool, + ldap_pvt_thread_pool_param_t param, void *value )); + +LDAP_F( int ) +ldap_pvt_thread_pool_pausing LDAP_P(( + ldap_pvt_thread_pool_t *pool )); + +LDAP_F( int ) +ldap_pvt_thread_pool_backload LDAP_P(( + ldap_pvt_thread_pool_t *pool )); + +LDAP_F( void ) +ldap_pvt_thread_pool_idle LDAP_P(( + ldap_pvt_thread_pool_t *pool )); + +LDAP_F( void ) +ldap_pvt_thread_pool_unidle LDAP_P(( + ldap_pvt_thread_pool_t *pool )); + +LDAP_F( int ) +ldap_pvt_thread_pool_pausecheck LDAP_P(( + ldap_pvt_thread_pool_t *pool )); + +LDAP_F( int ) +ldap_pvt_thread_pool_pause LDAP_P(( + ldap_pvt_thread_pool_t *pool )); + +LDAP_F( int ) +ldap_pvt_thread_pool_resume LDAP_P(( + ldap_pvt_thread_pool_t *pool )); + +LDAP_F( int ) +ldap_pvt_thread_pool_destroy LDAP_P(( + ldap_pvt_thread_pool_t *pool, + int run_pending )); + +LDAP_F( int ) +ldap_pvt_thread_pool_getkey LDAP_P(( + void *ctx, + void *key, + void **data, + ldap_pvt_thread_pool_keyfree_t **kfree )); + +LDAP_F( int ) +ldap_pvt_thread_pool_setkey LDAP_P(( + void *ctx, + void *key, + void *data, + ldap_pvt_thread_pool_keyfree_t *kfree, + void **olddatap, + ldap_pvt_thread_pool_keyfree_t **oldkfreep )); + +LDAP_F( void ) +ldap_pvt_thread_pool_purgekey LDAP_P(( void *key )); + +LDAP_F( void *) +ldap_pvt_thread_pool_context LDAP_P(( void )); + +LDAP_F( void ) +ldap_pvt_thread_pool_context_reset LDAP_P(( void *key )); + +LDAP_F( ldap_pvt_thread_t ) +ldap_pvt_thread_pool_tid LDAP_P(( void *ctx )); + +LDAP_END_DECL + +#define LDAP_PVT_THREAD_H_DONE +#endif /* _LDAP_PVT_THREAD_H */ diff --git a/deps/include/ldap_pvt_uc.h b/deps/include/ldap_pvt_uc.h new file mode 100644 index 0000000..458b1f8 --- /dev/null +++ b/deps/include/ldap_pvt_uc.h @@ -0,0 +1,163 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +/* + * ldap_pvt_uc.h - Header for Unicode functions. + * These are meant to be used by the OpenLDAP distribution only. + * These should be named ldap_pvt_....() + */ + +#ifndef _LDAP_PVT_UC_H +#define _LDAP_PVT_UC_H 1 + +#include /* get ber_slen_t */ + +#include +#include "../libraries/liblunicode/ucdata/ucdata.h" + +LDAP_BEGIN_DECL + +/* + * UTF-8 (in utf-8.c) + */ + +/* UCDATA uses UCS-2 passed in a 4 byte unsigned int */ +typedef ac_uint4 ldap_unicode_t; + +/* Convert a string with csize octets per character to UTF-8 */ +LDAP_F( int ) ldap_ucs_to_utf8s LDAP_P(( + struct berval *ucs, int csize, struct berval *utf8s )); + + +/* returns the number of bytes in the UTF-8 string */ +LDAP_F (ber_len_t) ldap_utf8_bytes( const char * ); +/* returns the number of UTF-8 characters in the string */ +LDAP_F (ber_len_t) ldap_utf8_chars( const char * ); +/* returns the length (in bytes) of the UTF-8 character */ +LDAP_F (int) ldap_utf8_offset( const char * ); +/* returns the length (in bytes) indicated by the UTF-8 character */ +LDAP_F (int) ldap_utf8_charlen( const char * ); + +/* returns the length (in bytes) indicated by the UTF-8 character + * also checks that shortest possible encoding was used + */ +LDAP_F (int) ldap_utf8_charlen2( const char * ); + +/* copies a UTF-8 character and returning number of bytes copied */ +LDAP_F (int) ldap_utf8_copy( char *, const char *); + +/* returns pointer of next UTF-8 character in string */ +LDAP_F (char*) ldap_utf8_next( const char * ); +/* returns pointer of previous UTF-8 character in string */ +LDAP_F (char*) ldap_utf8_prev( const char * ); + +/* primitive ctype routines -- not aware of non-ascii characters */ +LDAP_F (int) ldap_utf8_isascii( const char * ); +LDAP_F (int) ldap_utf8_isalpha( const char * ); +LDAP_F (int) ldap_utf8_isalnum( const char * ); +LDAP_F (int) ldap_utf8_isdigit( const char * ); +LDAP_F (int) ldap_utf8_isxdigit( const char * ); +LDAP_F (int) ldap_utf8_isspace( const char * ); + +/* span characters not in set, return bytes spanned */ +LDAP_F (ber_len_t) ldap_utf8_strcspn( const char* str, const char *set); +/* span characters in set, return bytes spanned */ +LDAP_F (ber_len_t) ldap_utf8_strspn( const char* str, const char *set); +/* return first occurance of character in string */ +LDAP_F (char *) ldap_utf8_strchr( const char* str, const char *chr); +/* return first character of set in string */ +LDAP_F (char *) ldap_utf8_strpbrk( const char* str, const char *set); +/* reentrant tokenizer */ +LDAP_F (char*) ldap_utf8_strtok( char* sp, const char* sep, char **last); + +/* Optimizations */ +LDAP_V (const char) ldap_utf8_lentab[128]; +LDAP_V (const char) ldap_utf8_mintab[32]; + +#define LDAP_UTF8_ISASCII(p) ( !(*(const unsigned char *)(p) & 0x80 ) ) +#define LDAP_UTF8_CHARLEN(p) ( LDAP_UTF8_ISASCII(p) \ + ? 1 : ldap_utf8_lentab[*(const unsigned char *)(p) ^ 0x80] ) + +/* This is like CHARLEN but additionally validates to make sure + * the char used the shortest possible encoding. + * 'l' is used to temporarily hold the result of CHARLEN. + */ +#define LDAP_UTF8_CHARLEN2(p, l) ( ( ( l = LDAP_UTF8_CHARLEN( p )) < 3 || \ + ( ldap_utf8_mintab[*(const unsigned char *)(p) & 0x1f] & (p)[1] ) ) ? \ + l : 0 ) + +#define LDAP_UTF8_OFFSET(p) ( LDAP_UTF8_ISASCII(p) \ + ? 1 : ldap_utf8_offset((p)) ) + +#define LDAP_UTF8_COPY(d,s) ( LDAP_UTF8_ISASCII(s) \ + ? (*(d) = *(s), 1) : ldap_utf8_copy((d),(s)) ) + +#define LDAP_UTF8_NEXT(p) ( LDAP_UTF8_ISASCII(p) \ + ? (char *)(p)+1 : ldap_utf8_next((p)) ) + +#define LDAP_UTF8_INCR(p) ((p) = LDAP_UTF8_NEXT(p)) + +/* For symmetry */ +#define LDAP_UTF8_PREV(p) (ldap_utf8_prev((p))) +#define LDAP_UTF8_DECR(p) ((p)=LDAP_UTF8_PREV((p))) + + +/* these probably should be renamed */ +LDAP_LUNICODE_F(int) ucstrncmp( + const ldap_unicode_t *, + const ldap_unicode_t *, + ber_len_t ); + +LDAP_LUNICODE_F(int) ucstrncasecmp( + const ldap_unicode_t *, + const ldap_unicode_t *, + ber_len_t ); + +LDAP_LUNICODE_F(ldap_unicode_t *) ucstrnchr( + const ldap_unicode_t *, + ber_len_t, + ldap_unicode_t ); + +LDAP_LUNICODE_F(ldap_unicode_t *) ucstrncasechr( + const ldap_unicode_t *, + ber_len_t, + ldap_unicode_t ); + +LDAP_LUNICODE_F(void) ucstr2upper( + ldap_unicode_t *, + ber_len_t ); + +#define LDAP_UTF8_NOCASEFOLD 0x0U +#define LDAP_UTF8_CASEFOLD 0x1U +#define LDAP_UTF8_ARG1NFC 0x2U +#define LDAP_UTF8_ARG2NFC 0x4U +#define LDAP_UTF8_APPROX 0x8U + +LDAP_LUNICODE_F(struct berval *) UTF8bvnormalize( + struct berval *, + struct berval *, + unsigned, + void *memctx ); + +LDAP_LUNICODE_F(int) UTF8bvnormcmp( + struct berval *, + struct berval *, + unsigned, + void *memctx ); + +LDAP_END_DECL + +#endif + diff --git a/deps/include/ldap_queue.h b/deps/include/ldap_queue.h new file mode 100644 index 0000000..e51a737 --- /dev/null +++ b/deps/include/ldap_queue.h @@ -0,0 +1,556 @@ +/* ldap_queue.h -- queue macros */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 2001-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ +/* Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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. + * + * @(#)queue.h 8.5 (Berkeley) 8/20/94 + * $FreeBSD: src/sys/sys/queue.h,v 1.32.2.5 2001/09/30 21:12:54 luigi Exp $ + * + * See also: ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change + */ +/* ACKNOWLEDGEMENTS: + * This work is derived from FreeBSD queue.h work. Adapted for use in + * OpenLDAP Software by Kurt D. Zeilenga. + */ + +#ifndef _LDAP_QUEUE_H_ +#define _LDAP_QUEUE_H_ + +/* + * This file defines five types of data structures: singly-linked lists, + * singly-linked tail queues, lists, tail queues, and circular queues. + * + * A singly-linked list is headed by a single forward pointer. The elements + * are singly linked for minimum space and pointer manipulation overhead at + * the expense of O(n) removal for arbitrary elements. New elements can be + * added to the list after an existing element or at the head of the list. + * Elements being removed from the head of the list should use the explicit + * macro for this purpose for optimum efficiency. A singly-linked list may + * only be traversed in the forward direction. Singly-linked lists are ideal + * for applications with large datasets and few or no removals or for + * implementing a LIFO queue. + * + * A singly-linked tail queue is headed by a pair of pointers, one to the + * head of the list and the other to the tail of the list. The elements are + * singly linked for minimum space and pointer manipulation overhead at the + * expense of O(n) removal for arbitrary elements. New elements can be added + * to the list after an existing element, at the head of the list, or at the + * end of the list. Elements being removed from the head of the tail queue + * should use the explicit macro for this purpose for optimum efficiency. + * A singly-linked tail queue may only be traversed in the forward direction. + * Singly-linked tail queues are ideal for applications with large datasets + * and few or no removals or for implementing a FIFO queue. + * + * A list is headed by a single forward pointer (or an array of forward + * pointers for a hash table header). The elements are doubly linked + * so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before + * or after an existing element or at the head of the list. A list + * may only be traversed in the forward direction. + * + * A tail queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or + * after an existing element, at the head of the list, or at the end of + * the list. A tail queue may be traversed in either direction. + * + * A circle queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or after + * an existing element, at the head of the list, or at the end of the list. + * A circle queue may be traversed in either direction, but has a more + * complex end of list detection. + * + * For details on the use of these macros, see the queue(3) manual page. + * All macros are prefixed with LDAP_. + * + * SLIST_ LIST_ STAILQ_ TAILQ_ CIRCLEQ_ + * _HEAD + + + + + + * _ENTRY + + + + + + * _INIT + + + + + + * _ENTRY_INIT + + + + + + * _EMPTY + + + + + + * _FIRST + + + + + + * _NEXT + + + + + + * _PREV - - - + + + * _LAST - - + + + + * _FOREACH + + + + + + * _FOREACH_REVERSE - - - + + + * _INSERT_HEAD + + + + + + * _INSERT_BEFORE - + - + + + * _INSERT_AFTER + + + + + + * _INSERT_TAIL - - + + + + * _REMOVE_HEAD + - + - - + * _REMOVE + + + + + + * + */ + +/* + * Singly-linked List definitions. + */ +#define LDAP_SLIST_HEAD(name, type) \ +struct name { \ + struct type *slh_first; /* first element */ \ +} + +#define LDAP_SLIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define LDAP_SLIST_ENTRY(type) \ +struct { \ + struct type *sle_next; /* next element */ \ +} + +#define LDAP_SLIST_ENTRY_INITIALIZER(entry) \ + { NULL } + +/* + * Singly-linked List functions. + */ +#define LDAP_SLIST_EMPTY(head) ((head)->slh_first == NULL) + +#define LDAP_SLIST_FIRST(head) ((head)->slh_first) + +#define LDAP_SLIST_FOREACH(var, head, field) \ + for((var) = (head)->slh_first; (var); (var) = (var)->field.sle_next) + +#define LDAP_SLIST_INIT(head) { \ + (head)->slh_first = NULL; \ +} + +#define LDAP_SLIST_ENTRY_INIT(var, field) { \ + (var)->field.sle_next = NULL; \ +} + +#define LDAP_SLIST_INSERT_AFTER(slistelm, elm, field) do { \ + (elm)->field.sle_next = (slistelm)->field.sle_next; \ + (slistelm)->field.sle_next = (elm); \ +} while (0) + +#define LDAP_SLIST_INSERT_HEAD(head, elm, field) do { \ + (elm)->field.sle_next = (head)->slh_first; \ + (head)->slh_first = (elm); \ +} while (0) + +#define LDAP_SLIST_NEXT(elm, field) ((elm)->field.sle_next) + +#define LDAP_SLIST_REMOVE_HEAD(head, field) do { \ + (head)->slh_first = (head)->slh_first->field.sle_next; \ +} while (0) + +#define LDAP_SLIST_REMOVE(head, elm, type, field) do { \ + if ((head)->slh_first == (elm)) { \ + LDAP_SLIST_REMOVE_HEAD((head), field); \ + } \ + else { \ + struct type *curelm = (head)->slh_first; \ + while( curelm->field.sle_next != (elm) ) \ + curelm = curelm->field.sle_next; \ + curelm->field.sle_next = \ + curelm->field.sle_next->field.sle_next; \ + } \ +} while (0) + +/* + * Singly-linked Tail queue definitions. + */ +#define LDAP_STAILQ_HEAD(name, type) \ +struct name { \ + struct type *stqh_first;/* first element */ \ + struct type **stqh_last;/* addr of last next element */ \ +} + +#define LDAP_STAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).stqh_first } + +#define LDAP_STAILQ_ENTRY(type) \ +struct { \ + struct type *stqe_next; /* next element */ \ +} + +#define LDAP_STAILQ_ENTRY_INITIALIZER(entry) \ + { NULL } + +/* + * Singly-linked Tail queue functions. + */ +#define LDAP_STAILQ_EMPTY(head) ((head)->stqh_first == NULL) + +#define LDAP_STAILQ_INIT(head) do { \ + (head)->stqh_first = NULL; \ + (head)->stqh_last = &(head)->stqh_first; \ +} while (0) + +#define LDAP_STAILQ_ENTRY_INIT(var, field) { \ + (var)->field.stqe_next = NULL; \ +} + +#define LDAP_STAILQ_FIRST(head) ((head)->stqh_first) + +#define LDAP_STAILQ_LAST(head, type, field) \ + (LDAP_STAILQ_EMPTY(head) ? \ + NULL : \ + ((struct type *) \ + ((char *)((head)->stqh_last) - offsetof(struct type, field)))) + +#define LDAP_STAILQ_FOREACH(var, head, field) \ + for((var) = (head)->stqh_first; (var); (var) = (var)->field.stqe_next) + +#define LDAP_STAILQ_INSERT_HEAD(head, elm, field) do { \ + if (((elm)->field.stqe_next = (head)->stqh_first) == NULL) \ + (head)->stqh_last = &(elm)->field.stqe_next; \ + (head)->stqh_first = (elm); \ +} while (0) + +#define LDAP_STAILQ_INSERT_TAIL(head, elm, field) do { \ + (elm)->field.stqe_next = NULL; \ + *(head)->stqh_last = (elm); \ + (head)->stqh_last = &(elm)->field.stqe_next; \ +} while (0) + +#define LDAP_STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \ + if (((elm)->field.stqe_next = (tqelm)->field.stqe_next) == NULL)\ + (head)->stqh_last = &(elm)->field.stqe_next; \ + (tqelm)->field.stqe_next = (elm); \ +} while (0) + +#define LDAP_STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) + +#define LDAP_STAILQ_REMOVE_HEAD(head, field) do { \ + if (((head)->stqh_first = \ + (head)->stqh_first->field.stqe_next) == NULL) \ + (head)->stqh_last = &(head)->stqh_first; \ +} while (0) + +#define LDAP_STAILQ_REMOVE_HEAD_UNTIL(head, elm, field) do { \ + if (((head)->stqh_first = (elm)->field.stqe_next) == NULL) \ + (head)->stqh_last = &(head)->stqh_first; \ +} while (0) + +#define LDAP_STAILQ_REMOVE(head, elm, type, field) do { \ + if ((head)->stqh_first == (elm)) { \ + LDAP_STAILQ_REMOVE_HEAD(head, field); \ + } \ + else { \ + struct type *curelm = (head)->stqh_first; \ + while( curelm->field.stqe_next != (elm) ) \ + curelm = curelm->field.stqe_next; \ + if((curelm->field.stqe_next = \ + curelm->field.stqe_next->field.stqe_next) == NULL) \ + (head)->stqh_last = &(curelm)->field.stqe_next; \ + } \ +} while (0) + +/* + * List definitions. + */ +#define LDAP_LIST_HEAD(name, type) \ +struct name { \ + struct type *lh_first; /* first element */ \ +} + +#define LDAP_LIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define LDAP_LIST_ENTRY(type) \ +struct { \ + struct type *le_next; /* next element */ \ + struct type **le_prev; /* address of previous next element */ \ +} + +#define LDAP_LIST_ENTRY_INITIALIZER(entry) \ + { NULL, NULL } + +/* + * List functions. + */ + +#define LDAP_LIST_EMPTY(head) ((head)->lh_first == NULL) + +#define LDAP_LIST_FIRST(head) ((head)->lh_first) + +#define LDAP_LIST_FOREACH(var, head, field) \ + for((var) = (head)->lh_first; (var); (var) = (var)->field.le_next) + +#define LDAP_LIST_INIT(head) do { \ + (head)->lh_first = NULL; \ +} while (0) + +#define LDAP_LIST_ENTRY_INIT(var, field) do { \ + (var)->field.le_next = NULL; \ + (var)->field.le_prev = NULL; \ +} while (0) + +#define LDAP_LIST_INSERT_AFTER(listelm, elm, field) do { \ + if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \ + (listelm)->field.le_next->field.le_prev = \ + &(elm)->field.le_next; \ + (listelm)->field.le_next = (elm); \ + (elm)->field.le_prev = &(listelm)->field.le_next; \ +} while (0) + +#define LDAP_LIST_INSERT_BEFORE(listelm, elm, field) do { \ + (elm)->field.le_prev = (listelm)->field.le_prev; \ + (elm)->field.le_next = (listelm); \ + *(listelm)->field.le_prev = (elm); \ + (listelm)->field.le_prev = &(elm)->field.le_next; \ +} while (0) + +#define LDAP_LIST_INSERT_HEAD(head, elm, field) do { \ + if (((elm)->field.le_next = (head)->lh_first) != NULL) \ + (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ + (head)->lh_first = (elm); \ + (elm)->field.le_prev = &(head)->lh_first; \ +} while (0) + +#define LDAP_LIST_NEXT(elm, field) ((elm)->field.le_next) + +#define LDAP_LIST_REMOVE(elm, field) do { \ + if ((elm)->field.le_next != NULL) \ + (elm)->field.le_next->field.le_prev = \ + (elm)->field.le_prev; \ + *(elm)->field.le_prev = (elm)->field.le_next; \ +} while (0) + +/* + * Tail queue definitions. + */ +#define LDAP_TAILQ_HEAD(name, type) \ +struct name { \ + struct type *tqh_first; /* first element */ \ + struct type **tqh_last; /* addr of last next element */ \ +} + +#define LDAP_TAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).tqh_first } + +#define LDAP_TAILQ_ENTRY(type) \ +struct { \ + struct type *tqe_next; /* next element */ \ + struct type **tqe_prev; /* address of previous next element */ \ +} + +#define LDAP_TAILQ_ENTRY_INITIALIZER(entry) \ + { NULL, NULL } + +/* + * Tail queue functions. + */ +#define LDAP_TAILQ_EMPTY(head) ((head)->tqh_first == NULL) + +#define LDAP_TAILQ_FOREACH(var, head, field) \ + for (var = LDAP_TAILQ_FIRST(head); var; var = LDAP_TAILQ_NEXT(var, field)) + +#define LDAP_TAILQ_FOREACH_REVERSE(var, head, headname, field) \ + for ((var) = LDAP_TAILQ_LAST((head), headname); \ + (var); \ + (var) = LDAP_TAILQ_PREV((var), headname, field)) + +#define LDAP_TAILQ_FIRST(head) ((head)->tqh_first) + +#define LDAP_TAILQ_LAST(head, headname) \ + (*(((struct headname *)((head)->tqh_last))->tqh_last)) + +#define LDAP_TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) + +#define LDAP_TAILQ_PREV(elm, headname, field) \ + (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) + +#define LDAP_TAILQ_INIT(head) do { \ + (head)->tqh_first = NULL; \ + (head)->tqh_last = &(head)->tqh_first; \ +} while (0) + +#define LDAP_TAILQ_ENTRY_INIT(var, field) do { \ + (var)->field.tqe_next = NULL; \ + (var)->field.tqe_prev = NULL; \ +} while (0) + +#define LDAP_TAILQ_INSERT_HEAD(head, elm, field) do { \ + if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ + (head)->tqh_first->field.tqe_prev = \ + &(elm)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm)->field.tqe_next; \ + (head)->tqh_first = (elm); \ + (elm)->field.tqe_prev = &(head)->tqh_first; \ +} while (0) + +#define LDAP_TAILQ_INSERT_TAIL(head, elm, field) do { \ + (elm)->field.tqe_next = NULL; \ + (elm)->field.tqe_prev = (head)->tqh_last; \ + *(head)->tqh_last = (elm); \ + (head)->tqh_last = &(elm)->field.tqe_next; \ +} while (0) + +#define LDAP_TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ + if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ + (elm)->field.tqe_next->field.tqe_prev = \ + &(elm)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm)->field.tqe_next; \ + (listelm)->field.tqe_next = (elm); \ + (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ +} while (0) + +#define LDAP_TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ + (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ + (elm)->field.tqe_next = (listelm); \ + *(listelm)->field.tqe_prev = (elm); \ + (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ +} while (0) + +#define LDAP_TAILQ_REMOVE(head, elm, field) do { \ + if (((elm)->field.tqe_next) != NULL) \ + (elm)->field.tqe_next->field.tqe_prev = \ + (elm)->field.tqe_prev; \ + else \ + (head)->tqh_last = (elm)->field.tqe_prev; \ + *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ +} while (0) + +/* + * Circular queue definitions. + */ +#define LDAP_CIRCLEQ_HEAD(name, type) \ +struct name { \ + struct type *cqh_first; /* first element */ \ + struct type *cqh_last; /* last element */ \ +} + +#define LDAP_CIRCLEQ_ENTRY(type) \ +struct { \ + struct type *cqe_next; /* next element */ \ + struct type *cqe_prev; /* previous element */ \ +} + +/* + * Circular queue functions. + */ +#define LDAP_CIRCLEQ_EMPTY(head) ((head)->cqh_first == (void *)(head)) + +#define LDAP_CIRCLEQ_FIRST(head) ((head)->cqh_first) + +#define LDAP_CIRCLEQ_FOREACH(var, head, field) \ + for((var) = (head)->cqh_first; \ + (var) != (void *)(head); \ + (var) = (var)->field.cqe_next) + +#define LDAP_CIRCLEQ_FOREACH_REVERSE(var, head, field) \ + for((var) = (head)->cqh_last; \ + (var) != (void *)(head); \ + (var) = (var)->field.cqe_prev) + +#define LDAP_CIRCLEQ_INIT(head) do { \ + (head)->cqh_first = (void *)(head); \ + (head)->cqh_last = (void *)(head); \ +} while (0) + +#define LDAP_CIRCLEQ_ENTRY_INIT(var, field) do { \ + (var)->field.cqe_next = NULL; \ + (var)->field.cqe_prev = NULL; \ +} while (0) + +#define LDAP_CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ + (elm)->field.cqe_next = (listelm)->field.cqe_next; \ + (elm)->field.cqe_prev = (listelm); \ + if ((listelm)->field.cqe_next == (void *)(head)) \ + (head)->cqh_last = (elm); \ + else \ + (listelm)->field.cqe_next->field.cqe_prev = (elm); \ + (listelm)->field.cqe_next = (elm); \ +} while (0) + +#define LDAP_CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \ + (elm)->field.cqe_next = (listelm); \ + (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ + if ((listelm)->field.cqe_prev == (void *)(head)) \ + (head)->cqh_first = (elm); \ + else \ + (listelm)->field.cqe_prev->field.cqe_next = (elm); \ + (listelm)->field.cqe_prev = (elm); \ +} while (0) + +#define LDAP_CIRCLEQ_INSERT_HEAD(head, elm, field) do { \ + (elm)->field.cqe_next = (head)->cqh_first; \ + (elm)->field.cqe_prev = (void *)(head); \ + if ((head)->cqh_last == (void *)(head)) \ + (head)->cqh_last = (elm); \ + else \ + (head)->cqh_first->field.cqe_prev = (elm); \ + (head)->cqh_first = (elm); \ +} while (0) + +#define LDAP_CIRCLEQ_INSERT_TAIL(head, elm, field) do { \ + (elm)->field.cqe_next = (void *)(head); \ + (elm)->field.cqe_prev = (head)->cqh_last; \ + if ((head)->cqh_first == (void *)(head)) \ + (head)->cqh_first = (elm); \ + else \ + (head)->cqh_last->field.cqe_next = (elm); \ + (head)->cqh_last = (elm); \ +} while (0) + +#define LDAP_CIRCLEQ_LAST(head) ((head)->cqh_last) + +#define LDAP_CIRCLEQ_NEXT(elm,field) ((elm)->field.cqe_next) + +#define LDAP_CIRCLEQ_PREV(elm,field) ((elm)->field.cqe_prev) + +#define LDAP_CIRCLEQ_REMOVE(head, elm, field) do { \ + if ((elm)->field.cqe_next == (void *)(head)) \ + (head)->cqh_last = (elm)->field.cqe_prev; \ + else \ + (elm)->field.cqe_next->field.cqe_prev = \ + (elm)->field.cqe_prev; \ + if ((elm)->field.cqe_prev == (void *)(head)) \ + (head)->cqh_first = (elm)->field.cqe_next; \ + else \ + (elm)->field.cqe_prev->field.cqe_next = \ + (elm)->field.cqe_next; \ +} while (0) + +#endif /* !_LDAP_QUEUE_H_ */ diff --git a/deps/include/ldap_rq.h b/deps/include/ldap_rq.h new file mode 100644 index 0000000..26d7dcd --- /dev/null +++ b/deps/include/ldap_rq.h @@ -0,0 +1,101 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef LDAP_RQ_H +#define LDAP_RQ_H 1 + +#include + +LDAP_BEGIN_DECL + +typedef struct re_s { + struct timeval next_sched; + struct timeval interval; + LDAP_STAILQ_ENTRY(re_s) tnext; /* it includes running */ + LDAP_STAILQ_ENTRY(re_s) rnext; + ldap_pvt_thread_start_t *routine; + void *arg; + char *tname; + char *tspec; +} re_t; + +typedef struct runqueue_s { + LDAP_STAILQ_HEAD(l, re_s) task_list; + LDAP_STAILQ_HEAD(rl, re_s) run_list; + ldap_pvt_thread_mutex_t rq_mutex; +} runqueue_t; + +LDAP_F( struct re_s* ) +ldap_pvt_runqueue_insert( + struct runqueue_s* rq, + time_t interval, + ldap_pvt_thread_start_t* routine, + void *arg, + char *tname, + char *tspec +); + +LDAP_F( struct re_s* ) +ldap_pvt_runqueue_find( + struct runqueue_s* rq, + ldap_pvt_thread_start_t* routine, + void *arg +); + +LDAP_F( void ) +ldap_pvt_runqueue_remove( + struct runqueue_s* rq, + struct re_s* entry +); + +LDAP_F( struct re_s* ) +ldap_pvt_runqueue_next_sched( + struct runqueue_s* rq, + struct timeval* next_run +); + +LDAP_F( void ) +ldap_pvt_runqueue_runtask( + struct runqueue_s* rq, + struct re_s* entry +); + +LDAP_F( void ) +ldap_pvt_runqueue_stoptask( + struct runqueue_s* rq, + struct re_s* entry +); + +LDAP_F( int ) +ldap_pvt_runqueue_isrunning( + struct runqueue_s* rq, + struct re_s* entry +); + +LDAP_F( void ) +ldap_pvt_runqueue_resched( + struct runqueue_s* rq, + struct re_s* entry, + int defer +); + +LDAP_F( int ) +ldap_pvt_runqueue_persistent_backload( + struct runqueue_s* rq +); + +LDAP_END_DECL + +#endif diff --git a/deps/include/ldap_schema.h b/deps/include/ldap_schema.h new file mode 100644 index 0000000..220d38a --- /dev/null +++ b/deps/include/ldap_schema.h @@ -0,0 +1,360 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +/* ldap-schema.h - Header for basic schema handling functions that can be + * used by both clients and servers. + * these routines should be renamed ldap_x_... + */ + +#ifndef _LDAP_SCHEMA_H +#define _LDAP_SCHEMA_H 1 + +#include + +LDAP_BEGIN_DECL + +/* Codes for parsing errors */ + +#define LDAP_SCHERR_OUTOFMEM 1 +#define LDAP_SCHERR_UNEXPTOKEN 2 +#define LDAP_SCHERR_NOLEFTPAREN 3 +#define LDAP_SCHERR_NORIGHTPAREN 4 +#define LDAP_SCHERR_NODIGIT 5 +#define LDAP_SCHERR_BADNAME 6 +#define LDAP_SCHERR_BADDESC 7 +#define LDAP_SCHERR_BADSUP 8 +#define LDAP_SCHERR_DUPOPT 9 +#define LDAP_SCHERR_EMPTY 10 +#define LDAP_SCHERR_MISSING 11 +#define LDAP_SCHERR_OUT_OF_ORDER 12 + +typedef struct ldap_schema_extension_item { + char *lsei_name; + char **lsei_values; +} LDAPSchemaExtensionItem; + +typedef struct ldap_syntax { + char *syn_oid; /* REQUIRED */ + char **syn_names; /* OPTIONAL */ + char *syn_desc; /* OPTIONAL */ + LDAPSchemaExtensionItem **syn_extensions; /* OPTIONAL */ +} LDAPSyntax; + +typedef struct ldap_matchingrule { + char *mr_oid; /* REQUIRED */ + char **mr_names; /* OPTIONAL */ + char *mr_desc; /* OPTIONAL */ + int mr_obsolete; /* OPTIONAL */ + char *mr_syntax_oid; /* REQUIRED */ + LDAPSchemaExtensionItem **mr_extensions; /* OPTIONAL */ +} LDAPMatchingRule; + +typedef struct ldap_matchingruleuse { + char *mru_oid; /* REQUIRED */ + char **mru_names; /* OPTIONAL */ + char *mru_desc; /* OPTIONAL */ + int mru_obsolete; /* OPTIONAL */ + char **mru_applies_oids; /* REQUIRED */ + LDAPSchemaExtensionItem **mru_extensions; /* OPTIONAL */ +} LDAPMatchingRuleUse; + +typedef struct ldap_attributetype { + char *at_oid; /* REQUIRED */ + char **at_names; /* OPTIONAL */ + char *at_desc; /* OPTIONAL */ + int at_obsolete; /* 0=no, 1=yes */ + char *at_sup_oid; /* OPTIONAL */ + char *at_equality_oid; /* OPTIONAL */ + char *at_ordering_oid; /* OPTIONAL */ + char *at_substr_oid; /* OPTIONAL */ + char *at_syntax_oid; /* OPTIONAL */ + int at_syntax_len; /* OPTIONAL */ + int at_single_value; /* 0=no, 1=yes */ + int at_collective; /* 0=no, 1=yes */ + int at_no_user_mod; /* 0=no, 1=yes */ + int at_usage; /* 0=userApplications, 1=directoryOperation, + 2=distributedOperation, 3=dSAOperation */ + LDAPSchemaExtensionItem **at_extensions; /* OPTIONAL */ +} LDAPAttributeType; + +typedef struct ldap_objectclass { + char *oc_oid; /* REQUIRED */ + char **oc_names; /* OPTIONAL */ + char *oc_desc; /* OPTIONAL */ + int oc_obsolete; /* 0=no, 1=yes */ + char **oc_sup_oids; /* OPTIONAL */ + int oc_kind; /* 0=ABSTRACT, 1=STRUCTURAL, 2=AUXILIARY */ + char **oc_at_oids_must; /* OPTIONAL */ + char **oc_at_oids_may; /* OPTIONAL */ + LDAPSchemaExtensionItem **oc_extensions; /* OPTIONAL */ +} LDAPObjectClass; + +typedef struct ldap_contentrule { + char *cr_oid; /* REQUIRED */ + char **cr_names; /* OPTIONAL */ + char *cr_desc; /* OPTIONAL */ + char **cr_sup_oids; /* OPTIONAL */ + int cr_obsolete; /* 0=no, 1=yes */ + char **cr_oc_oids_aux; /* OPTIONAL */ + char **cr_at_oids_must; /* OPTIONAL */ + char **cr_at_oids_may; /* OPTIONAL */ + char **cr_at_oids_not; /* OPTIONAL */ + LDAPSchemaExtensionItem **cr_extensions; /* OPTIONAL */ +} LDAPContentRule; + +typedef struct ldap_nameform { + char *nf_oid; /* REQUIRED */ + char **nf_names; /* OPTIONAL */ + char *nf_desc; /* OPTIONAL */ + int nf_obsolete; /* 0=no, 1=yes */ + char *nf_objectclass; /* REQUIRED */ + char **nf_at_oids_must; /* REQUIRED */ + char **nf_at_oids_may; /* OPTIONAL */ + LDAPSchemaExtensionItem **nf_extensions; /* OPTIONAL */ +} LDAPNameForm; + +typedef struct ldap_structurerule { + int sr_ruleid; /* REQUIRED */ + char **sr_names; /* OPTIONAL */ + char *sr_desc; /* OPTIONAL */ + int sr_obsolete; /* 0=no, 1=yes */ + char *sr_nameform; /* REQUIRED */ + int sr_nsup_ruleids;/* number of sr_sup_ruleids */ + int *sr_sup_ruleids;/* OPTIONAL */ + LDAPSchemaExtensionItem **sr_extensions; /* OPTIONAL */ +} LDAPStructureRule; + +/* + * Misc macros + */ +#define LDAP_SCHEMA_NO 0 +#define LDAP_SCHEMA_YES 1 + +#define LDAP_SCHEMA_USER_APPLICATIONS 0 +#define LDAP_SCHEMA_DIRECTORY_OPERATION 1 +#define LDAP_SCHEMA_DISTRIBUTED_OPERATION 2 +#define LDAP_SCHEMA_DSA_OPERATION 3 + +#define LDAP_SCHEMA_ABSTRACT 0 +#define LDAP_SCHEMA_STRUCTURAL 1 +#define LDAP_SCHEMA_AUXILIARY 2 + + +/* + * Flags that control how liberal the parsing routines are. + */ +#define LDAP_SCHEMA_ALLOW_NONE 0x00U /* Strict parsing */ +#define LDAP_SCHEMA_ALLOW_NO_OID 0x01U /* Allow missing oid */ +#define LDAP_SCHEMA_ALLOW_QUOTED 0x02U /* Allow bogus extra quotes */ +#define LDAP_SCHEMA_ALLOW_DESCR 0x04U /* Allow descr instead of OID */ +#define LDAP_SCHEMA_ALLOW_DESCR_PREFIX 0x08U /* Allow descr as OID prefix */ +#define LDAP_SCHEMA_ALLOW_OID_MACRO 0x10U /* Allow OID macros in slapd */ +#define LDAP_SCHEMA_ALLOW_OUT_OF_ORDER_FIELDS 0x20U /* Allow fields in most any order */ +#define LDAP_SCHEMA_ALLOW_ALL 0x3fU /* Be very liberal in parsing */ +#define LDAP_SCHEMA_SKIP 0x80U /* Don't malloc any result */ + + +LDAP_F( LDAP_CONST char * ) +ldap_syntax2name LDAP_P(( + LDAPSyntax * syn )); + +LDAP_F( LDAP_CONST char * ) +ldap_matchingrule2name LDAP_P(( + LDAPMatchingRule * mr )); + +LDAP_F( LDAP_CONST char * ) +ldap_matchingruleuse2name LDAP_P(( + LDAPMatchingRuleUse * mru )); + +LDAP_F( LDAP_CONST char * ) +ldap_attributetype2name LDAP_P(( + LDAPAttributeType * at )); + +LDAP_F( LDAP_CONST char * ) +ldap_objectclass2name LDAP_P(( + LDAPObjectClass * oc )); + +LDAP_F( LDAP_CONST char * ) +ldap_contentrule2name LDAP_P(( + LDAPContentRule * cr )); + +LDAP_F( LDAP_CONST char * ) +ldap_nameform2name LDAP_P(( + LDAPNameForm * nf )); + +LDAP_F( LDAP_CONST char * ) +ldap_structurerule2name LDAP_P(( + LDAPStructureRule * sr )); + +LDAP_F( void ) +ldap_syntax_free LDAP_P(( + LDAPSyntax * syn )); + +LDAP_F( void ) +ldap_matchingrule_free LDAP_P(( + LDAPMatchingRule * mr )); + +LDAP_F( void ) +ldap_matchingruleuse_free LDAP_P(( + LDAPMatchingRuleUse * mr )); + +LDAP_F( void ) +ldap_attributetype_free LDAP_P(( + LDAPAttributeType * at )); + +LDAP_F( void ) +ldap_objectclass_free LDAP_P(( + LDAPObjectClass * oc )); + +LDAP_F( void ) +ldap_contentrule_free LDAP_P(( + LDAPContentRule * cr )); + +LDAP_F( void ) +ldap_nameform_free LDAP_P(( + LDAPNameForm * nf )); + +LDAP_F( void ) +ldap_structurerule_free LDAP_P(( + LDAPStructureRule * sr )); + +LDAP_F( LDAPStructureRule * ) +ldap_str2structurerule LDAP_P(( + LDAP_CONST char * s, + int * code, + LDAP_CONST char ** errp, + LDAP_CONST unsigned flags )); + +LDAP_F( LDAPNameForm * ) +ldap_str2nameform LDAP_P(( + LDAP_CONST char * s, + int * code, + LDAP_CONST char ** errp, + LDAP_CONST unsigned flags )); + +LDAP_F( LDAPContentRule * ) +ldap_str2contentrule LDAP_P(( + LDAP_CONST char * s, + int * code, + LDAP_CONST char ** errp, + LDAP_CONST unsigned flags )); + +LDAP_F( LDAPObjectClass * ) +ldap_str2objectclass LDAP_P(( + LDAP_CONST char * s, + int * code, + LDAP_CONST char ** errp, + LDAP_CONST unsigned flags )); + +LDAP_F( LDAPAttributeType * ) +ldap_str2attributetype LDAP_P(( + LDAP_CONST char * s, + int * code, + LDAP_CONST char ** errp, + LDAP_CONST unsigned flags )); + +LDAP_F( LDAPSyntax * ) +ldap_str2syntax LDAP_P(( + LDAP_CONST char * s, + int * code, + LDAP_CONST char ** errp, + LDAP_CONST unsigned flags )); + +LDAP_F( LDAPMatchingRule * ) +ldap_str2matchingrule LDAP_P(( + LDAP_CONST char * s, + int * code, + LDAP_CONST char ** errp, + LDAP_CONST unsigned flags )); + +LDAP_F( LDAPMatchingRuleUse * ) +ldap_str2matchingruleuse LDAP_P(( + LDAP_CONST char * s, + int * code, + LDAP_CONST char ** errp, + LDAP_CONST unsigned flags )); + +LDAP_F( char * ) +ldap_structurerule2str LDAP_P(( + LDAPStructureRule * sr )); + +LDAP_F( struct berval * ) +ldap_structurerule2bv LDAP_P(( + LDAPStructureRule * sr, struct berval *bv )); + +LDAP_F( char * ) +ldap_nameform2str LDAP_P(( + LDAPNameForm * nf )); + +LDAP_F( struct berval * ) +ldap_nameform2bv LDAP_P(( + LDAPNameForm * nf, struct berval *bv )); + +LDAP_F( char * ) +ldap_contentrule2str LDAP_P(( + LDAPContentRule * cr )); + +LDAP_F( struct berval * ) +ldap_contentrule2bv LDAP_P(( + LDAPContentRule * cr, struct berval *bv )); + +LDAP_F( char * ) +ldap_objectclass2str LDAP_P(( + LDAPObjectClass * oc )); + +LDAP_F( struct berval * ) +ldap_objectclass2bv LDAP_P(( + LDAPObjectClass * oc, struct berval *bv )); + +LDAP_F( char * ) +ldap_attributetype2str LDAP_P(( + LDAPAttributeType * at )); + +LDAP_F( struct berval * ) +ldap_attributetype2bv LDAP_P(( + LDAPAttributeType * at, struct berval *bv )); + +LDAP_F( char * ) +ldap_syntax2str LDAP_P(( + LDAPSyntax * syn )); + +LDAP_F( struct berval * ) +ldap_syntax2bv LDAP_P(( + LDAPSyntax * syn, struct berval *bv )); + +LDAP_F( char * ) +ldap_matchingrule2str LDAP_P(( + LDAPMatchingRule * mr )); + +LDAP_F( struct berval * ) +ldap_matchingrule2bv LDAP_P(( + LDAPMatchingRule * mr, struct berval *bv )); + +LDAP_F( char * ) +ldap_matchingruleuse2str LDAP_P(( + LDAPMatchingRuleUse * mru )); + +LDAP_F( struct berval * ) +ldap_matchingruleuse2bv LDAP_P(( + LDAPMatchingRuleUse * mru, struct berval *bv )); + +LDAP_F( char * ) +ldap_scherr2str LDAP_P(( + int code )) LDAP_GCCATTR((const)); + +LDAP_END_DECL + +#endif + diff --git a/deps/include/ldap_utf8.h b/deps/include/ldap_utf8.h new file mode 100644 index 0000000..d69ed98 --- /dev/null +++ b/deps/include/ldap_utf8.h @@ -0,0 +1,106 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ +/* This notice applies to changes, created by or for Novell, Inc., + * to preexisting works for which notices appear elsewhere in this file. + * + * Copyright (C) 2000 Novell, Inc. All Rights Reserved. + * + * THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND TREATIES. + * USE, MODIFICATION, AND REDISTRIBUTION OF THIS WORK IS SUBJECT TO VERSION + * 2.0.1 OF THE OPENLDAP PUBLIC LICENSE, A COPY OF WHICH IS AVAILABLE AT + * HTTP://WWW.OPENLDAP.ORG/LICENSE.HTML OR IN THE FILE "LICENSE" IN THE + * TOP-LEVEL DIRECTORY OF THE DISTRIBUTION. ANY USE OR EXPLOITATION OF THIS + * WORK OTHER THAN AS AUTHORIZED IN VERSION 2.0.1 OF THE OPENLDAP PUBLIC + * LICENSE, OR OTHER PRIOR WRITTEN CONSENT FROM NOVELL, COULD SUBJECT THE + * PERPETRATOR TO CRIMINAL AND CIVIL LIABILITY. + */ +/* Note: A verbatim copy of version 2.0.1 of the OpenLDAP Public License + * can be found in the file "build/LICENSE-2.0.1" in this distribution + * of OpenLDAP Software. + */ + +#ifndef _LDAP_UTF8_H +#define _LDAP_UTF8_H + +#include /* get ber_*_t */ + +/* + * UTF-8 Utility Routines + */ + +LDAP_BEGIN_DECL + +#define LDAP_UCS4_INVALID (0x80000000U) +typedef ber_int_t ldap_ucs4_t; + + +/* LDAP_MAX_UTF8_LEN is 3 or 6 depending on size of wchar_t */ +#define LDAP_MAX_UTF8_LEN ( sizeof(wchar_t) * 3/2 ) + +/* Unicode conversion routines */ +LDAP_F( ldap_ucs4_t ) ldap_x_utf8_to_ucs4( LDAP_CONST char * p ); +LDAP_F( int ) ldap_x_ucs4_to_utf8( ldap_ucs4_t c, char *buf ); + + +/* + * Wide Char / UTF-8 Conversion Routines + */ + +/* UTF-8 character to Wide Char */ +LDAP_F(int) ldap_x_utf8_to_wc LDAP_P(( + wchar_t *wchar, LDAP_CONST char *utf8char )); + +/* UTF-8 string to Wide Char string */ +LDAP_F(int) ldap_x_utf8s_to_wcs LDAP_P(( + wchar_t *wcstr, LDAP_CONST char *utf8str, size_t count )); + +/* Wide Char to UTF-8 character */ +LDAP_F(int) ldap_x_wc_to_utf8 LDAP_P(( + char *utf8char, wchar_t wchar, size_t count )); + +/* Wide Char string to UTF-8 string */ +LDAP_F(int) ldap_x_wcs_to_utf8s LDAP_P(( + char *utf8str, LDAP_CONST wchar_t *wcstr, size_t count )); + +/* + * MultiByte Char / UTF-8 Conversion Routines + */ + +/* UTF-8 character to MultiByte character */ +LDAP_F(int) ldap_x_utf8_to_mb LDAP_P(( + char *mbchar, LDAP_CONST char *utf8char, + int (*ldap_f_wctomb)( char *mbchar, wchar_t wchar ))); + +/* UTF-8 string to MultiByte string */ +LDAP_F(int) ldap_x_utf8s_to_mbs LDAP_P(( + char *mbstr, LDAP_CONST char *utf8str, size_t count, + size_t (*ldap_f_wcstombs)( char *mbstr, + LDAP_CONST wchar_t *wcstr, size_t count) )); + +/* MultiByte character to UTF-8 character */ +LDAP_F(int) ldap_x_mb_to_utf8 LDAP_P(( + char *utf8char, LDAP_CONST char *mbchar, size_t mbsize, + int (*ldap_f_mbtowc)( wchar_t *wchar, + LDAP_CONST char *mbchar, size_t count) )); + +/* MultiByte string to UTF-8 string */ +LDAP_F(int) ldap_x_mbs_to_utf8s LDAP_P(( + char *utf8str, LDAP_CONST char *mbstr, size_t count, + size_t (*ldap_f_mbstowcs)( wchar_t *wcstr, + LDAP_CONST char *mbstr, size_t count) )); + +LDAP_END_DECL + +#endif /* _LDAP_UTF8_H */ diff --git a/deps/include/ldif.h b/deps/include/ldif.h new file mode 100644 index 0000000..8140c91 --- /dev/null +++ b/deps/include/ldif.h @@ -0,0 +1,169 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ +/* Portions Copyright (c) 1996 Regents of the University of Michigan. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and that due credit is given + * to the University of Michigan at Ann Arbor. The name of the University + * may not be used to endorse or promote products derived from this + * software without specific prior written permission. This software + * is provided ``as is'' without express or implied warranty. + */ + +#ifndef _LDIF_H +#define _LDIF_H + +#include + +LDAP_BEGIN_DECL + +/* This is NOT a bogus extern declaration (unlike ldap_debug) */ +LDAP_LDIF_V (int) ldif_debug; + +#define LDIF_LINE_WIDTH 76 /* default maximum length of LDIF lines */ +#define LDIF_LINE_WIDTH_MAX ((ber_len_t)-1) /* maximum length of LDIF lines */ +#define LDIF_LINE_WIDTH_WRAP(wrap) ((wrap) == 0 ? LDIF_LINE_WIDTH : (wrap)) + +/* + * Macro to calculate maximum number of bytes that the base64 equivalent + * of an item that is "len" bytes long will take up. Base64 encoding + * uses one byte for every six bits in the value plus up to two pad bytes. + */ +#define LDIF_BASE64_LEN(len) (((len) * 4 / 3 ) + 3) + +/* + * Macro to calculate maximum size that an LDIF-encoded type (length + * tlen) and value (length vlen) will take up: room for type + ":: " + + * first newline + base64 value + continued lines. Each continued line + * needs room for a newline and a leading space character. + */ +#define LDIF_SIZE_NEEDED(nlen,vlen) \ + ((nlen) + 4 + LDIF_BASE64_LEN(vlen) \ + + ((LDIF_BASE64_LEN(vlen) + (nlen) + 3) / (LDIF_LINE_WIDTH-1) * 2 )) + +#define LDIF_SIZE_NEEDED_WRAP(nlen,vlen,wrap) \ + ((nlen) + 4 + LDIF_BASE64_LEN(vlen) \ + + ((wrap) == 0 ? ((LDIF_BASE64_LEN(vlen) + (nlen) + 3) / ( LDIF_LINE_WIDTH-1 ) * 2 ) : \ + ((wrap) == LDIF_LINE_WIDTH_MAX ? 0 : ((LDIF_BASE64_LEN(vlen) + (nlen) + 3) / (wrap-1) * 2 )))) + +LDAP_LDIF_F( int ) +ldif_parse_line LDAP_P(( + LDAP_CONST char *line, + char **name, + char **value, + ber_len_t *vlen )); + +LDAP_LDIF_F( int ) +ldif_parse_line2 LDAP_P(( + char *line, + struct berval *type, + struct berval *value, + int *freeval )); + +LDAP_LDIF_F( FILE * ) +ldif_open_url LDAP_P(( LDAP_CONST char *urlstr )); + +LDAP_LDIF_F( int ) +ldif_fetch_url LDAP_P(( + LDAP_CONST char *line, + char **value, + ber_len_t *vlen )); + +LDAP_LDIF_F( char * ) +ldif_getline LDAP_P(( char **next )); + +LDAP_LDIF_F( int ) +ldif_countlines LDAP_P(( LDAP_CONST char *line )); + +/* ldif_ropen, rclose, read_record - just for reading LDIF files, + * no special open/close needed to write LDIF files. + */ +typedef struct LDIFFP { + FILE *fp; + struct LDIFFP *prev; +} LDIFFP; + +LDAP_LDIF_F( LDIFFP * ) +ldif_open LDAP_P(( LDAP_CONST char *file, LDAP_CONST char *mode )); + +LDAP_LDIF_F( void ) +ldif_close LDAP_P(( LDIFFP * )); + +LDAP_LDIF_F( int ) +ldif_read_record LDAP_P(( + LDIFFP *fp, + unsigned long *lineno, + char **bufp, + int *buflen )); + +LDAP_LDIF_F( int ) +ldif_must_b64_encode_register LDAP_P(( + LDAP_CONST char *name, + LDAP_CONST char *oid )); + +LDAP_LDIF_F( void ) +ldif_must_b64_encode_release LDAP_P(( void )); + +#define LDIF_PUT_NOVALUE 0x0000 /* no value */ +#define LDIF_PUT_VALUE 0x0001 /* value w/ auto detection */ +#define LDIF_PUT_TEXT 0x0002 /* assume text */ +#define LDIF_PUT_BINARY 0x0004 /* assume binary (convert to base64) */ +#define LDIF_PUT_B64 0x0008 /* pre-converted base64 value */ + +#define LDIF_PUT_COMMENT 0x0010 /* comment */ +#define LDIF_PUT_URL 0x0020 /* url */ +#define LDIF_PUT_SEP 0x0040 /* separator */ + +LDAP_LDIF_F( void ) +ldif_sput LDAP_P(( + char **out, + int type, + LDAP_CONST char *name, + LDAP_CONST char *val, + ber_len_t vlen )); + +LDAP_LDIF_F( void ) +ldif_sput_wrap LDAP_P(( + char **out, + int type, + LDAP_CONST char *name, + LDAP_CONST char *val, + ber_len_t vlen, + ber_len_t wrap )); + +LDAP_LDIF_F( char * ) +ldif_put LDAP_P(( + int type, + LDAP_CONST char *name, + LDAP_CONST char *val, + ber_len_t vlen )); + +LDAP_LDIF_F( char * ) +ldif_put_wrap LDAP_P(( + int type, + LDAP_CONST char *name, + LDAP_CONST char *val, + ber_len_t vlen, + ber_len_t wrap )); + +LDAP_LDIF_F( int ) +ldif_is_not_printable LDAP_P(( + LDAP_CONST char *val, + ber_len_t vlen )); + +LDAP_END_DECL + +#endif /* _LDIF_H */ diff --git a/deps/include/lutil.h b/deps/include/lutil.h new file mode 100644 index 0000000..3175cf3 --- /dev/null +++ b/deps/include/lutil.h @@ -0,0 +1,361 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _LUTIL_H +#define _LUTIL_H 1 + +#include +#include + +/* + * Include file for LDAP utility routine + */ + +LDAP_BEGIN_DECL + +/* n octets encode into ceiling(n/3) * 4 bytes */ +/* Avoid floating point math through extra padding */ + +#define LUTIL_BASE64_ENCODE_LEN(n) (((n)+2)/3 * 4) +#define LUTIL_BASE64_DECODE_LEN(n) ((n)/4*3) + +/* ISC Base64 Routines */ +/* base64.c */ + +LDAP_LUTIL_F( int ) +lutil_b64_ntop LDAP_P(( + unsigned char const *, + size_t, + char *, + size_t)); + +LDAP_LUTIL_F( int ) +lutil_b64_pton LDAP_P(( + char const *, + unsigned char *, + size_t)); + +/* detach.c */ +LDAP_LUTIL_F( int ) +lutil_detach LDAP_P(( + int debug, + int do_close)); + +/* entropy.c */ +LDAP_LUTIL_F( int ) +lutil_entropy LDAP_P(( + unsigned char *buf, + ber_len_t nbytes )); + +/* passfile.c */ +struct berval; /* avoid pulling in lber.h */ + +LDAP_LUTIL_F( int ) +lutil_get_filed_password LDAP_P(( + const char *filename, + struct berval * )); + +/* passwd.c */ +struct lutil_pw_scheme; + +#define LUTIL_PASSWD_OK (0) +#define LUTIL_PASSWD_ERR (-1) + +typedef int (LUTIL_PASSWD_CHK_FUNC)( + const struct berval *scheme, + const struct berval *passwd, + const struct berval *cred, + const char **text ); + +typedef int (LUTIL_PASSWD_HASH_FUNC) ( + const struct berval *scheme, + const struct berval *passwd, + struct berval *hash, + const char **text ); + +LDAP_LUTIL_F( int ) +lutil_passwd_add LDAP_P(( + struct berval *scheme, + LUTIL_PASSWD_CHK_FUNC *chk_fn, + LUTIL_PASSWD_HASH_FUNC *hash_fn )); + +LDAP_LUTIL_F( void ) +lutil_passwd_init LDAP_P(( void )); + +LDAP_LUTIL_F( void ) +lutil_passwd_destroy LDAP_P(( void )); + +LDAP_LUTIL_F( int ) +lutil_authpasswd LDAP_P(( + const struct berval *passwd, /* stored password */ + const struct berval *cred, /* user supplied value */ + const char **methods )); + +LDAP_LUTIL_F( int ) +lutil_authpasswd_hash LDAP_P(( + const struct berval *cred, + struct berval **passwd, /* password to store */ + struct berval **salt, /* salt to store */ + const char *method )); + +#ifdef SLAPD_CRYPT +typedef int (lutil_cryptfunc) LDAP_P(( + const char *key, + const char *salt, + char **hash )); +LDAP_LUTIL_V (lutil_cryptfunc *) lutil_cryptptr; +#endif + +LDAP_LUTIL_F( int ) +lutil_passwd LDAP_P(( + const struct berval *passwd, /* stored password */ + const struct berval *cred, /* user supplied value */ + const char **methods, + const char **text )); /* error message */ + +LDAP_LUTIL_F( int ) +lutil_passwd_generate LDAP_P(( struct berval *pw, ber_len_t )); + +LDAP_LUTIL_F( int ) +lutil_passwd_hash LDAP_P(( + const struct berval *passwd, + const char *method, + struct berval *hash, + const char **text )); + +LDAP_LUTIL_F( int ) +lutil_passwd_scheme LDAP_P(( + const char *scheme )); + +LDAP_LUTIL_F( int ) +lutil_salt_format LDAP_P(( + const char *format )); + +LDAP_LUTIL_F( int ) +lutil_passwd_string64 LDAP_P(( + const struct berval *sc, + const struct berval *hash, + struct berval *b64, + const struct berval *salt )); + +/* utils.c */ +LDAP_LUTIL_F( char* ) +lutil_progname LDAP_P(( + const char* name, + int argc, + char *argv[] )); + +typedef struct lutil_tm { + int tm_sec; /* seconds 0-60 (1 leap second) */ + int tm_min; /* minutes 0-59 */ + int tm_hour; /* hours 0-23 */ + int tm_mday; /* day 1-31 */ + int tm_mon; /* month 0-11 */ + int tm_year; /* year - 1900 */ + int tm_usec; /* microseconds */ + int tm_usub; /* submicro */ +} lutil_tm; + +typedef struct lutil_timet { + unsigned int tt_sec; /* seconds since 1900 */ + int tt_gsec; /* seconds since 1900, high 7 bits */ + unsigned int tt_usec; /* microseconds */ +} lutil_timet; + +/* Parse a timestamp string into a structure */ +LDAP_LUTIL_F( int ) +lutil_parsetime LDAP_P(( + char *atm, struct lutil_tm * )); + +/* Convert structured time to time in seconds since 1900 */ +LDAP_LUTIL_F( int ) +lutil_tm2time LDAP_P(( + struct lutil_tm *, struct lutil_timet * )); + +#ifdef _WIN32 +LDAP_LUTIL_F( void ) +lutil_slashpath LDAP_P(( char* path )); +#define LUTIL_SLASHPATH(p) lutil_slashpath(p) +#else +#define LUTIL_SLASHPATH(p) +#endif + +LDAP_LUTIL_F( char* ) +lutil_strcopy LDAP_P(( char *dst, const char *src )); + +LDAP_LUTIL_F( char* ) +lutil_strncopy LDAP_P(( char *dst, const char *src, size_t n )); + +LDAP_LUTIL_F( char* ) +lutil_memcopy LDAP_P(( char *dst, const char *src, size_t n )); + +#define lutil_strbvcopy(a, bv) lutil_memcopy((a),(bv)->bv_val,(bv)->bv_len) + +struct tm; + +/* use this macro to statically allocate buffer for lutil_gentime */ +#define LDAP_LUTIL_GENTIME_BUFSIZE 22 +#define lutil_gentime(s,m,t) lutil_localtime((s),(m),(t),0) +LDAP_LUTIL_F( size_t ) +lutil_localtime LDAP_P(( char *s, size_t smax, const struct tm *tm, + long delta )); + +#ifndef HAVE_MKSTEMP +LDAP_LUTIL_F( int ) +mkstemp LDAP_P (( char * template )); +#endif + +/* sockpair.c */ +LDAP_LUTIL_F( int ) +lutil_pair( ber_socket_t sd[2] ); + +/* uuid.c */ +/* use this macro to allocate buffer for lutil_uuidstr */ +#define LDAP_LUTIL_UUIDSTR_BUFSIZE 40 +LDAP_LUTIL_F( size_t ) +lutil_uuidstr( char *buf, size_t len ); + +LDAP_LUTIL_F( int ) +lutil_uuidstr_from_normalized( + char *uuid, + size_t uuidlen, + char *buf, + size_t buflen ); + +/* + * Sometimes not all declarations in a header file are needed. + * An indicator to this is whether or not the symbol's type has + * been defined. Thus, we don't need to include a symbol if + * its type has not been defined through another header file. + */ + +#ifdef HAVE_NT_SERVICE_MANAGER +LDAP_LUTIL_V (int) is_NT_Service; + +#ifdef _LDAP_PVT_THREAD_H +LDAP_LUTIL_V (ldap_pvt_thread_cond_t) started_event; +#endif /* _LDAP_PVT_THREAD_H */ + +/* macros are different between Windows and Mingw */ +#if defined(_WINSVC_H) || defined(_WINSVC_) +LDAP_LUTIL_V (SERVICE_STATUS) lutil_ServiceStatus; +LDAP_LUTIL_V (SERVICE_STATUS_HANDLE) hlutil_ServiceStatus; +#endif /* _WINSVC_H */ + +LDAP_LUTIL_F (void) +lutil_CommenceStartupProcessing( char *serverName, void (*stopper)(int)) ; + +LDAP_LUTIL_F (void) +lutil_ReportShutdownComplete( void ); + +LDAP_LUTIL_F (void *) +lutil_getRegParam( char *svc, char *value ); + +LDAP_LUTIL_F (int) +lutil_srv_install( char* service, char * displayName, char* filename, + int auto_start ); +LDAP_LUTIL_F (int) +lutil_srv_remove ( char* service, char* filename ); + +#endif /* HAVE_NT_SERVICE_MANAGER */ + +#ifdef HAVE_NT_EVENT_LOG +LDAP_LUTIL_F (void) +lutil_LogStartedEvent( char *svc, int slap_debug, char *configfile, char *urls ); + +LDAP_LUTIL_F (void) +lutil_LogStoppedEvent( char *svc ); +#endif + +#ifdef HAVE_EBCDIC +/* Generally this has only been used to put '\n' to stdout. We need to + * make sure it is output in EBCDIC. + */ +#undef putchar +#undef putc +#define putchar(c) putc((c), stdout) +#define putc(c,fp) do { char x=(c); __atoe_l(&x,1); putc(x,fp); } while(0) +#endif + +LDAP_LUTIL_F (int) +lutil_atoix( int *v, const char *s, int x ); + +LDAP_LUTIL_F (int) +lutil_atoux( unsigned *v, const char *s, int x ); + +LDAP_LUTIL_F (int) +lutil_atolx( long *v, const char *s, int x ); + +LDAP_LUTIL_F (int) +lutil_atoulx( unsigned long *v, const char *s, int x ); + +#define lutil_atoi(v, s) lutil_atoix((v), (s), 10) +#define lutil_atou(v, s) lutil_atoux((v), (s), 10) +#define lutil_atol(v, s) lutil_atolx((v), (s), 10) +#define lutil_atoul(v, s) lutil_atoulx((v), (s), 10) + +#ifdef HAVE_LONG_LONG +#if defined(HAVE_STRTOLL) || defined(HAVE_STRTOQ) +LDAP_LUTIL_F (int) +lutil_atollx( long long *v, const char *s, int x ); +#define lutil_atoll(v, s) lutil_atollx((v), (s), 10) +#endif /* HAVE_STRTOLL || HAVE_STRTOQ */ + +#if defined(HAVE_STRTOULL) || defined(HAVE_STRTOUQ) +LDAP_LUTIL_F (int) +lutil_atoullx( unsigned long long *v, const char *s, int x ); +#define lutil_atoull(v, s) lutil_atoullx((v), (s), 10) +#endif /* HAVE_STRTOULL || HAVE_STRTOUQ */ +#endif /* HAVE_LONG_LONG */ + +LDAP_LUTIL_F (int) +lutil_str2bin( struct berval *in, struct berval *out, void *ctx ); + +/* Parse and unparse time intervals */ +LDAP_LUTIL_F (int) +lutil_parse_time( const char *in, unsigned long *tp ); + +LDAP_LUTIL_F (int) +lutil_unparse_time( char *buf, size_t buflen, unsigned long t ); + +#ifdef timerdiv +#define lutil_timerdiv timerdiv +#else /* ! timerdiv */ +/* works inplace (x == t) */ +#define lutil_timerdiv(t,d,x) \ + do { \ + time_t s = (t)->tv_sec; \ + assert( d > 0 ); \ + (x)->tv_sec = s / d; \ + (x)->tv_usec = ( (t)->tv_usec + 1000000 * ( s % d ) ) / d; \ + } while ( 0 ) +#endif /* ! timerdiv */ + +#ifdef timermul +#define lutil_timermul timermul +#else /* ! timermul */ +/* works inplace (x == t) */ +#define lutil_timermul(t,m,x) \ + do { \ + time_t u = (t)->tv_usec * m; \ + assert( m > 0 ); \ + (x)->tv_sec = (t)->tv_sec * m + u / 1000000; \ + (x)->tv_usec = u % 1000000; \ + } while ( 0 ); +#endif /* ! timermul */ + +LDAP_END_DECL + +#endif /* _LUTIL_H */ diff --git a/deps/include/lutil_hash.h b/deps/include/lutil_hash.h new file mode 100644 index 0000000..5f4a528 --- /dev/null +++ b/deps/include/lutil_hash.h @@ -0,0 +1,48 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _LUTIL_HASH_H_ +#define _LUTIL_HASH_H_ + +#include + +LDAP_BEGIN_DECL + +#define LUTIL_HASH_BYTES 4 + +struct lutil_HASHContext { + ber_uint_t hash; +}; + +LDAP_LUTIL_F( void ) +lutil_HASHInit LDAP_P(( + struct lutil_HASHContext *context)); + +LDAP_LUTIL_F( void ) +lutil_HASHUpdate LDAP_P(( + struct lutil_HASHContext *context, + unsigned char const *buf, + ber_len_t len)); + +LDAP_LUTIL_F( void ) +lutil_HASHFinal LDAP_P(( + unsigned char digest[LUTIL_HASH_BYTES], + struct lutil_HASHContext *context)); + +typedef struct lutil_HASHContext lutil_HASH_CTX; + +LDAP_END_DECL + +#endif /* _LUTIL_HASH_H_ */ diff --git a/deps/include/lutil_ldap.h b/deps/include/lutil_ldap.h new file mode 100644 index 0000000..d387e8d --- /dev/null +++ b/deps/include/lutil_ldap.h @@ -0,0 +1,47 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _LUTIL_LDAP_H +#define _LUTIL_LDAP_H 1 + +#include +#include + +/* + * Include file for lutil LDAP routines + */ + +LDAP_BEGIN_DECL + +LDAP_LUTIL_F( void ) +lutil_sasl_freedefs LDAP_P(( + void *defaults )); + +LDAP_LUTIL_F( void * ) +lutil_sasl_defaults LDAP_P(( + LDAP *ld, + char *mech, + char *realm, + char *authcid, + char *passwd, + char *authzid )); + +LDAP_LUTIL_F( int ) +lutil_sasl_interact LDAP_P(( + LDAP *ld, unsigned flags, void *defaults, void *p )); + +LDAP_END_DECL + +#endif /* _LUTIL_LDAP_H */ diff --git a/deps/include/lutil_lockf.h b/deps/include/lutil_lockf.h new file mode 100644 index 0000000..f8d3cc3 --- /dev/null +++ b/deps/include/lutil_lockf.h @@ -0,0 +1,34 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +/* File locking methods + * + * lutil_lockf() will block until an exclusive lock is acquired. + */ + +#ifndef _LUTIL_LOCKF_H_ +#define _LUTIL_LOCKF_H_ + +LDAP_BEGIN_DECL + +LDAP_LUTIL_F( int ) +lutil_lockf LDAP_P(( int fd )); + +LDAP_LUTIL_F( int ) +lutil_unlockf LDAP_P(( int fd )); + +LDAP_END_DECL + +#endif /* _LUTIL_LOCKF_H_ */ diff --git a/deps/include/lutil_md5.h b/deps/include/lutil_md5.h new file mode 100644 index 0000000..7b5cd6d --- /dev/null +++ b/deps/include/lutil_md5.h @@ -0,0 +1,64 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _LUTIL_MD5_H_ +#define _LUTIL_MD5_H_ + +#include + +LDAP_BEGIN_DECL + +/* Unlike previous versions of this code, ber_int_t need not be exactly + 32 bits, merely 32 bits or more. Choosing a data type which is 32 + bits instead of 64 is not important; speed is considerably more + important. ANSI guarantees that "unsigned long" will be big enough, + and always using it seems to have few disadvantages. */ + +#define LUTIL_MD5_BYTES 16 + +struct lutil_MD5Context { + ber_uint_t buf[4]; + ber_uint_t bits[2]; + unsigned char in[64]; +}; + +LDAP_LUTIL_F( void ) +lutil_MD5Init LDAP_P(( + struct lutil_MD5Context *context)); + +LDAP_LUTIL_F( void ) +lutil_MD5Update LDAP_P(( + struct lutil_MD5Context *context, + unsigned char const *buf, + ber_len_t len)); + +LDAP_LUTIL_F( void ) +lutil_MD5Final LDAP_P(( + unsigned char digest[16], + struct lutil_MD5Context *context)); + +LDAP_LUTIL_F( void ) +lutil_MD5Transform LDAP_P(( + ber_uint_t buf[4], + const unsigned char in[64])); + +/* + * This is needed to make RSAREF happy on some MS-DOS compilers. + */ +typedef struct lutil_MD5Context lutil_MD5_CTX; + +LDAP_END_DECL + +#endif /* _LUTIL_MD5_H_ */ diff --git a/deps/include/lutil_meter.h b/deps/include/lutil_meter.h new file mode 100644 index 0000000..66105fa --- /dev/null +++ b/deps/include/lutil_meter.h @@ -0,0 +1,70 @@ +/* lutil_meter.h - progress meters */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright (c) 2009 by Emily Backes, Symas Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ +/* ACKNOWLEDGEMENTS: + * This work was initially developed by Emily Backes for inclusion + * in OpenLDAP software. + */ + +#ifndef _LUTIL_METER_H +#define _LUTIL_METER_H + +#include "portable.h" + +#include +#include +#include + +#include +#include + +typedef struct { + int (*display_open) (void **datap); + int (*display_update) (void **datap, double frac, time_t remaining_time, time_t elapsed, double byte_rate); + int (*display_close) (void **datap); +} lutil_meter_display_t; + +typedef struct { + int (*estimator_open) (void **datap); + int (*estimator_update) (void **datap, double start, double frac, time_t *remaining_time); + int (*estimator_close) (void **datap); +} lutil_meter_estimator_t; + +typedef struct { + const lutil_meter_display_t *display; + void * display_data; + const lutil_meter_estimator_t *estimator; + void * estimator_data; + double start_time; + double last_update; + size_t goal_value; + size_t last_position; +} lutil_meter_t; + +extern const lutil_meter_display_t lutil_meter_text_display; +extern const lutil_meter_estimator_t lutil_meter_linear_estimator; + +extern int lutil_meter_open ( + lutil_meter_t *lutil_meter, + const lutil_meter_display_t *display, + const lutil_meter_estimator_t *estimator, + size_t goal_value); +extern int lutil_meter_update ( + lutil_meter_t *lutil_meter, + size_t position, + int force); +extern int lutil_meter_close (lutil_meter_t *lutil_meter); + +#endif /* _LUTIL_METER_H */ diff --git a/deps/include/lutil_sha1.h b/deps/include/lutil_sha1.h new file mode 100644 index 0000000..a14d34d --- /dev/null +++ b/deps/include/lutil_sha1.h @@ -0,0 +1,77 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +/* This version is based on: + * $OpenBSD: sha1.h,v 1.8 1997/07/15 01:54:23 millert Exp $ */ + +#ifndef _LUTIL_SHA1_H_ +#define _LUTIL_SHA1_H_ + +#include +#include + +#ifdef AC_INT4_TYPE + +LDAP_BEGIN_DECL + + +/* + * SHA-1 in C + * By Steve Reid + */ +#define LUTIL_SHA1_BYTES 20 + +/* This code assumes char are 8-bits and uint32 are 32-bits */ +typedef ac_uint4 uint32; + +typedef struct { + uint32 state[5]; + uint32 count[2]; + unsigned char buffer[64]; +} lutil_SHA1_CTX; + +LDAP_LUTIL_F( void ) +lutil_SHA1Transform + LDAP_P((uint32 state[5], const unsigned char buffer[64])); + +LDAP_LUTIL_F( void ) +lutil_SHA1Init + LDAP_P((lutil_SHA1_CTX *context)); + +LDAP_LUTIL_F( void ) +lutil_SHA1Update + LDAP_P((lutil_SHA1_CTX *context, const unsigned char *data, uint32 len)); + +LDAP_LUTIL_F( void ) +lutil_SHA1Final + LDAP_P((unsigned char digest[20], lutil_SHA1_CTX *context)); + +LDAP_LUTIL_F( char * ) +lutil_SHA1End + LDAP_P((lutil_SHA1_CTX *, char *)); + +LDAP_LUTIL_F( char * ) +lutil_SHA1File + LDAP_P((char *, char *)); + +LDAP_LUTIL_F( char * ) +lutil_SHA1Data + LDAP_P((const unsigned char *, size_t, char *)); + +LDAP_END_DECL + +#endif /* AC_INT4_TYPE */ + +#endif /* _LUTIL_SHA1_H_ */ diff --git a/deps/include/openldap.h b/deps/include/openldap.h new file mode 100644 index 0000000..99c63e1 --- /dev/null +++ b/deps/include/openldap.h @@ -0,0 +1,39 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 2019-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +/* openldap.h - Header for openldap specific interfaces. */ + +#ifndef _OPENLDAP_H +#define _OPENLDAP_H 1 + +#include + +LDAP_BEGIN_DECL + +#define LDAP_PROTO_TCP 1 /* ldap:// */ +#define LDAP_PROTO_UDP 2 /* reserved */ +#define LDAP_PROTO_IPC 3 /* ldapi:// */ +#define LDAP_PROTO_EXT 4 /* user-defined socket/sockbuf */ + +LDAP_F( int ) +ldap_init_fd LDAP_P(( + ber_socket_t fd, + int proto, + LDAP_CONST char *url, + LDAP **ldp )); + +LDAP_END_DECL + +#endif /* _OPENLDAP_H */ diff --git a/deps/include/portable.h b/deps/include/portable.h new file mode 100644 index 0000000..2ef0cc1 --- /dev/null +++ b/deps/include/portable.h @@ -0,0 +1,1173 @@ +/* include/portable.h. Generated from portable.hin by configure. */ +/* include/portable.hin. Generated from configure.in by autoheader. */ + + +/* begin of portable.h.pre */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _LDAP_PORTABLE_H +#define _LDAP_PORTABLE_H + +/* define this if needed to get reentrant functions */ +#ifndef REENTRANT +#define REENTRANT 1 +#endif +#ifndef _REENTRANT +#define _REENTRANT 1 +#endif + +/* define this if needed to get threadsafe functions */ +#ifndef THREADSAFE +#define THREADSAFE 1 +#endif +#ifndef _THREADSAFE +#define _THREADSAFE 1 +#endif +#ifndef THREAD_SAFE +#define THREAD_SAFE 1 +#endif +#ifndef _THREAD_SAFE +#define _THREAD_SAFE 1 +#endif + +#ifndef _SGI_MP_SOURCE +#define _SGI_MP_SOURCE 1 +#endif + +/* end of portable.h.pre */ + + +/* define to use both and */ +/* #undef BOTH_STRINGS_H */ + +/* define if cross compiling */ +/* #undef CROSS_COMPILING */ + +/* set to the number of arguments ctime_r() expects */ +#define CTIME_R_NARGS 2 + +/* define if toupper() requires islower() */ +/* #undef C_UPPER_LOWER */ + +/* define if sys_errlist is not declared in stdio.h or errno.h */ +/* #undef DECL_SYS_ERRLIST */ + +/* define to enable rewriting in back-ldap and back-meta */ +#define ENABLE_REWRITE 1 + +/* define to enable slapi library */ +/* #undef ENABLE_SLAPI */ + +/* defined to be the EXE extension */ +#define EXEEXT "" + +/* set to the number of arguments gethostbyaddr_r() expects */ +#define GETHOSTBYADDR_R_NARGS 8 + +/* set to the number of arguments gethostbyname_r() expects */ +#define GETHOSTBYNAME_R_NARGS 6 + +/* Define to 1 if `TIOCGWINSZ' requires . */ +#define GWINSZ_IN_SYS_IOCTL 1 + +/* define if you have AIX security lib */ +/* #undef HAVE_AIX_SECURITY */ + +/* Define to 1 if you have the header file. */ +#define HAVE_ARPA_INET_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ARPA_NAMESER_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ASSERT_H 1 + +/* Define to 1 if you have the `bcopy' function. */ +#define HAVE_BCOPY 1 + +/* define this if Berkeley DB is available */ +#define HAVE_BERKELEY_DB 1 + +/* define if Berkeley DB has DB_THREAD support */ +#define HAVE_BERKELEY_DB_THREAD 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_BITS_TYPES_H 1 + +/* Define to 1 if you have the `chroot' function. */ +#define HAVE_CHROOT 1 + +/* Define to 1 if you have the `closesocket' function. */ +/* #undef HAVE_CLOSESOCKET */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_CONIO_H */ + +/* define if crypt(3) is available */ +/* #undef HAVE_CRYPT */ + +/* Define to 1 if you have the header file. */ +#define HAVE_CRYPT_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_CTHREADS_H */ + +/* Define to 1 if you have the `ctime_r' function. */ +#define HAVE_CTIME_R 1 + +/* define if you have Cyrus SASL */ +#define HAVE_CYRUS_SASL 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DB_H 1 + +/* define if your system supports /dev/poll */ +/* #undef HAVE_DEVPOLL */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DIRECT_H */ + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#define HAVE_DIRENT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ +/* #undef HAVE_DOPRNT */ + +/* define if system uses EBCDIC instead of ASCII */ +/* #undef HAVE_EBCDIC */ + +/* Define to 1 if you have the `endgrent' function. */ +#define HAVE_ENDGRENT 1 + +/* Define to 1 if you have the `endpwent' function. */ +#define HAVE_ENDPWENT 1 + +/* define if your system supports epoll */ +#define HAVE_EPOLL 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ERRNO_H 1 + +/* Define to 1 if you have the `fcntl' function. */ +#define HAVE_FCNTL 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* define if you actually have FreeBSD fetch(3) */ +/* #undef HAVE_FETCH */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_FILIO_H */ + +/* Define to 1 if you have the `flock' function. */ +#define HAVE_FLOCK 1 + +/* Define to 1 if you have the `fstat' function. */ +#define HAVE_FSTAT 1 + +/* Define to 1 if you have the `gai_strerror' function. */ +#define HAVE_GAI_STRERROR 1 + +/* Define to 1 if you have the `getaddrinfo' function. */ +#define HAVE_GETADDRINFO 1 + +/* Define to 1 if you have the `getdtablesize' function. */ +#define HAVE_GETDTABLESIZE 1 + +/* Define to 1 if you have the `geteuid' function. */ +#define HAVE_GETEUID 1 + +/* Define to 1 if you have the `getgrgid' function. */ +#define HAVE_GETGRGID 1 + +/* Define to 1 if you have the `gethostbyaddr_r' function. */ +#define HAVE_GETHOSTBYADDR_R 1 + +/* Define to 1 if you have the `gethostbyname_r' function. */ +#define HAVE_GETHOSTBYNAME_R 1 + +/* Define to 1 if you have the `gethostname' function. */ +#define HAVE_GETHOSTNAME 1 + +/* Define to 1 if you have the `getnameinfo' function. */ +#define HAVE_GETNAMEINFO 1 + +/* Define to 1 if you have the `getopt' function. */ +#define HAVE_GETOPT 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_GETOPT_H 1 + +/* Define to 1 if you have the `getpassphrase' function. */ +/* #undef HAVE_GETPASSPHRASE */ + +/* Define to 1 if you have the `getpeereid' function. */ +/* #undef HAVE_GETPEEREID */ + +/* Define to 1 if you have the `getpeerucred' function. */ +/* #undef HAVE_GETPEERUCRED */ + +/* Define to 1 if you have the `getpwnam' function. */ +#define HAVE_GETPWNAM 1 + +/* Define to 1 if you have the `getpwuid' function. */ +#define HAVE_GETPWUID 1 + +/* Define to 1 if you have the `getspnam' function. */ +#define HAVE_GETSPNAM 1 + +/* Define to 1 if you have the `gettimeofday' function. */ +#define HAVE_GETTIMEOFDAY 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_GMP_H */ + +/* Define to 1 if you have the `gmtime_r' function. */ +#define HAVE_GMTIME_R 1 + +/* define if you have GNUtls */ +/* #undef HAVE_GNUTLS */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_GNUTLS_GNUTLS_H */ + +/* if you have GNU Pth */ +/* #undef HAVE_GNU_PTH */ + +/* Define to 1 if you have the header file. */ +#define HAVE_GRP_H 1 + +/* Define to 1 if you have the `hstrerror' function. */ +#define HAVE_HSTRERROR 1 + +/* define to you inet_aton(3) is available */ +#define HAVE_INET_ATON 1 + +/* Define to 1 if you have the `inet_ntoa_b' function. */ +/* #undef HAVE_INET_NTOA_B */ + +/* Define to 1 if you have the `inet_ntop' function. */ +#define HAVE_INET_NTOP 1 + +/* Define to 1 if you have the `initgroups' function. */ +#define HAVE_INITGROUPS 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `ioctl' function. */ +#define HAVE_IOCTL 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_IO_H */ + +/* Define to 1 if you have the `gen' library (-lgen). */ +/* #undef HAVE_LIBGEN */ + +/* Define to 1 if you have the `gmp' library (-lgmp). */ +/* #undef HAVE_LIBGMP */ + +/* Define to 1 if you have the `inet' library (-linet). */ +/* #undef HAVE_LIBINET */ + +/* define if you have libtool -ltdl */ +/* #undef HAVE_LIBLTDL */ + +/* Define to 1 if you have the `net' library (-lnet). */ +/* #undef HAVE_LIBNET */ + +/* Define to 1 if you have the `nsl' library (-lnsl). */ +/* #undef HAVE_LIBNSL */ + +/* Define to 1 if you have the `nsl_s' library (-lnsl_s). */ +/* #undef HAVE_LIBNSL_S */ + +/* Define to 1 if you have the `socket' library (-lsocket). */ +/* #undef HAVE_LIBSOCKET */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_LIBUTIL_H */ + +/* Define to 1 if you have the `V3' library (-lV3). */ +/* #undef HAVE_LIBV3 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* if you have LinuxThreads */ +/* #undef HAVE_LINUX_THREADS */ + +/* Define to 1 if you have the header file. */ +#define HAVE_LOCALE_H 1 + +/* Define to 1 if you have the `localtime_r' function. */ +#define HAVE_LOCALTIME_R 1 + +/* Define to 1 if you have the `lockf' function. */ +#define HAVE_LOCKF 1 + +/* Define to 1 if the system has the type `long long'. */ +#define HAVE_LONG_LONG 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_LTDL_H */ + +/* define if you have Mach Cthreads */ +/* #undef HAVE_MACH_CTHREADS */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MACH_CTHREADS_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_MALLOC_H 1 + +/* Define to 1 if you have the `memcpy' function. */ +#define HAVE_MEMCPY 1 + +/* Define to 1 if you have the `memmove' function. */ +#define HAVE_MEMMOVE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `memrchr' function. */ +#define HAVE_MEMRCHR 1 + +/* Define to 1 if you have the `mkstemp' function. */ +#define HAVE_MKSTEMP 1 + +/* Define to 1 if you have the `mktemp' function. */ +#define HAVE_MKTEMP 1 + +/* define this if you have mkversion */ +#define HAVE_MKVERSION 1 + +/* define if you have MozNSS */ +/* #undef HAVE_MOZNSS */ + +/* Define to 1 if you have the header file, and it defines `DIR'. */ +/* #undef HAVE_NDIR_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_NETINET_TCP_H 1 + +/* define if strerror_r returns char* instead of int */ +/* #undef HAVE_NONPOSIX_STRERROR_R */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NSSUTIL_H */ + +/* if you have NT Event Log */ +/* #undef HAVE_NT_EVENT_LOG */ + +/* if you have NT Service Manager */ +/* #undef HAVE_NT_SERVICE_MANAGER */ + +/* if you have NT Threads */ +/* #undef HAVE_NT_THREADS */ + +/* define if you have OpenSSL */ +#define HAVE_OPENSSL 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_OPENSSL_BN_H */ + +/* define if you have OpenSSL with CRL checking capability */ +#define HAVE_OPENSSL_CRL 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_OPENSSL_CRYPTO_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_OPENSSL_SSL_H 1 + +/* Define to 1 if you have the `pipe' function. */ +#define HAVE_PIPE 1 + +/* Define to 1 if you have the `poll' function. */ +#define HAVE_POLL 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_POLL_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_PROCESS_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_PSAP_H */ + +/* define to pthreads API spec revision */ +#define HAVE_PTHREADS 10 + +/* define if you have pthread_detach function */ +#define HAVE_PTHREAD_DETACH 1 + +/* Define to 1 if you have the `pthread_getconcurrency' function. */ +#define HAVE_PTHREAD_GETCONCURRENCY 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_PTHREAD_H 1 + +/* Define to 1 if you have the `pthread_kill' function. */ +#define HAVE_PTHREAD_KILL 1 + +/* Define to 1 if you have the `pthread_kill_other_threads_np' function. */ +/* #undef HAVE_PTHREAD_KILL_OTHER_THREADS_NP */ + +/* define if you have pthread_rwlock_destroy function */ +#define HAVE_PTHREAD_RWLOCK_DESTROY 1 + +/* Define to 1 if you have the `pthread_setconcurrency' function. */ +#define HAVE_PTHREAD_SETCONCURRENCY 1 + +/* Define to 1 if you have the `pthread_yield' function. */ +#define HAVE_PTHREAD_YIELD 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_PTH_H */ + +/* Define to 1 if the system has the type `ptrdiff_t'. */ +#define HAVE_PTRDIFF_T 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_PWD_H 1 + +/* Define to 1 if you have the `read' function. */ +#define HAVE_READ 1 + +/* Define to 1 if you have the `recv' function. */ +#define HAVE_RECV 1 + +/* Define to 1 if you have the `recvfrom' function. */ +#define HAVE_RECVFROM 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_REGEX_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_RESOLV_H 1 + +/* define if you have res_query() */ +#define HAVE_RES_QUERY 1 + +/* define if OpenSSL needs RSAref */ +/* #undef HAVE_RSAREF */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SASL_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SASL_SASL_H 1 + +/* define if your SASL library has sasl_version() */ +#define HAVE_SASL_VERSION 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SCHED_H 1 + +/* Define to 1 if you have the `sched_yield' function. */ +#define HAVE_SCHED_YIELD 1 + +/* Define to 1 if you have the `send' function. */ +#define HAVE_SEND 1 + +/* Define to 1 if you have the `sendmsg' function. */ +#define HAVE_SENDMSG 1 + +/* Define to 1 if you have the `sendto' function. */ +#define HAVE_SENDTO 1 + +/* Define to 1 if you have the `setegid' function. */ +#define HAVE_SETEGID 1 + +/* Define to 1 if you have the `seteuid' function. */ +#define HAVE_SETEUID 1 + +/* Define to 1 if you have the `setgid' function. */ +#define HAVE_SETGID 1 + +/* define if setproctitle(3) is available */ +/* #undef HAVE_SETPROCTITLE */ + +/* Define to 1 if you have the `setpwfile' function. */ +/* #undef HAVE_SETPWFILE */ + +/* Define to 1 if you have the `setsid' function. */ +#define HAVE_SETSID 1 + +/* Define to 1 if you have the `setuid' function. */ +#define HAVE_SETUID 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SGTTY_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SHADOW_H 1 + +/* Define to 1 if you have the `sigaction' function. */ +#define HAVE_SIGACTION 1 + +/* Define to 1 if you have the `signal' function. */ +#define HAVE_SIGNAL 1 + +/* Define to 1 if you have the `sigset' function. */ +#define HAVE_SIGSET 1 + +/* define if you have -lslp */ +/* #undef HAVE_SLP */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SLP_H */ + +/* Define to 1 if you have the `snprintf' function. */ +#define HAVE_SNPRINTF 1 + +/* if you have spawnlp() */ +/* #undef HAVE_SPAWNLP */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SQLEXT_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SQL_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDDEF_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 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 `strerror_r' function. */ +#define HAVE_STRERROR_R 1 + +/* Define to 1 if you have the `strftime' function. */ +#define HAVE_STRFTIME 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strpbrk' function. */ +#define HAVE_STRPBRK 1 + +/* Define to 1 if you have the `strrchr' function. */ +#define HAVE_STRRCHR 1 + +/* Define to 1 if you have the `strsep' function. */ +#define HAVE_STRSEP 1 + +/* Define to 1 if you have the `strspn' function. */ +#define HAVE_STRSPN 1 + +/* Define to 1 if you have the `strstr' function. */ +#define HAVE_STRSTR 1 + +/* Define to 1 if you have the `strtol' function. */ +#define HAVE_STRTOL 1 + +/* Define to 1 if you have the `strtoll' function. */ +#define HAVE_STRTOLL 1 + +/* Define to 1 if you have the `strtoq' function. */ +#define HAVE_STRTOQ 1 + +/* Define to 1 if you have the `strtoul' function. */ +#define HAVE_STRTOUL 1 + +/* Define to 1 if you have the `strtoull' function. */ +#define HAVE_STRTOULL 1 + +/* Define to 1 if you have the `strtouq' function. */ +#define HAVE_STRTOUQ 1 + +/* Define to 1 if `msg_accrightslen' is member of `struct msghdr'. */ +/* #undef HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTSLEN */ + +/* Define to 1 if `msg_control' is member of `struct msghdr'. */ +#define HAVE_STRUCT_MSGHDR_MSG_CONTROL 1 + +/* Define to 1 if `pw_gecos' is member of `struct passwd'. */ +#define HAVE_STRUCT_PASSWD_PW_GECOS 1 + +/* Define to 1 if `pw_passwd' is member of `struct passwd'. */ +#define HAVE_STRUCT_PASSWD_PW_PASSWD 1 + +/* Define to 1 if `st_blksize' is member of `struct stat'. */ +#define HAVE_STRUCT_STAT_ST_BLKSIZE 1 + +/* Define to 1 if `st_fstype' is member of `struct stat'. */ +/* #undef HAVE_STRUCT_STAT_ST_FSTYPE */ + +/* define to 1 if st_fstype is char * */ +/* #undef HAVE_STRUCT_STAT_ST_FSTYPE_CHAR */ + +/* define to 1 if st_fstype is int */ +/* #undef HAVE_STRUCT_STAT_ST_FSTYPE_INT */ + +/* Define to 1 if `st_vfstype' is member of `struct stat'. */ +/* #undef HAVE_STRUCT_STAT_ST_VFSTYPE */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYNCH_H */ + +/* Define to 1 if you have the `sysconf' function. */ +#define HAVE_SYSCONF 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYSEXITS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYSLOG_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_DEVPOLL_H */ + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +/* #undef HAVE_SYS_DIR_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_EPOLL_H 1 + +/* define if you actually have sys_errlist in your libs */ +#define HAVE_SYS_ERRLIST 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_ERRNO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_FILE_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_FILIO_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_FSTYP_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_IOCTL_H 1 + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +/* #undef HAVE_SYS_NDIR_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_PARAM_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_POLL_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_PRIVGRP_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_RESOURCE_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SELECT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SOCKET_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SYSLOG_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_UCRED_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_UIO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_UN_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_UUID_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_VMOUNT_H */ + +/* Define to 1 if you have that is POSIX.1 compatible. */ +#define HAVE_SYS_WAIT_H 1 + +/* define if you have -lwrap */ +/* #undef HAVE_TCPD */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_TCPD_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_TERMIOS_H 1 + +/* if you have Solaris LWP (thr) package */ +/* #undef HAVE_THR */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_THREAD_H */ + +/* Define to 1 if you have the `thr_getconcurrency' function. */ +/* #undef HAVE_THR_GETCONCURRENCY */ + +/* Define to 1 if you have the `thr_setconcurrency' function. */ +/* #undef HAVE_THR_SETCONCURRENCY */ + +/* Define to 1 if you have the `thr_yield' function. */ +/* #undef HAVE_THR_YIELD */ + +/* define if you have TLS */ +#define HAVE_TLS 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UTIME_H 1 + +/* define if you have uuid_generate() */ +/* #undef HAVE_UUID_GENERATE */ + +/* define if you have uuid_to_str() */ +/* #undef HAVE_UUID_TO_STR */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_UUID_UUID_H */ + +/* Define to 1 if you have the `vprintf' function. */ +#define HAVE_VPRINTF 1 + +/* Define to 1 if you have the `vsnprintf' function. */ +#define HAVE_VSNPRINTF 1 + +/* Define to 1 if you have the `wait4' function. */ +#define HAVE_WAIT4 1 + +/* Define to 1 if you have the `waitpid' function. */ +#define HAVE_WAITPID 1 + +/* define if you have winsock */ +/* #undef HAVE_WINSOCK */ + +/* define if you have winsock2 */ +/* #undef HAVE_WINSOCK2 */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_WINSOCK2_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_WINSOCK_H */ + +/* Define to 1 if you have the `write' function. */ +#define HAVE_WRITE 1 + +/* define if select implicitly yields */ +#define HAVE_YIELDING_SELECT 1 + +/* Define to 1 if you have the `_vsnprintf' function. */ +/* #undef HAVE__VSNPRINTF */ + +/* define to 32-bit or greater integer type */ +#define LBER_INT_T int + +/* define to large integer type */ +#define LBER_LEN_T long + +/* define to socket descriptor type */ +#define LBER_SOCKET_T int + +/* define to large integer type */ +#define LBER_TAG_T long + +/* define to 1 if library is thread safe */ +#define LDAP_API_FEATURE_X_OPENLDAP_THREAD_SAFE 1 + +/* define to LDAP VENDOR VERSION */ +/* #undef LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS */ + +/* define this to add debugging code */ +#define LDAP_DEBUG 1 + +/* define if LDAP libs are dynamic */ +/* #undef LDAP_LIBS_DYNAMIC */ + +/* define to support PF_INET6 */ +#define LDAP_PF_INET6 1 + +/* define to support PF_LOCAL */ +#define LDAP_PF_LOCAL 1 + +/* define this for LDAP process title support */ +#define LDAP_PROCTITLE 1 + +/* define this to add SLAPI code */ +/* #undef LDAP_SLAPI */ + +/* define this to add syslog code */ +#define LDAP_SYSLOG 1 + +/* Version */ +#define LDAP_VENDOR_VERSION 20450 + +/* Major */ +#define LDAP_VENDOR_VERSION_MAJOR 2 + +/* Minor */ +#define LDAP_VENDOR_VERSION_MINOR 4 + +/* Patch */ +#define LDAP_VENDOR_VERSION_PATCH 50 + +/* define if memcmp is not 8-bit clean or is otherwise broken */ +/* #undef NEED_MEMCMP_REPLACEMENT */ + +/* define if you have (or want) no threads */ +/* #undef NO_THREADS */ + +/* define to use the original debug style */ +/* #undef OLD_DEBUG */ + +/* Package */ +#define OPENLDAP_PACKAGE "OpenLDAP" + +/* Version */ +#define OPENLDAP_VERSION "2.4.50" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "" + +/* define if sched_yield yields the entire process */ +/* #undef REPLACE_BROKEN_YIELD */ + +/* Define as the return type of signal handlers (`int' or `void'). */ +#define RETSIGTYPE void + +/* Define to the type of arg 1 for `select'. */ +#define SELECT_TYPE_ARG1 int + +/* Define to the type of args 2, 3 and 4 for `select'. */ +#define SELECT_TYPE_ARG234 (fd_set *) + +/* Define to the type of arg 5 for `select'. */ +#define SELECT_TYPE_ARG5 (struct timeval *) + +/* The size of `int', as computed by sizeof. */ +#define SIZEOF_INT 4 + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG 8 + +/* The size of `long long', as computed by sizeof. */ +#define SIZEOF_LONG_LONG 8 + +/* The size of `short', as computed by sizeof. */ +#define SIZEOF_SHORT 2 + +/* The size of `wchar_t', as computed by sizeof. */ +#define SIZEOF_WCHAR_T 4 + +/* define to support per-object ACIs */ +/* #undef SLAPD_ACI_ENABLED */ + +/* define to support BDB backend */ +#define SLAPD_BDB SLAPD_MOD_STATIC + +/* define to support cleartext passwords */ +#define SLAPD_CLEARTEXT 1 + +/* define to support crypt(3) passwords */ +/* #undef SLAPD_CRYPT */ + +/* define to support DNS SRV backend */ +/* #undef SLAPD_DNSSRV */ + +/* define to support HDB backend */ +#define SLAPD_HDB SLAPD_MOD_STATIC + +/* define to support LDAP backend */ +/* #undef SLAPD_LDAP */ + +/* define to support LAN Manager passwords */ +/* #undef SLAPD_LMHASH */ + +/* define to support MDB backend */ +#define SLAPD_MDB SLAPD_MOD_STATIC + +/* define to support LDAP Metadirectory backend */ +/* #undef SLAPD_META */ + +/* define to support modules */ +/* #undef SLAPD_MODULES */ + +/* dynamically linked module */ +#define SLAPD_MOD_DYNAMIC 2 + +/* statically linked module */ +#define SLAPD_MOD_STATIC 1 + +/* define to support cn=Monitor backend */ +#define SLAPD_MONITOR SLAPD_MOD_STATIC + +/* define to support NDB backend */ +/* #undef SLAPD_NDB */ + +/* define to support NULL backend */ +/* #undef SLAPD_NULL */ + +/* define for In-Directory Access Logging overlay */ +/* #undef SLAPD_OVER_ACCESSLOG */ + +/* define for Audit Logging overlay */ +/* #undef SLAPD_OVER_AUDITLOG */ + +/* define for Collect overlay */ +/* #undef SLAPD_OVER_COLLECT */ + +/* define for Attribute Constraint overlay */ +/* #undef SLAPD_OVER_CONSTRAINT */ + +/* define for Dynamic Directory Services overlay */ +/* #undef SLAPD_OVER_DDS */ + +/* define for Dynamic Directory Services overlay */ +/* #undef SLAPD_OVER_DEREF */ + +/* define for Dynamic Group overlay */ +/* #undef SLAPD_OVER_DYNGROUP */ + +/* define for Dynamic List overlay */ +/* #undef SLAPD_OVER_DYNLIST */ + +/* define for Reverse Group Membership overlay */ +/* #undef SLAPD_OVER_MEMBEROF */ + +/* define for Password Policy overlay */ +/* #undef SLAPD_OVER_PPOLICY */ + +/* define for Proxy Cache overlay */ +/* #undef SLAPD_OVER_PROXYCACHE */ + +/* define for Referential Integrity overlay */ +/* #undef SLAPD_OVER_REFINT */ + +/* define for Return Code Integrity overlay */ +/* #undef SLAPD_OVER_RETCODE */ + +/* define for Rewrite/Remap overlay */ +/* #undef SLAPD_OVER_RWM */ + +/* define for Sequential Modify overlay */ +/* #undef SLAPD_OVER_SEQMOD */ + +/* define for ServerSideSort/VLV overlay */ +/* #undef SLAPD_OVER_SSSVLV */ + +/* define for Syncrepl Provider overlay */ +#define SLAPD_OVER_SYNCPROV SLAPD_MOD_STATIC + +/* define for Translucent Proxy overlay */ +/* #undef SLAPD_OVER_TRANSLUCENT */ + +/* define for Attribute Uniqueness overlay */ +/* #undef SLAPD_OVER_UNIQUE */ + +/* define for Value Sorting overlay */ +/* #undef SLAPD_OVER_VALSORT */ + +/* define to support PASSWD backend */ +/* #undef SLAPD_PASSWD */ + +/* define to support PERL backend */ +/* #undef SLAPD_PERL */ + +/* define to support relay backend */ +#define SLAPD_RELAY SLAPD_MOD_STATIC + +/* define to support reverse lookups */ +/* #undef SLAPD_RLOOKUPS */ + +/* define to support SHELL backend */ +/* #undef SLAPD_SHELL */ + +/* define to support SOCK backend */ +/* #undef SLAPD_SOCK */ + +/* define to support SASL passwords */ +/* #undef SLAPD_SPASSWD */ + +/* define to support SQL backend */ +/* #undef SLAPD_SQL */ + +/* define to support run-time loadable ACL */ +/* #undef SLAP_DYNACL */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define to 1 if you can safely include both and . */ +#define TIME_WITH_SYS_TIME 1 + +/* Define to 1 if your declares `struct tm'. */ +/* #undef TM_IN_SYS_TIME */ + +/* set to urandom device */ +#define URANDOM_DEVICE "/dev/urandom" + +/* define to use OpenSSL BIGNUM for MP */ +/* #undef USE_MP_BIGNUM */ + +/* define to use GMP for MP */ +/* #undef USE_MP_GMP */ + +/* define to use 'long' for MP */ +/* #undef USE_MP_LONG */ + +/* define to use 'long long' for MP */ +#define USE_MP_LONG_LONG 1 + +/* Define to 1 if your processor stores words with the most significant byte + first (like Motorola and SPARC, unlike Intel and VAX). */ +/* #undef WORDS_BIGENDIAN */ + +/* Define to the type of arg 3 for `accept'. */ +#define ber_socklen_t socklen_t + +/* Define to `char *' if does not define. */ +/* #undef caddr_t */ + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to `int' if doesn't define. */ +/* #undef gid_t */ + +/* Define to `int' if does not define. */ +/* #undef mode_t */ + +/* Define to `long' if does not define. */ +/* #undef off_t */ + +/* Define to `int' if does not define. */ +/* #undef pid_t */ + +/* Define to `int' if does not define. */ +/* #undef sig_atomic_t */ + +/* Define to `unsigned' if does not define. */ +/* #undef size_t */ + +/* define to snprintf routine */ +/* #undef snprintf */ + +/* Define like ber_socklen_t if does not define. */ +/* #undef socklen_t */ + +/* Define to `signed int' if does not define. */ +/* #undef ssize_t */ + +/* Define to `int' if doesn't define. */ +/* #undef uid_t */ + +/* define as empty if volatile is not supported */ +/* #undef volatile */ + +/* define to snprintf routine */ +/* #undef vsnprintf */ + + +/* begin of portable.h.post */ + +#ifdef _WIN32 + /* don't suck in all of the win32 api */ +# define WIN32_LEAN_AND_MEAN 1 +#endif + +#ifndef LDAP_NEEDS_PROTOTYPES +/* force LDAP_P to always include prototypes */ +#define LDAP_NEEDS_PROTOTYPES 1 +#endif + +#ifndef LDAP_REL_ENG +#if (LDAP_VENDOR_VERSION == 000000) && !defined(LDAP_DEVEL) +#define LDAP_DEVEL +#endif +#if defined(LDAP_DEVEL) && !defined(LDAP_TEST) +#define LDAP_TEST +#endif +#endif + +#ifdef HAVE_STDDEF_H +# include +#endif + +#ifdef HAVE_EBCDIC +/* ASCII/EBCDIC converting replacements for stdio funcs + * vsnprintf and snprintf are used too, but they are already + * checked by the configure script + */ +#define fputs ber_pvt_fputs +#define fgets ber_pvt_fgets +#define printf ber_pvt_printf +#define fprintf ber_pvt_fprintf +#define vfprintf ber_pvt_vfprintf +#define vsprintf ber_pvt_vsprintf +#endif + +#include "ac/fdset.h" + +#include "ldap_cdefs.h" +#include "ldap_features.h" + +#include "ac/assert.h" +#include "ac/localize.h" + +#endif /* _LDAP_PORTABLE_H */ +/* end of portable.h.post */ + diff --git a/deps/include/portable.hin b/deps/include/portable.hin new file mode 100644 index 0000000..ea5f73b --- /dev/null +++ b/deps/include/portable.hin @@ -0,0 +1,1172 @@ +/* include/portable.hin. Generated from configure.in by autoheader. */ + + +/* begin of portable.h.pre */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +#ifndef _LDAP_PORTABLE_H +#define _LDAP_PORTABLE_H + +/* define this if needed to get reentrant functions */ +#ifndef REENTRANT +#undef REENTRANT +#endif +#ifndef _REENTRANT +#undef _REENTRANT +#endif + +/* define this if needed to get threadsafe functions */ +#ifndef THREADSAFE +#undef THREADSAFE +#endif +#ifndef _THREADSAFE +#undef _THREADSAFE +#endif +#ifndef THREAD_SAFE +#undef THREAD_SAFE +#endif +#ifndef _THREAD_SAFE +#undef _THREAD_SAFE +#endif + +#ifndef _SGI_MP_SOURCE +#undef _SGI_MP_SOURCE +#endif + +/* end of portable.h.pre */ + + +/* define to use both and */ +#undef BOTH_STRINGS_H + +/* define if cross compiling */ +#undef CROSS_COMPILING + +/* set to the number of arguments ctime_r() expects */ +#undef CTIME_R_NARGS + +/* define if toupper() requires islower() */ +#undef C_UPPER_LOWER + +/* define if sys_errlist is not declared in stdio.h or errno.h */ +#undef DECL_SYS_ERRLIST + +/* define to enable rewriting in back-ldap and back-meta */ +#undef ENABLE_REWRITE + +/* define to enable slapi library */ +#undef ENABLE_SLAPI + +/* defined to be the EXE extension */ +#undef EXEEXT + +/* set to the number of arguments gethostbyaddr_r() expects */ +#undef GETHOSTBYADDR_R_NARGS + +/* set to the number of arguments gethostbyname_r() expects */ +#undef GETHOSTBYNAME_R_NARGS + +/* Define to 1 if `TIOCGWINSZ' requires . */ +#undef GWINSZ_IN_SYS_IOCTL + +/* define if you have AIX security lib */ +#undef HAVE_AIX_SECURITY + +/* 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_ARPA_NAMESER_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_ASSERT_H + +/* Define to 1 if you have the `bcopy' function. */ +#undef HAVE_BCOPY + +/* define this if Berkeley DB is available */ +#undef HAVE_BERKELEY_DB + +/* define if Berkeley DB has DB_THREAD support */ +#undef HAVE_BERKELEY_DB_THREAD + +/* Define to 1 if you have the header file. */ +#undef HAVE_BITS_TYPES_H + +/* Define to 1 if you have the `chroot' function. */ +#undef HAVE_CHROOT + +/* Define to 1 if you have the `closesocket' function. */ +#undef HAVE_CLOSESOCKET + +/* Define to 1 if you have the header file. */ +#undef HAVE_CONIO_H + +/* define if crypt(3) is available */ +#undef HAVE_CRYPT + +/* Define to 1 if you have the header file. */ +#undef HAVE_CRYPT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_CTHREADS_H + +/* Define to 1 if you have the `ctime_r' function. */ +#undef HAVE_CTIME_R + +/* define if you have Cyrus SASL */ +#undef HAVE_CYRUS_SASL + +/* Define to 1 if you have the header file. */ +#undef HAVE_DB_H + +/* define if your system supports /dev/poll */ +#undef HAVE_DEVPOLL + +/* Define to 1 if you have the header file. */ +#undef HAVE_DIRECT_H + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_DIRENT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ +#undef HAVE_DOPRNT + +/* define if system uses EBCDIC instead of ASCII */ +#undef HAVE_EBCDIC + +/* Define to 1 if you have the `endgrent' function. */ +#undef HAVE_ENDGRENT + +/* Define to 1 if you have the `endpwent' function. */ +#undef HAVE_ENDPWENT + +/* define if your system supports epoll */ +#undef HAVE_EPOLL + +/* Define to 1 if you have the header file. */ +#undef HAVE_ERRNO_H + +/* Define to 1 if you have the `fcntl' function. */ +#undef HAVE_FCNTL + +/* Define to 1 if you have the header file. */ +#undef HAVE_FCNTL_H + +/* define if you actually have FreeBSD fetch(3) */ +#undef HAVE_FETCH + +/* Define to 1 if you have the header file. */ +#undef HAVE_FILIO_H + +/* Define to 1 if you have the `flock' function. */ +#undef HAVE_FLOCK + +/* Define to 1 if you have the `fstat' function. */ +#undef HAVE_FSTAT + +/* Define to 1 if you have the `gai_strerror' function. */ +#undef HAVE_GAI_STRERROR + +/* Define to 1 if you have the `getaddrinfo' function. */ +#undef HAVE_GETADDRINFO + +/* Define to 1 if you have the `getdtablesize' function. */ +#undef HAVE_GETDTABLESIZE + +/* Define to 1 if you have the `geteuid' function. */ +#undef HAVE_GETEUID + +/* Define to 1 if you have the `getgrgid' function. */ +#undef HAVE_GETGRGID + +/* Define to 1 if you have the `gethostbyaddr_r' function. */ +#undef HAVE_GETHOSTBYADDR_R + +/* Define to 1 if you have the `gethostbyname_r' function. */ +#undef HAVE_GETHOSTBYNAME_R + +/* Define to 1 if you have the `gethostname' function. */ +#undef HAVE_GETHOSTNAME + +/* Define to 1 if you have the `getnameinfo' function. */ +#undef HAVE_GETNAMEINFO + +/* Define to 1 if you have the `getopt' function. */ +#undef HAVE_GETOPT + +/* Define to 1 if you have the header file. */ +#undef HAVE_GETOPT_H + +/* Define to 1 if you have the `getpassphrase' function. */ +#undef HAVE_GETPASSPHRASE + +/* Define to 1 if you have the `getpeereid' function. */ +#undef HAVE_GETPEEREID + +/* Define to 1 if you have the `getpeerucred' function. */ +#undef HAVE_GETPEERUCRED + +/* Define to 1 if you have the `getpwnam' function. */ +#undef HAVE_GETPWNAM + +/* Define to 1 if you have the `getpwuid' function. */ +#undef HAVE_GETPWUID + +/* Define to 1 if you have the `getspnam' function. */ +#undef HAVE_GETSPNAM + +/* Define to 1 if you have the `gettimeofday' function. */ +#undef HAVE_GETTIMEOFDAY + +/* Define to 1 if you have the header file. */ +#undef HAVE_GMP_H + +/* Define to 1 if you have the `gmtime_r' function. */ +#undef HAVE_GMTIME_R + +/* define if you have GNUtls */ +#undef HAVE_GNUTLS + +/* Define to 1 if you have the header file. */ +#undef HAVE_GNUTLS_GNUTLS_H + +/* if you have GNU Pth */ +#undef HAVE_GNU_PTH + +/* Define to 1 if you have the header file. */ +#undef HAVE_GRP_H + +/* Define to 1 if you have the `hstrerror' function. */ +#undef HAVE_HSTRERROR + +/* define to you inet_aton(3) is available */ +#undef HAVE_INET_ATON + +/* Define to 1 if you have the `inet_ntoa_b' function. */ +#undef HAVE_INET_NTOA_B + +/* Define to 1 if you have the `inet_ntop' function. */ +#undef HAVE_INET_NTOP + +/* Define to 1 if you have the `initgroups' function. */ +#undef HAVE_INITGROUPS + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `ioctl' function. */ +#undef HAVE_IOCTL + +/* Define to 1 if you have the header file. */ +#undef HAVE_IO_H + +/* Define to 1 if you have the `gen' library (-lgen). */ +#undef HAVE_LIBGEN + +/* Define to 1 if you have the `gmp' library (-lgmp). */ +#undef HAVE_LIBGMP + +/* Define to 1 if you have the `inet' library (-linet). */ +#undef HAVE_LIBINET + +/* define if you have libtool -ltdl */ +#undef HAVE_LIBLTDL + +/* Define to 1 if you have the `net' library (-lnet). */ +#undef HAVE_LIBNET + +/* Define to 1 if you have the `nsl' library (-lnsl). */ +#undef HAVE_LIBNSL + +/* Define to 1 if you have the `nsl_s' library (-lnsl_s). */ +#undef HAVE_LIBNSL_S + +/* Define to 1 if you have the `socket' library (-lsocket). */ +#undef HAVE_LIBSOCKET + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIBUTIL_H + +/* Define to 1 if you have the `V3' library (-lV3). */ +#undef HAVE_LIBV3 + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIMITS_H + +/* if you have LinuxThreads */ +#undef HAVE_LINUX_THREADS + +/* Define to 1 if you have the header file. */ +#undef HAVE_LOCALE_H + +/* Define to 1 if you have the `localtime_r' function. */ +#undef HAVE_LOCALTIME_R + +/* Define to 1 if you have the `lockf' function. */ +#undef HAVE_LOCKF + +/* Define to 1 if the system has the type `long long'. */ +#undef HAVE_LONG_LONG + +/* Define to 1 if you have the header file. */ +#undef HAVE_LTDL_H + +/* define if you have Mach Cthreads */ +#undef HAVE_MACH_CTHREADS + +/* Define to 1 if you have the header file. */ +#undef HAVE_MACH_CTHREADS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MALLOC_H + +/* Define to 1 if you have the `memcpy' function. */ +#undef HAVE_MEMCPY + +/* 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 `memrchr' function. */ +#undef HAVE_MEMRCHR + +/* Define to 1 if you have the `mkstemp' function. */ +#undef HAVE_MKSTEMP + +/* Define to 1 if you have the `mktemp' function. */ +#undef HAVE_MKTEMP + +/* define this if you have mkversion */ +#undef HAVE_MKVERSION + +/* define if you have MozNSS */ +#undef HAVE_MOZNSS + +/* Define to 1 if you have the header file, and it defines `DIR'. */ +#undef HAVE_NDIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETINET_TCP_H + +/* define if strerror_r returns char* instead of int */ +#undef HAVE_NONPOSIX_STRERROR_R + +/* Define to 1 if you have the header file. */ +#undef HAVE_NSSUTIL_H + +/* if you have NT Event Log */ +#undef HAVE_NT_EVENT_LOG + +/* if you have NT Service Manager */ +#undef HAVE_NT_SERVICE_MANAGER + +/* if you have NT Threads */ +#undef HAVE_NT_THREADS + +/* define if you have OpenSSL */ +#undef HAVE_OPENSSL + +/* Define to 1 if you have the header file. */ +#undef HAVE_OPENSSL_BN_H + +/* define if you have OpenSSL with CRL checking capability */ +#undef HAVE_OPENSSL_CRL + +/* Define to 1 if you have the header file. */ +#undef HAVE_OPENSSL_CRYPTO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_OPENSSL_SSL_H + +/* Define to 1 if you have the `pipe' function. */ +#undef HAVE_PIPE + +/* Define to 1 if you have the `poll' function. */ +#undef HAVE_POLL + +/* Define to 1 if you have the header file. */ +#undef HAVE_POLL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_PROCESS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_PSAP_H + +/* define to pthreads API spec revision */ +#undef HAVE_PTHREADS + +/* define if you have pthread_detach function */ +#undef HAVE_PTHREAD_DETACH + +/* Define to 1 if you have the `pthread_getconcurrency' function. */ +#undef HAVE_PTHREAD_GETCONCURRENCY + +/* Define to 1 if you have the header file. */ +#undef HAVE_PTHREAD_H + +/* Define to 1 if you have the `pthread_kill' function. */ +#undef HAVE_PTHREAD_KILL + +/* Define to 1 if you have the `pthread_kill_other_threads_np' function. */ +#undef HAVE_PTHREAD_KILL_OTHER_THREADS_NP + +/* define if you have pthread_rwlock_destroy function */ +#undef HAVE_PTHREAD_RWLOCK_DESTROY + +/* Define to 1 if you have the `pthread_setconcurrency' function. */ +#undef HAVE_PTHREAD_SETCONCURRENCY + +/* Define to 1 if you have the `pthread_yield' function. */ +#undef HAVE_PTHREAD_YIELD + +/* Define to 1 if you have the header file. */ +#undef HAVE_PTH_H + +/* Define to 1 if the system has the type `ptrdiff_t'. */ +#undef HAVE_PTRDIFF_T + +/* Define to 1 if you have the header file. */ +#undef HAVE_PWD_H + +/* Define to 1 if you have the `read' function. */ +#undef HAVE_READ + +/* Define to 1 if you have the `recv' function. */ +#undef HAVE_RECV + +/* Define to 1 if you have the `recvfrom' function. */ +#undef HAVE_RECVFROM + +/* Define to 1 if you have the header file. */ +#undef HAVE_REGEX_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_RESOLV_H + +/* define if you have res_query() */ +#undef HAVE_RES_QUERY + +/* define if OpenSSL needs RSAref */ +#undef HAVE_RSAREF + +/* Define to 1 if you have the header file. */ +#undef HAVE_SASL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SASL_SASL_H + +/* define if your SASL library has sasl_version() */ +#undef HAVE_SASL_VERSION + +/* Define to 1 if you have the header file. */ +#undef HAVE_SCHED_H + +/* Define to 1 if you have the `sched_yield' function. */ +#undef HAVE_SCHED_YIELD + +/* Define to 1 if you have the `send' function. */ +#undef HAVE_SEND + +/* Define to 1 if you have the `sendmsg' function. */ +#undef HAVE_SENDMSG + +/* Define to 1 if you have the `sendto' function. */ +#undef HAVE_SENDTO + +/* Define to 1 if you have the `setegid' function. */ +#undef HAVE_SETEGID + +/* Define to 1 if you have the `seteuid' function. */ +#undef HAVE_SETEUID + +/* Define to 1 if you have the `setgid' function. */ +#undef HAVE_SETGID + +/* define if setproctitle(3) is available */ +#undef HAVE_SETPROCTITLE + +/* Define to 1 if you have the `setpwfile' function. */ +#undef HAVE_SETPWFILE + +/* Define to 1 if you have the `setsid' function. */ +#undef HAVE_SETSID + +/* Define to 1 if you have the `setuid' function. */ +#undef HAVE_SETUID + +/* Define to 1 if you have the header file. */ +#undef HAVE_SGTTY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SHADOW_H + +/* Define to 1 if you have the `sigaction' function. */ +#undef HAVE_SIGACTION + +/* Define to 1 if you have the `signal' function. */ +#undef HAVE_SIGNAL + +/* Define to 1 if you have the `sigset' function. */ +#undef HAVE_SIGSET + +/* define if you have -lslp */ +#undef HAVE_SLP + +/* Define to 1 if you have the header file. */ +#undef HAVE_SLP_H + +/* Define to 1 if you have the `snprintf' function. */ +#undef HAVE_SNPRINTF + +/* if you have spawnlp() */ +#undef HAVE_SPAWNLP + +/* Define to 1 if you have the header file. */ +#undef HAVE_SQLEXT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SQL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDDEF_H + +/* 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 `strdup' function. */ +#undef HAVE_STRDUP + +/* Define to 1 if you have the `strerror' function. */ +#undef HAVE_STRERROR + +/* Define to 1 if you have the `strerror_r' function. */ +#undef HAVE_STRERROR_R + +/* Define to 1 if you have the `strftime' function. */ +#undef HAVE_STRFTIME + +/* 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 `strpbrk' function. */ +#undef HAVE_STRPBRK + +/* Define to 1 if you have the `strrchr' function. */ +#undef HAVE_STRRCHR + +/* Define to 1 if you have the `strsep' function. */ +#undef HAVE_STRSEP + +/* Define to 1 if you have the `strspn' function. */ +#undef HAVE_STRSPN + +/* Define to 1 if you have the `strstr' function. */ +#undef HAVE_STRSTR + +/* Define to 1 if you have the `strtol' function. */ +#undef HAVE_STRTOL + +/* Define to 1 if you have the `strtoll' function. */ +#undef HAVE_STRTOLL + +/* Define to 1 if you have the `strtoq' function. */ +#undef HAVE_STRTOQ + +/* Define to 1 if you have the `strtoul' function. */ +#undef HAVE_STRTOUL + +/* Define to 1 if you have the `strtoull' function. */ +#undef HAVE_STRTOULL + +/* Define to 1 if you have the `strtouq' function. */ +#undef HAVE_STRTOUQ + +/* Define to 1 if `msg_accrightslen' is member of `struct msghdr'. */ +#undef HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTSLEN + +/* Define to 1 if `msg_control' is member of `struct msghdr'. */ +#undef HAVE_STRUCT_MSGHDR_MSG_CONTROL + +/* Define to 1 if `pw_gecos' is member of `struct passwd'. */ +#undef HAVE_STRUCT_PASSWD_PW_GECOS + +/* Define to 1 if `pw_passwd' is member of `struct passwd'. */ +#undef HAVE_STRUCT_PASSWD_PW_PASSWD + +/* Define to 1 if `st_blksize' is member of `struct stat'. */ +#undef HAVE_STRUCT_STAT_ST_BLKSIZE + +/* Define to 1 if `st_fstype' is member of `struct stat'. */ +#undef HAVE_STRUCT_STAT_ST_FSTYPE + +/* define to 1 if st_fstype is char * */ +#undef HAVE_STRUCT_STAT_ST_FSTYPE_CHAR + +/* define to 1 if st_fstype is int */ +#undef HAVE_STRUCT_STAT_ST_FSTYPE_INT + +/* Define to 1 if `st_vfstype' is member of `struct stat'. */ +#undef HAVE_STRUCT_STAT_ST_VFSTYPE + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYNCH_H + +/* Define to 1 if you have the `sysconf' function. */ +#undef HAVE_SYSCONF + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYSEXITS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYSLOG_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_DEVPOLL_H + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_SYS_DIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_EPOLL_H + +/* define if you actually have sys_errlist in your libs */ +#undef HAVE_SYS_ERRLIST + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_ERRNO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_FILE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_FILIO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_FSTYP_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_IOCTL_H + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_SYS_NDIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PARAM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_POLL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PRIVGRP_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_RESOURCE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SELECT_H + +/* 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_SYSLOG_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_UCRED_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_UIO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_UN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_UUID_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_VMOUNT_H + +/* Define to 1 if you have that is POSIX.1 compatible. */ +#undef HAVE_SYS_WAIT_H + +/* define if you have -lwrap */ +#undef HAVE_TCPD + +/* Define to 1 if you have the header file. */ +#undef HAVE_TCPD_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_TERMIOS_H + +/* if you have Solaris LWP (thr) package */ +#undef HAVE_THR + +/* Define to 1 if you have the header file. */ +#undef HAVE_THREAD_H + +/* Define to 1 if you have the `thr_getconcurrency' function. */ +#undef HAVE_THR_GETCONCURRENCY + +/* Define to 1 if you have the `thr_setconcurrency' function. */ +#undef HAVE_THR_SETCONCURRENCY + +/* Define to 1 if you have the `thr_yield' function. */ +#undef HAVE_THR_YIELD + +/* define if you have TLS */ +#undef HAVE_TLS + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UTIME_H + +/* define if you have uuid_generate() */ +#undef HAVE_UUID_GENERATE + +/* define if you have uuid_to_str() */ +#undef HAVE_UUID_TO_STR + +/* Define to 1 if you have the header file. */ +#undef HAVE_UUID_UUID_H + +/* Define to 1 if you have the `vprintf' function. */ +#undef HAVE_VPRINTF + +/* Define to 1 if you have the `vsnprintf' function. */ +#undef HAVE_VSNPRINTF + +/* Define to 1 if you have the `wait4' function. */ +#undef HAVE_WAIT4 + +/* Define to 1 if you have the `waitpid' function. */ +#undef HAVE_WAITPID + +/* define if you have winsock */ +#undef HAVE_WINSOCK + +/* define if you have winsock2 */ +#undef HAVE_WINSOCK2 + +/* Define to 1 if you have the header file. */ +#undef HAVE_WINSOCK2_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_WINSOCK_H + +/* Define to 1 if you have the `write' function. */ +#undef HAVE_WRITE + +/* define if select implicitly yields */ +#undef HAVE_YIELDING_SELECT + +/* Define to 1 if you have the `_vsnprintf' function. */ +#undef HAVE__VSNPRINTF + +/* define to 32-bit or greater integer type */ +#undef LBER_INT_T + +/* define to large integer type */ +#undef LBER_LEN_T + +/* define to socket descriptor type */ +#undef LBER_SOCKET_T + +/* define to large integer type */ +#undef LBER_TAG_T + +/* define to 1 if library is thread safe */ +#undef LDAP_API_FEATURE_X_OPENLDAP_THREAD_SAFE + +/* define to LDAP VENDOR VERSION */ +#undef LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS + +/* define this to add debugging code */ +#undef LDAP_DEBUG + +/* define if LDAP libs are dynamic */ +#undef LDAP_LIBS_DYNAMIC + +/* define to support PF_INET6 */ +#undef LDAP_PF_INET6 + +/* define to support PF_LOCAL */ +#undef LDAP_PF_LOCAL + +/* define this for LDAP process title support */ +#undef LDAP_PROCTITLE + +/* define this to add SLAPI code */ +#undef LDAP_SLAPI + +/* define this to add syslog code */ +#undef LDAP_SYSLOG + +/* Version */ +#undef LDAP_VENDOR_VERSION + +/* Major */ +#undef LDAP_VENDOR_VERSION_MAJOR + +/* Minor */ +#undef LDAP_VENDOR_VERSION_MINOR + +/* Patch */ +#undef LDAP_VENDOR_VERSION_PATCH + +/* define if memcmp is not 8-bit clean or is otherwise broken */ +#undef NEED_MEMCMP_REPLACEMENT + +/* define if you have (or want) no threads */ +#undef NO_THREADS + +/* define to use the original debug style */ +#undef OLD_DEBUG + +/* Package */ +#undef OPENLDAP_PACKAGE + +/* Version */ +#undef OPENLDAP_VERSION + +/* 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 version of this package. */ +#undef PACKAGE_VERSION + +/* define if sched_yield yields the entire process */ +#undef REPLACE_BROKEN_YIELD + +/* Define as the return type of signal handlers (`int' or `void'). */ +#undef RETSIGTYPE + +/* Define to the type of arg 1 for `select'. */ +#undef SELECT_TYPE_ARG1 + +/* Define to the type of args 2, 3 and 4 for `select'. */ +#undef SELECT_TYPE_ARG234 + +/* Define to the type of arg 5 for `select'. */ +#undef SELECT_TYPE_ARG5 + +/* The size of `int', as computed by sizeof. */ +#undef SIZEOF_INT + +/* The size of `long', as computed by sizeof. */ +#undef SIZEOF_LONG + +/* The size of `long long', as computed by sizeof. */ +#undef SIZEOF_LONG_LONG + +/* The size of `short', as computed by sizeof. */ +#undef SIZEOF_SHORT + +/* The size of `wchar_t', as computed by sizeof. */ +#undef SIZEOF_WCHAR_T + +/* define to support per-object ACIs */ +#undef SLAPD_ACI_ENABLED + +/* define to support BDB backend */ +#undef SLAPD_BDB + +/* define to support cleartext passwords */ +#undef SLAPD_CLEARTEXT + +/* define to support crypt(3) passwords */ +#undef SLAPD_CRYPT + +/* define to support DNS SRV backend */ +#undef SLAPD_DNSSRV + +/* define to support HDB backend */ +#undef SLAPD_HDB + +/* define to support LDAP backend */ +#undef SLAPD_LDAP + +/* define to support LAN Manager passwords */ +#undef SLAPD_LMHASH + +/* define to support MDB backend */ +#undef SLAPD_MDB + +/* define to support LDAP Metadirectory backend */ +#undef SLAPD_META + +/* define to support modules */ +#undef SLAPD_MODULES + +/* dynamically linked module */ +#undef SLAPD_MOD_DYNAMIC + +/* statically linked module */ +#undef SLAPD_MOD_STATIC + +/* define to support cn=Monitor backend */ +#undef SLAPD_MONITOR + +/* define to support NDB backend */ +#undef SLAPD_NDB + +/* define to support NULL backend */ +#undef SLAPD_NULL + +/* define for In-Directory Access Logging overlay */ +#undef SLAPD_OVER_ACCESSLOG + +/* define for Audit Logging overlay */ +#undef SLAPD_OVER_AUDITLOG + +/* define for Collect overlay */ +#undef SLAPD_OVER_COLLECT + +/* define for Attribute Constraint overlay */ +#undef SLAPD_OVER_CONSTRAINT + +/* define for Dynamic Directory Services overlay */ +#undef SLAPD_OVER_DDS + +/* define for Dynamic Directory Services overlay */ +#undef SLAPD_OVER_DEREF + +/* define for Dynamic Group overlay */ +#undef SLAPD_OVER_DYNGROUP + +/* define for Dynamic List overlay */ +#undef SLAPD_OVER_DYNLIST + +/* define for Reverse Group Membership overlay */ +#undef SLAPD_OVER_MEMBEROF + +/* define for Password Policy overlay */ +#undef SLAPD_OVER_PPOLICY + +/* define for Proxy Cache overlay */ +#undef SLAPD_OVER_PROXYCACHE + +/* define for Referential Integrity overlay */ +#undef SLAPD_OVER_REFINT + +/* define for Return Code Integrity overlay */ +#undef SLAPD_OVER_RETCODE + +/* define for Rewrite/Remap overlay */ +#undef SLAPD_OVER_RWM + +/* define for Sequential Modify overlay */ +#undef SLAPD_OVER_SEQMOD + +/* define for ServerSideSort/VLV overlay */ +#undef SLAPD_OVER_SSSVLV + +/* define for Syncrepl Provider overlay */ +#undef SLAPD_OVER_SYNCPROV + +/* define for Translucent Proxy overlay */ +#undef SLAPD_OVER_TRANSLUCENT + +/* define for Attribute Uniqueness overlay */ +#undef SLAPD_OVER_UNIQUE + +/* define for Value Sorting overlay */ +#undef SLAPD_OVER_VALSORT + +/* define to support PASSWD backend */ +#undef SLAPD_PASSWD + +/* define to support PERL backend */ +#undef SLAPD_PERL + +/* define to support relay backend */ +#undef SLAPD_RELAY + +/* define to support reverse lookups */ +#undef SLAPD_RLOOKUPS + +/* define to support SHELL backend */ +#undef SLAPD_SHELL + +/* define to support SOCK backend */ +#undef SLAPD_SOCK + +/* define to support SASL passwords */ +#undef SLAPD_SPASSWD + +/* define to support SQL backend */ +#undef SLAPD_SQL + +/* define to support run-time loadable ACL */ +#undef SLAP_DYNACL + +/* 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 + +/* Define to 1 if your declares `struct tm'. */ +#undef TM_IN_SYS_TIME + +/* set to urandom device */ +#undef URANDOM_DEVICE + +/* define to use OpenSSL BIGNUM for MP */ +#undef USE_MP_BIGNUM + +/* define to use GMP for MP */ +#undef USE_MP_GMP + +/* define to use 'long' for MP */ +#undef USE_MP_LONG + +/* define to use 'long long' for MP */ +#undef USE_MP_LONG_LONG + +/* Define to 1 if your processor stores words with the most significant byte + first (like Motorola and SPARC, unlike Intel and VAX). */ +#undef WORDS_BIGENDIAN + +/* Define to the type of arg 3 for `accept'. */ +#undef ber_socklen_t + +/* Define to `char *' if does not define. */ +#undef caddr_t + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `int' if doesn't define. */ +#undef gid_t + +/* Define to `int' if does not define. */ +#undef mode_t + +/* Define to `long' if does not define. */ +#undef off_t + +/* Define to `int' if does not define. */ +#undef pid_t + +/* Define to `int' if does not define. */ +#undef sig_atomic_t + +/* Define to `unsigned' if does not define. */ +#undef size_t + +/* define to snprintf routine */ +#undef snprintf + +/* Define like ber_socklen_t if does not define. */ +#undef socklen_t + +/* Define to `signed int' if does not define. */ +#undef ssize_t + +/* Define to `int' if doesn't define. */ +#undef uid_t + +/* define as empty if volatile is not supported */ +#undef volatile + +/* define to snprintf routine */ +#undef vsnprintf + + +/* begin of portable.h.post */ + +#ifdef _WIN32 + /* don't suck in all of the win32 api */ +# define WIN32_LEAN_AND_MEAN 1 +#endif + +#ifndef LDAP_NEEDS_PROTOTYPES +/* force LDAP_P to always include prototypes */ +#define LDAP_NEEDS_PROTOTYPES 1 +#endif + +#ifndef LDAP_REL_ENG +#if (LDAP_VENDOR_VERSION == 000000) && !defined(LDAP_DEVEL) +#define LDAP_DEVEL +#endif +#if defined(LDAP_DEVEL) && !defined(LDAP_TEST) +#define LDAP_TEST +#endif +#endif + +#ifdef HAVE_STDDEF_H +# include +#endif + +#ifdef HAVE_EBCDIC +/* ASCII/EBCDIC converting replacements for stdio funcs + * vsnprintf and snprintf are used too, but they are already + * checked by the configure script + */ +#define fputs ber_pvt_fputs +#define fgets ber_pvt_fgets +#define printf ber_pvt_printf +#define fprintf ber_pvt_fprintf +#define vfprintf ber_pvt_vfprintf +#define vsprintf ber_pvt_vsprintf +#endif + +#include "ac/fdset.h" + +#include "ldap_cdefs.h" +#include "ldap_features.h" + +#include "ac/assert.h" +#include "ac/localize.h" + +#endif /* _LDAP_PORTABLE_H */ +/* end of portable.h.post */ + diff --git a/deps/include/rewrite.h b/deps/include/rewrite.h new file mode 100644 index 0000000..fe30402 --- /dev/null +++ b/deps/include/rewrite.h @@ -0,0 +1,298 @@ +/* $OpenLDAP$ + */ +/* This work is part of OpenLDAP Software . + * + * Copyright 2000-2020 The OpenLDAP Foundation. + * Portions Copyright 2000-2003 Pierangelo Masarati. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ +/* ACKNOWLEDGEMENT: + * This work was initially developed by Pierangelo Masarati for + * inclusion in OpenLDAP Software. + */ + +#ifndef REWRITE_H +#define REWRITE_H + +/* + * Default rewrite context + */ +#define REWRITE_DEFAULT_CONTEXT "default" + +/* + * Rewrite engine states + */ +#define REWRITE_OFF 0x0000 +#define REWRITE_ON 0x0001 +#define REWRITE_DEFAULT REWRITE_OFF + +/* + * Rewrite internal status returns + */ +#define REWRITE_SUCCESS LDAP_SUCCESS +#define REWRITE_ERR LDAP_OTHER + +/* + * Rewrite modes (input values for rewrite_info_init); determine the + * behavior in case a null or non existent context is required: + * + * REWRITE_MODE_ERR error + * REWRITE_MODE_OK no error but no rewrite + * REWRITE_MODE_COPY_INPUT a copy of the input is returned + * REWRITE_MODE_USE_DEFAULT the default context is used. + */ +#define REWRITE_MODE_ERR 0x0010 +#define REWRITE_MODE_OK 0x0011 +#define REWRITE_MODE_COPY_INPUT 0x0012 +#define REWRITE_MODE_USE_DEFAULT 0x0013 + +/* + * Rewrite status returns + * + * REWRITE_REGEXEC_OK success (result may be empty in case + * of no match) + * REWRITE_REGEXEC_ERR error (internal error, + * misconfiguration, map not working ...) + * REWRITE_REGEXEC_STOP internal use; never returned + * REWRITE_REGEXEC_UNWILLING the server should issue an 'unwilling + * to perform' error + */ +#define REWRITE_REGEXEC_OK (0) +#define REWRITE_REGEXEC_ERR (-1) +#define REWRITE_REGEXEC_STOP (-2) +#define REWRITE_REGEXEC_UNWILLING (-3) +#define REWRITE_REGEXEC_USER (1) /* and above: LDAP errors */ + +/* + * Rewrite variable flags + * REWRITE_VAR_INSERT insert mode (default) when adding + * a variable; if not set during value + * update, the variable is not inserted + * if not present + * REWRITE_VAR_UPDATE update mode (default) when updating + * a variable; if not set during insert, + * the value is not updated if the + * variable already exists + * REWRITE_VAR_COPY_NAME copy the variable name; if not set, + * the name is not copied; be sure the + * referenced string is available for + * the entire life scope of the variable. + * REWRITE_VAR_COPY_VALUE copy the variable value; if not set, + * the value is not copied; be sure the + * referenced string is available for + * the entire life scope of the variable. + */ +#define REWRITE_VAR_NONE 0x0000 +#define REWRITE_VAR_INSERT 0x0001 +#define REWRITE_VAR_UPDATE 0x0002 +#define REWRITE_VAR_COPY_NAME 0x0004 +#define REWRITE_VAR_COPY_VALUE 0x0008 + +/* + * Rewrite info + */ +struct rewrite_info; + +struct berval; /* avoid include */ + +LDAP_BEGIN_DECL + +/* + * Inits the info + */ +LDAP_REWRITE_F (struct rewrite_info *) +rewrite_info_init( + int mode +); + +/* + * Cleans up the info structure + */ +LDAP_REWRITE_F (int) +rewrite_info_delete( + struct rewrite_info **info +); + + +/* + * Parses a config line and takes actions to fit content in rewrite structure; + * lines handled are of the form: + * + * rewriteEngine {on|off} + * rewriteMaxPasses numPasses + * rewriteContext contextName [alias aliasedRewriteContex] + * rewriteRule pattern substPattern [ruleFlags] + * rewriteMap mapType mapName [mapArgs] + * rewriteParam paramName paramValue + */ +LDAP_REWRITE_F (int) +rewrite_parse( + struct rewrite_info *info, + const char *fname, + int lineno, + int argc, + char **argv +); + +/* + * process a config file that was already opened. Uses rewrite_parse. + */ +LDAP_REWRITE_F (int) +rewrite_read( + FILE *fin, + struct rewrite_info *info +); + +/* + * Rewrites a string according to context. + * If the engine is off, OK is returned, but the return string will be NULL. + * In case of 'unwilling to perform', UNWILLING is returned, and the + * return string will also be null. The same in case of error. + * Otherwise, OK is returned, and result will hold a newly allocated string + * with the rewriting. + * + * What to do in case of non-existing rewrite context is still an issue. + * Four possibilities: + * - error, + * - ok with NULL result, + * - ok with copy of string as result, + * - use the default rewrite context. + */ +LDAP_REWRITE_F (int) +rewrite( + struct rewrite_info *info, + const char *rewriteContext, + const char *string, + char **result +); + +/* + * Same as above; the cookie relates the rewrite to a session + */ +LDAP_REWRITE_F (int) +rewrite_session( + struct rewrite_info *info, + const char *rewriteContext, + const char *string, + const void *cookie, + char **result +); + +/* + * Inits a session + */ +LDAP_REWRITE_F (struct rewrite_session *) +rewrite_session_init( + struct rewrite_info *info, + const void *cookie +); + +/* + * Defines and inits a variable with session scope + */ +LDAP_REWRITE_F (int) +rewrite_session_var_set_f( + struct rewrite_info *info, + const void *cookie, + const char *name, + const char *value, + int flags +); + +#define rewrite_session_var_set(info, cookie, name, value) \ + rewrite_session_var_set_f((info), (cookie), (name), (value), \ + REWRITE_VAR_INSERT|REWRITE_VAR_UPDATE|REWRITE_VAR_COPY_NAME|REWRITE_VAR_COPY_VALUE) + +/* + * Deletes a session + */ +LDAP_REWRITE_F (int) +rewrite_session_delete( + struct rewrite_info *info, + const void *cookie +); + + +/* + * Params + */ + +/* + * Defines and inits a variable with global scope + */ +LDAP_REWRITE_F (int) +rewrite_param_set( + struct rewrite_info *info, + const char *name, + const char *value +); + +/* + * Gets a var with global scope + */ +LDAP_REWRITE_F (int) +rewrite_param_get( + struct rewrite_info *info, + const char *name, + struct berval *value +); + +/* + * Destroys the parameter tree + */ +LDAP_REWRITE_F (int) +rewrite_param_destroy( + struct rewrite_info *info +); + +/* + * Mapping implementations + */ + +struct rewrite_mapper; + +typedef void * (rewrite_mapper_config)( + const char *fname, + int lineno, + int argc, + char **argv ); + +typedef int (rewrite_mapper_apply)( + void *ctx, + const char *arg, + struct berval *retval ); + +typedef int (rewrite_mapper_destroy)( + void *ctx ); + +typedef struct rewrite_mapper { + char *rm_name; + rewrite_mapper_config *rm_config; + rewrite_mapper_apply *rm_apply; + rewrite_mapper_destroy *rm_destroy; +} rewrite_mapper; + +/* For dynamic loading and unloading of mappers */ +LDAP_REWRITE_F (int) +rewrite_mapper_register( + const rewrite_mapper *map ); + +LDAP_REWRITE_F (int) +rewrite_mapper_unregister( + const rewrite_mapper *map ); + +LDAP_REWRITE_F (const rewrite_mapper *) +rewrite_mapper_find( + const char *name ); + +LDAP_END_DECL + +#endif /* REWRITE_H */ diff --git a/deps/include/slapi-plugin.h b/deps/include/slapi-plugin.h new file mode 100644 index 0000000..514cb43 --- /dev/null +++ b/deps/include/slapi-plugin.h @@ -0,0 +1,905 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * Portions Copyright 1997,2002,2003 IBM Corporation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ + +/* + * This header is used in development of SLAPI plugins for + * OpenLDAP slapd(8) and other directory servers supporting + * this interface. Your portability mileage may vary. + */ + +#ifndef _SLAPI_PLUGIN_H +#define _SLAPI_PLUGIN_H + +#include + +typedef struct slapi_pblock Slapi_PBlock; +typedef struct slapi_entry Slapi_Entry; +typedef struct slapi_attr Slapi_Attr; +typedef struct slapi_value Slapi_Value; +typedef struct slapi_valueset Slapi_ValueSet; +typedef struct slapi_filter Slapi_Filter; +typedef struct BackendDB Slapi_Backend; +typedef struct Operation Slapi_Operation; +typedef struct Connection Slapi_Connection; +typedef struct slapi_dn Slapi_DN; +typedef struct slapi_rdn Slapi_RDN; +typedef struct slapi_mod Slapi_Mod; +typedef struct slapi_mods Slapi_Mods; +typedef struct slapi_componentid Slapi_ComponentId; + +#define SLAPI_ATTR_UNIQUEID "entryUUID" +#define SLAPI_ATTR_OBJECTCLASS "objectClass" + +/* pblock routines */ +int slapi_pblock_get( Slapi_PBlock *pb, int arg, void *value ); +int slapi_pblock_set( Slapi_PBlock *pb, int arg, void *value ); +Slapi_PBlock *slapi_pblock_new( void ); +void slapi_pblock_destroy( Slapi_PBlock *pb ); + +/* entry/attr/dn routines */ +Slapi_Entry *slapi_str2entry( char *s, int flags ); +#define SLAPI_STR2ENTRY_REMOVEDUPVALS 1 +#define SLAPI_STR2ENTRY_ADDRDNVALS 2 +#define SLAPI_STR2ENTRY_BIGENTRY 4 +#define SLAPI_STR2ENTRY_TOMBSTONE_CHECK 8 +#define SLAPI_STR2ENTRY_IGNORE_STATE 16 +#define SLAPI_STR2ENTRY_INCLUDE_VERSION_STR 32 +#define SLAPI_STR2ENTRY_EXPAND_OBJECTCLASSES 64 +#define SLAPI_STR2ENTRY_NOT_WELL_FORMED_LDIF 128 +char *slapi_entry2str( Slapi_Entry *e, int *len ); +char *slapi_entry_get_dn( Slapi_Entry *e ); +int slapi_x_entry_get_id( Slapi_Entry *e ); +void slapi_entry_set_dn( Slapi_Entry *e, char *dn ); +Slapi_Entry *slapi_entry_dup( Slapi_Entry *e ); +int slapi_entry_attr_delete( Slapi_Entry *e, char *type ); +Slapi_Entry *slapi_entry_alloc(); +void slapi_entry_free( Slapi_Entry *e ); +int slapi_entry_attr_merge( Slapi_Entry *e, char *type, struct berval **vals ); +int slapi_entry_attr_find( Slapi_Entry *e, char *type, Slapi_Attr **attr ); +char *slapi_entry_attr_get_charptr( const Slapi_Entry *e, const char *type ); +int slapi_entry_attr_get_int( const Slapi_Entry *e, const char *type ); +long slapi_entry_attr_get_long( const Slapi_Entry *e, const char *type ); +unsigned int slapi_entry_attr_get_uint( const Slapi_Entry *e, const char *type ); +unsigned long slapi_entry_attr_get_ulong( const Slapi_Entry *e, const char *type ); +int slapi_attr_get_values( Slapi_Attr *attr, struct berval ***vals ); +char *slapi_dn_normalize( char *dn ); +char *slapi_dn_normalize_case( char *dn ); +int slapi_dn_issuffix( char *dn, char *suffix ); +char *slapi_dn_beparent( Slapi_PBlock *pb, const char *dn ); +int slapi_dn_isbesuffix( Slapi_PBlock *pb, char *dn ); +char *slapi_dn_parent( const char *dn ); +int slapi_dn_isparent( const char *parentdn, const char *childdn ); +char *slapi_dn_ignore_case( char *dn ); +int slapi_rdn2typeval( char *rdn, char **type, struct berval *bv ); +char *slapi_dn_plus_rdn(const char *dn, const char *rdn); + +/* DS 5.x SLAPI */ +int slapi_access_allowed( Slapi_PBlock *pb, Slapi_Entry *e, char *attr, struct berval *val, int access ); +int slapi_acl_check_mods( Slapi_PBlock *pb, Slapi_Entry *e, LDAPMod **mods, char **errbuf ); +Slapi_Attr *slapi_attr_new( void ); +Slapi_Attr *slapi_attr_init( Slapi_Attr *a, const char *type ); +void slapi_attr_free( Slapi_Attr **a ); +Slapi_Attr *slapi_attr_dup( const Slapi_Attr *attr ); +int slapi_attr_add_value( Slapi_Attr *a, const Slapi_Value *v ); +int slapi_attr_type2plugin( const char *type, void **pi ); +int slapi_attr_get_type( const Slapi_Attr *attr, char **type ); +int slapi_attr_get_oid_copy( const Slapi_Attr *attr, char **oidp ); +int slapi_attr_get_flags( const Slapi_Attr *attr, unsigned long *flags ); +int slapi_attr_flag_is_set( const Slapi_Attr *attr, unsigned long flag ); +int slapi_attr_value_cmp( const Slapi_Attr *attr, const struct berval *v1, const struct berval *v2 ); +int slapi_attr_value_find( const Slapi_Attr *a, struct berval *v ); +#define SLAPI_TYPE_CMP_EXACT 0 +#define SLAPI_TYPE_CMP_BASE 1 +#define SLAPI_TYPE_CMP_SUBTYPE 2 +int slapi_attr_type_cmp( const char *t1, const char *t2, int opt ); +int slapi_attr_types_equivalent( const char *t1, const char *t2 ); +int slapi_attr_first_value( Slapi_Attr *a, Slapi_Value **v ); +int slapi_attr_next_value( Slapi_Attr *a, int hint, Slapi_Value **v ); +int slapi_attr_get_numvalues( const Slapi_Attr *a, int *numValues ); +int slapi_attr_get_valueset( const Slapi_Attr *a, Slapi_ValueSet **vs ); +int slapi_attr_get_bervals_copy( Slapi_Attr *a, struct berval ***vals ); +int slapi_entry_attr_hasvalue( Slapi_Entry *e, const char *type, const char *value ); +int slapi_entry_attr_merge_sv( Slapi_Entry *e, const char *type, Slapi_Value **vals ); +void slapi_entry_attr_set_charptr(Slapi_Entry* e, const char *type, const char *value); +void slapi_entry_attr_set_int( Slapi_Entry* e, const char *type, int l); +void slapi_entry_attr_set_uint( Slapi_Entry* e, const char *type, unsigned int l); +void slapi_entry_attr_set_long(Slapi_Entry* e, const char *type, long l); +void slapi_entry_attr_set_ulong(Slapi_Entry* e, const char *type, unsigned long l); +int slapi_entry_has_children(const Slapi_Entry *e); +size_t slapi_entry_size(Slapi_Entry *e); +int slapi_is_rootdse( const char *dn ); +int slapi_entry_attr_merge_sv( Slapi_Entry *e, const char *type, Slapi_Value **vals ); +int slapi_entry_add_values_sv( Slapi_Entry *e, const char *type, Slapi_Value **vals ); +int slapi_entry_add_valueset(Slapi_Entry *e, const char *type, Slapi_ValueSet *vs); +int slapi_entry_delete_values_sv( Slapi_Entry *e, const char *type, Slapi_Value **vals ); +int slapi_entry_merge_values_sv( Slapi_Entry *e, const char *type, Slapi_Value **vals ); +int slapi_entry_attr_replace_sv( Slapi_Entry *e, const char *type, Slapi_Value **vals ); +int slapi_entry_add_value(Slapi_Entry *e, const char *type, const Slapi_Value *value); +int slapi_entry_add_string(Slapi_Entry *e, const char *type, const char *value); +int slapi_entry_delete_string(Slapi_Entry *e, const char *type, const char *value); +int slapi_entry_first_attr( const Slapi_Entry *e, Slapi_Attr **attr ); +int slapi_entry_next_attr( const Slapi_Entry *e, Slapi_Attr *prevattr, Slapi_Attr **attr ); +const char *slapi_entry_get_uniqueid( const Slapi_Entry *e ); +void slapi_entry_set_uniqueid( Slapi_Entry *e, char *uniqueid ); +int slapi_entry_schema_check( Slapi_PBlock *pb, Slapi_Entry *e ); +int slapi_entry_rdn_values_present( const Slapi_Entry *e ); +int slapi_entry_add_rdn_values( Slapi_Entry *e ); +char *slapi_attr_syntax_normalize( const char *s ); + +Slapi_Value *slapi_value_new( void ); +Slapi_Value *slapi_value_new_berval(const struct berval *bval); +Slapi_Value *slapi_value_new_value(const Slapi_Value *v); +Slapi_Value *slapi_value_new_string(const char *s); +Slapi_Value *slapi_value_init(Slapi_Value *v); +Slapi_Value *slapi_value_init_berval(Slapi_Value *v, struct berval *bval); +Slapi_Value *slapi_value_init_string(Slapi_Value *v, const char *s); +Slapi_Value *slapi_value_dup(const Slapi_Value *v); +void slapi_value_free(Slapi_Value **value); +const struct berval *slapi_value_get_berval( const Slapi_Value *value ); +Slapi_Value *slapi_value_set_berval( Slapi_Value *value, const struct berval *bval ); +Slapi_Value *slapi_value_set_value( Slapi_Value *value, const Slapi_Value *vfrom); +Slapi_Value *slapi_value_set( Slapi_Value *value, void *val, unsigned long len); +int slapi_value_set_string(Slapi_Value *value, const char *strVal); +int slapi_value_set_int(Slapi_Value *value, int intVal); +const char*slapi_value_get_string(const Slapi_Value *value); +int slapi_value_get_int(const Slapi_Value *value); +unsigned int slapi_value_get_uint(const Slapi_Value *value); +long slapi_value_get_long(const Slapi_Value *value); +unsigned long slapi_value_get_ulong(const Slapi_Value *value); +size_t slapi_value_get_length(const Slapi_Value *value); +int slapi_value_compare(const Slapi_Attr *a, const Slapi_Value *v1, const Slapi_Value *v2); + +Slapi_ValueSet *slapi_valueset_new( void ); +void slapi_valueset_free(Slapi_ValueSet *vs); +void slapi_valueset_init(Slapi_ValueSet *vs); +void slapi_valueset_done(Slapi_ValueSet *vs); +void slapi_valueset_add_value(Slapi_ValueSet *vs, const Slapi_Value *addval); +int slapi_valueset_first_value( Slapi_ValueSet *vs, Slapi_Value **v ); +int slapi_valueset_next_value( Slapi_ValueSet *vs, int index, Slapi_Value **v); +int slapi_valueset_count( const Slapi_ValueSet *vs); +void slapi_valueset_set_valueset(Slapi_ValueSet *vs1, const Slapi_ValueSet *vs2); + +/* DNs */ +Slapi_DN *slapi_sdn_new( void ); +Slapi_DN *slapi_sdn_new_dn_byval( const char *dn ); +Slapi_DN *slapi_sdn_new_ndn_byval( const char *ndn ); +Slapi_DN *slapi_sdn_new_dn_byref( const char *dn ); +Slapi_DN *slapi_sdn_new_ndn_byref( const char *ndn ); +Slapi_DN *slapi_sdn_new_dn_passin( const char *dn ); +Slapi_DN *slapi_sdn_set_dn_byval( Slapi_DN *sdn, const char *dn ); +Slapi_DN *slapi_sdn_set_dn_byref( Slapi_DN *sdn, const char *dn ); +Slapi_DN *slapi_sdn_set_dn_passin( Slapi_DN *sdn, const char *dn ); +Slapi_DN *slapi_sdn_set_ndn_byval( Slapi_DN *sdn, const char *ndn ); +Slapi_DN *slapi_sdn_set_ndn_byref( Slapi_DN *sdn, const char *ndn ); +void slapi_sdn_done( Slapi_DN *sdn ); +void slapi_sdn_free( Slapi_DN **sdn ); +const char * slapi_sdn_get_dn( const Slapi_DN *sdn ); +const char * slapi_sdn_get_ndn( const Slapi_DN *sdn ); +void slapi_sdn_get_parent( const Slapi_DN *sdn,Slapi_DN *sdn_parent ); +void slapi_sdn_get_backend_parent( const Slapi_DN *sdn, Slapi_DN *sdn_parent, const Slapi_Backend *backend ); +Slapi_DN * slapi_sdn_dup( const Slapi_DN *sdn ); +void slapi_sdn_copy( const Slapi_DN *from, Slapi_DN *to ); +int slapi_sdn_compare( const Slapi_DN *sdn1, const Slapi_DN *sdn2 ); +int slapi_sdn_isempty( const Slapi_DN *sdn ); +int slapi_sdn_issuffix(const Slapi_DN *sdn, const Slapi_DN *suffixsdn ); +int slapi_sdn_isparent( const Slapi_DN *parent, const Slapi_DN *child ); +int slapi_sdn_isgrandparent( const Slapi_DN *parent, const Slapi_DN *child ); +int slapi_sdn_get_ndn_len( const Slapi_DN *sdn ); +int slapi_sdn_scope_test( const Slapi_DN *dn, const Slapi_DN *base, int scope ); +void slapi_sdn_get_rdn( const Slapi_DN *sdn,Slapi_RDN *rdn ); +Slapi_DN *slapi_sdn_set_rdn( Slapi_DN *sdn, const Slapi_RDN *rdn ); +Slapi_DN *slapi_sdn_set_parent( Slapi_DN *sdn, const Slapi_DN *parentdn ); +int slapi_sdn_is_rdn_component( const Slapi_DN *rdn, const Slapi_Attr *a, const Slapi_Value *v ); +char * slapi_moddn_get_newdn( Slapi_DN *dn_olddn, char *newrdn, char *newsuperiordn ); + +/* RDNs */ +Slapi_RDN *slapi_rdn_new( void ); +Slapi_RDN *slapi_rdn_new_dn( const char *dn ); +Slapi_RDN *slapi_rdn_new_sdn( const Slapi_DN *sdn ); +Slapi_RDN *slapi_rdn_new_rdn( const Slapi_RDN *fromrdn ); +void slapi_rdn_init( Slapi_RDN *rdn ); +void slapi_rdn_init_dn( Slapi_RDN *rdn, const char *dn ); +void slapi_rdn_init_sdn( Slapi_RDN *rdn, const Slapi_DN *sdn ); +void slapi_rdn_init_rdn( Slapi_RDN *rdn, const Slapi_RDN *fromrdn ); +void slapi_rdn_set_dn( Slapi_RDN *rdn, const char *dn ); +void slapi_rdn_set_sdn( Slapi_RDN *rdn, const Slapi_DN *sdn ); +void slapi_rdn_set_rdn( Slapi_RDN *rdn, const Slapi_RDN *fromrdn ); +void slapi_rdn_free( Slapi_RDN **rdn ); +void slapi_rdn_done( Slapi_RDN *rdn ); +int slapi_rdn_get_first( Slapi_RDN *rdn, char **type, char **value ); +int slapi_rdn_get_next( Slapi_RDN *rdn, int index, char **type, char **value ); +int slapi_rdn_get_index( Slapi_RDN *rdn, const char *type, const char *value, size_t length ); +int slapi_rdn_get_index_attr( Slapi_RDN *rdn, const char *type, char **value ); +int slapi_rdn_contains( Slapi_RDN *rdn, const char *type, const char *value,size_t length ); +int slapi_rdn_contains_attr( Slapi_RDN *rdn, const char *type, char **value ); +int slapi_rdn_add( Slapi_RDN *rdn, const char *type, const char *value ); +int slapi_rdn_remove_index( Slapi_RDN *rdn, int atindex ); +int slapi_rdn_remove( Slapi_RDN *rdn, const char *type, const char *value, size_t length ); +int slapi_rdn_remove_attr( Slapi_RDN *rdn, const char *type ); +int slapi_rdn_isempty( const Slapi_RDN *rdn ); +int slapi_rdn_get_num_components( Slapi_RDN *rdn ); +int slapi_rdn_compare( Slapi_RDN *rdn1, Slapi_RDN *rdn2 ); +const char *slapi_rdn_get_rdn( const Slapi_RDN *rdn ); +const char *slapi_rdn_get_nrdn( const Slapi_RDN *rdn ); +Slapi_DN *slapi_sdn_add_rdn( Slapi_DN *sdn, const Slapi_RDN *rdn ); + +/* locks and synchronization */ +typedef struct slapi_mutex Slapi_Mutex; +typedef struct slapi_condvar Slapi_CondVar; +Slapi_Mutex *slapi_new_mutex( void ); +void slapi_destroy_mutex( Slapi_Mutex *mutex ); +void slapi_lock_mutex( Slapi_Mutex *mutex ); +int slapi_unlock_mutex( Slapi_Mutex *mutex ); +Slapi_CondVar *slapi_new_condvar( Slapi_Mutex *mutex ); +void slapi_destroy_condvar( Slapi_CondVar *cvar ); +int slapi_wait_condvar( Slapi_CondVar *cvar, struct timeval *timeout ); +int slapi_notify_condvar( Slapi_CondVar *cvar, int notify_all ); + +/* thread-safe LDAP connections */ +LDAP *slapi_ldap_init( char *ldaphost, int ldapport, int secure, int shared ); +void slapi_ldap_unbind( LDAP *ld ); + +char *slapi_ch_malloc( unsigned long size ); +void slapi_ch_free( void **ptr ); +void slapi_ch_free_string( char **ptr ); +char *slapi_ch_calloc( unsigned long nelem, unsigned long size ); +char *slapi_ch_realloc( char *block, unsigned long size ); +char *slapi_ch_strdup( const char *s ); +void slapi_ch_array_free( char **arrayp ); +struct berval *slapi_ch_bvdup(const struct berval *v); +struct berval **slapi_ch_bvecdup(const struct berval **v); + +/* LDAP V3 routines */ +int slapi_control_present( LDAPControl **controls, char *oid, + struct berval **val, int *iscritical); +void slapi_register_supported_control(char *controloid, + unsigned long controlops); +#define SLAPI_OPERATION_BIND 0x00000001L +#define SLAPI_OPERATION_UNBIND 0x00000002L +#define SLAPI_OPERATION_SEARCH 0x00000004L +#define SLAPI_OPERATION_MODIFY 0x00000008L +#define SLAPI_OPERATION_ADD 0x00000010L +#define SLAPI_OPERATION_DELETE 0x00000020L +#define SLAPI_OPERATION_MODDN 0x00000040L +#define SLAPI_OPERATION_MODRDN SLAPI_OPERATION_MODDN +#define SLAPI_OPERATION_COMPARE 0x00000080L +#define SLAPI_OPERATION_ABANDON 0x00000100L +#define SLAPI_OPERATION_EXTENDED 0x00000200L +#define SLAPI_OPERATION_ANY 0xFFFFFFFFL +#define SLAPI_OPERATION_NONE 0x00000000L +int slapi_get_supported_controls(char ***ctrloidsp, unsigned long **ctrlopsp); +LDAPControl *slapi_dup_control(LDAPControl *ctrl); +void slapi_register_supported_saslmechanism(char *mechanism); +char **slapi_get_supported_saslmechanisms(); +char **slapi_get_supported_extended_ops(void); + +/* operation */ +int slapi_op_abandoned( Slapi_PBlock *pb ); +unsigned long slapi_op_get_type(Slapi_Operation * op); +void slapi_operation_set_flag(Slapi_Operation *op, unsigned long flag); +void slapi_operation_clear_flag(Slapi_Operation *op, unsigned long flag); +int slapi_operation_is_flag_set(Slapi_Operation *op, unsigned long flag); +char *slapi_op_type_to_string(unsigned long type); + +/* send ldap result back */ +void slapi_send_ldap_result( Slapi_PBlock *pb, int err, char *matched, + char *text, int nentries, struct berval **urls ); +int slapi_send_ldap_search_entry( Slapi_PBlock *pb, Slapi_Entry *e, + LDAPControl **ectrls, char **attrs, int attrsonly ); +int slapi_send_ldap_search_reference( Slapi_PBlock *pb, Slapi_Entry *e, + struct berval **urls, LDAPControl **ectrls, struct berval **v2refs ); + +/* filter routines */ +Slapi_Filter *slapi_str2filter( char *str ); +Slapi_Filter *slapi_filter_dup( Slapi_Filter *f ); +void slapi_filter_free( Slapi_Filter *f, int recurse ); +int slapi_filter_get_choice( Slapi_Filter *f); +int slapi_filter_get_ava( Slapi_Filter *f, char **type, struct berval **bval ); +Slapi_Filter *slapi_filter_list_first( Slapi_Filter *f ); +Slapi_Filter *slapi_filter_list_next( Slapi_Filter *f, Slapi_Filter *fprev ); +int slapi_filter_get_attribute_type( Slapi_Filter *f, char **type ); +int slapi_x_filter_set_attribute_type( Slapi_Filter *f, const char *type ); +int slapi_filter_get_subfilt( Slapi_Filter *f, char **type, char **initial, + char ***any, char **final ); +Slapi_Filter *slapi_filter_join( int ftype, Slapi_Filter *f1, Slapi_Filter *f2); +int slapi_x_filter_append( int choice, Slapi_Filter **pContainingFilter, + Slapi_Filter **pNextFilter, Slapi_Filter *filterToAppend ); +int slapi_filter_test( Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Filter *f, + int verify_access ); +int slapi_filter_test_simple( Slapi_Entry *e, Slapi_Filter *f ); +typedef int (*FILTER_APPLY_FN)( Slapi_Filter *f, void *arg ); +int slapi_filter_apply( Slapi_Filter *f, FILTER_APPLY_FN fn, void *arg, int *error_code ); +#define SLAPI_FILTER_SCAN_STOP -1 /* set by callback */ +#define SLAPI_FILTER_SCAN_ERROR -2 /* set by callback */ +#define SLAPI_FILTER_SCAN_NOMORE 0 /* set by callback */ +#define SLAPI_FILTER_SCAN_CONTINUE 1 /* set by callback */ +#define SLAPI_FILTER_UNKNOWN_FILTER_TYPE 2 /* set by slapi_filter_apply() */ + +/* internal add/delete/search/modify routines */ +Slapi_PBlock *slapi_search_internal( char *base, int scope, char *filter, + LDAPControl **controls, char **attrs, int attrsonly ); +Slapi_PBlock *slapi_modify_internal( char *dn, LDAPMod **mods, + LDAPControl **controls, int log_change ); +Slapi_PBlock *slapi_add_internal( char * dn, LDAPMod **attrs, + LDAPControl **controls, int log_changes ); +Slapi_PBlock *slapi_add_entry_internal( Slapi_Entry * e, + LDAPControl **controls, int log_change ); +Slapi_PBlock *slapi_delete_internal( char * dn, LDAPControl **controls, + int log_change ); +Slapi_PBlock *slapi_modrdn_internal( char * olddn, char * newrdn, + int deloldrdn, LDAPControl **controls, + int log_change ); +Slapi_PBlock *slapi_rename_internal( const char * olddn, const char *newrdn, + const char *newsuperior, int delolrdn, + LDAPControl **controls, int log_change ); +void slapi_free_search_results_internal(Slapi_PBlock *pb); + +/* new internal add/delete/search/modify routines */ +typedef void (*plugin_result_callback)( int rc, void *callback_data ); +typedef int (*plugin_referral_entry_callback)( char * referral, + void *callback_data ); +typedef int (*plugin_search_entry_callback)( Slapi_Entry *e, + void *callback_data ); +void slapi_free_search_results_internal( Slapi_PBlock *pb ); + +#define SLAPI_OP_FLAG_NEVER_CHAIN 0x0800 + +int slapi_search_internal_pb( Slapi_PBlock *pb ); +int slapi_search_internal_callback_pb( Slapi_PBlock *pb, void *callback_data, + plugin_result_callback prc, plugin_search_entry_callback psec, + plugin_referral_entry_callback prec ); +int slapi_add_internal_pb( Slapi_PBlock *pb ); +int slapi_modify_internal_pb( Slapi_PBlock *pb ); +int slapi_modrdn_internal_pb( Slapi_PBlock *pb ); +int slapi_delete_internal_pb( Slapi_PBlock *pb ); + +int slapi_seq_internal_callback_pb(Slapi_PBlock *pb, void *callback_data, + plugin_result_callback res_callback, + plugin_search_entry_callback srch_callback, + plugin_referral_entry_callback ref_callback); + +void slapi_search_internal_set_pb( Slapi_PBlock *pb, const char *base, + int scope, const char *filter, char **attrs, int attrsonly, + LDAPControl **controls, const char *uniqueid, + Slapi_ComponentId *plugin_identity, int operation_flags ); +void slapi_add_entry_internal_set_pb( Slapi_PBlock *pb, Slapi_Entry *e, + LDAPControl **controls, Slapi_ComponentId *plugin_identity, + int operation_flags ); +int slapi_add_internal_set_pb( Slapi_PBlock *pb, const char *dn, + LDAPMod **attrs, LDAPControl **controls, + Slapi_ComponentId *plugin_identity, int operation_flags ); +void slapi_modify_internal_set_pb( Slapi_PBlock *pb, const char *dn, + LDAPMod **mods, LDAPControl **controls, const char *uniqueid, + Slapi_ComponentId *plugin_identity, int operation_flags ); +void slapi_rename_internal_set_pb( Slapi_PBlock *pb, const char *olddn, + const char *newrdn, const char *newsuperior, int deloldrdn, + LDAPControl **controls, const char *uniqueid, + Slapi_ComponentId *plugin_identity, int operation_flags ); +void slapi_delete_internal_set_pb( Slapi_PBlock *pb, const char *dn, + LDAPControl **controls, const char *uniqueid, + Slapi_ComponentId *plugin_identity, int operation_flags ); +void slapi_seq_internal_set_pb( Slapi_PBlock *pb, char *ibase, int type, + char *attrname, char *val, char **attrs, int attrsonly, + LDAPControl **controls, Slapi_ComponentId *plugin_identity, + int operation_flags ); + +/* connection related routines */ +int slapi_is_connection_ssl(Slapi_PBlock *pPB, int *isSSL); +int slapi_get_client_port(Slapi_PBlock *pPB, int *fromPort); +int slapi_get_client_ip(Slapi_PBlock *pb, char **clientIP); +void slapi_free_client_ip(char **clientIP); + +/* computed attributes */ +typedef struct _computed_attr_context computed_attr_context; +typedef int (*slapi_compute_output_t)(computed_attr_context *c, Slapi_Attr *a, Slapi_Entry *e); +typedef int (*slapi_compute_callback_t)(computed_attr_context *c, char *type, Slapi_Entry *e, slapi_compute_output_t outputfn); +typedef int (*slapi_search_rewrite_callback_t)(Slapi_PBlock *pb); +int slapi_compute_add_evaluator(slapi_compute_callback_t function); +int slapi_compute_add_search_rewriter(slapi_search_rewrite_callback_t function); +int compute_rewrite_search_filter(Slapi_PBlock *pb); +int compute_evaluator(computed_attr_context *c, char *type, Slapi_Entry *e, slapi_compute_output_t outputfn); +int slapi_x_compute_get_pblock(computed_attr_context *c, Slapi_PBlock **pb); + +/* backend routines */ +void slapi_be_set_readonly( Slapi_Backend *be, int readonly ); +int slapi_be_get_readonly( Slapi_Backend *be ); +const char *slapi_x_be_get_updatedn( Slapi_Backend *be ); +Slapi_Backend *slapi_be_select( const Slapi_DN *sdn ); + +/* ACL plugins; only SLAPI_PLUGIN_ACL_ALLOW_ACCESS supported now */ +typedef int (*slapi_acl_callback_t)(Slapi_PBlock *pb, + Slapi_Entry *e, + const char *attr, + struct berval *berval, + int access, + void *state); + +/* object extensions */ +typedef void *(*slapi_extension_constructor_fnptr)(void *object, void *parent); + +typedef void (*slapi_extension_destructor_fnptr)(void *extension, + void *object, void *parent); + +int slapi_register_object_extension( const char *pluginname, + const char *objectname, slapi_extension_constructor_fnptr constructor, + slapi_extension_destructor_fnptr destructor, int *objecttype, + int *extensionhandle); + +#define SLAPI_EXT_CONNECTION "Connection" +#define SLAPI_EXT_OPERATION "Operation" +#define SLAPI_EXT_ENTRY "Entry" +#define SLAPI_EXT_MTNODE "Mapping Tree Node" + +void *slapi_get_object_extension(int objecttype, void *object, + int extensionhandle); +void slapi_set_object_extension(int objecttype, void *object, + int extensionhandle, void *extension); + +int slapi_x_backend_get_flags( const Slapi_Backend *be, unsigned long *flags ); + +/* parameters currently supported */ + +/* + * Attribute flags returned by slapi_attr_get_flags() + */ +#define SLAPI_ATTR_FLAG_SINGLE 0x0001 +#define SLAPI_ATTR_FLAG_OPATTR 0x0002 +#define SLAPI_ATTR_FLAG_READONLY 0x0004 +#define SLAPI_ATTR_FLAG_STD_ATTR SLAPI_ATTR_FLAG_READONLY +#define SLAPI_ATTR_FLAG_OBSOLETE 0x0040 +#define SLAPI_ATTR_FLAG_COLLECTIVE 0x0080 +#define SLAPI_ATTR_FLAG_NOUSERMOD 0x0100 + +/* + * Backend flags returned by slapi_x_backend_get_flags() + */ +#define SLAPI_BACKEND_FLAG_NOLASTMOD 0x0001U +#define SLAPI_BACKEND_FLAG_NO_SCHEMA_CHECK 0x0002U +#define SLAPI_BACKEND_FLAG_GLUE_INSTANCE 0x0010U /* a glue backend */ +#define SLAPI_BACKEND_FLAG_GLUE_SUBORDINATE 0x0020U /* child of a glue hierarchy */ +#define SLAPI_BACKEND_FLAG_GLUE_LINKED 0x0040U /* child is connected to parent */ +#define SLAPI_BACKEND_FLAG_OVERLAY 0x0080U /* this db struct is an overlay */ +#define SLAPI_BACKEND_FLAG_GLOBAL_OVERLAY 0x0100U /* this db struct is a global overlay */ +#define SLAPI_BACKEND_FLAG_SHADOW 0x8000U /* a shadow */ +#define SLAPI_BACKEND_FLAG_SYNC_SHADOW 0x1000U /* a sync shadow */ +#define SLAPI_BACKEND_FLAG_SLURP_SHADOW 0x2000U /* a slurp shadow */ + +/* + * ACL levels + */ +#define SLAPI_ACL_COMPARE 0x01 +#define SLAPI_ACL_SEARCH 0x02 +#define SLAPI_ACL_READ 0x04 +#define SLAPI_ACL_WRITE 0x08 +#define SLAPI_ACL_DELETE 0x10 +#define SLAPI_ACL_ADD 0x20 +#define SLAPI_ACL_SELF 0x40 +#define SLAPI_ACL_PROXY 0x80 +#define SLAPI_ACL_ALL 0x7f + +/* plugin types supported */ + +#define SLAPI_PLUGIN_DATABASE 1 +#define SLAPI_PLUGIN_EXTENDEDOP 2 +#define SLAPI_PLUGIN_PREOPERATION 3 +#define SLAPI_PLUGIN_POSTOPERATION 4 +#define SLAPI_PLUGIN_MATCHINGRULE 5 +#define SLAPI_PLUGIN_SYNTAX 6 +#define SLAPI_PLUGIN_AUDIT 7 + +/* misc params */ + +#define SLAPI_BACKEND 130 +#define SLAPI_CONNECTION 131 +#define SLAPI_OPERATION 132 +#define SLAPI_REQUESTOR_ISROOT 133 +#define SLAPI_BE_MONITORDN 134 +#define SLAPI_BE_TYPE 135 +#define SLAPI_BE_READONLY 136 +#define SLAPI_BE_LASTMOD 137 +#define SLAPI_CONN_ID 139 + +/* operation params */ +#define SLAPI_OPINITIATED_TIME 140 +#define SLAPI_REQUESTOR_DN 141 +#define SLAPI_IS_REPLICATED_OPERATION 142 +#define SLAPI_REQUESTOR_ISUPDATEDN SLAPI_IS_REPLICATED_OPERATION + +/* connection structure params*/ +#define SLAPI_CONN_DN 143 +#define SLAPI_CONN_AUTHTYPE 144 +#define SLAPI_CONN_CLIENTIP 145 +#define SLAPI_CONN_SERVERIP 146 +/* OpenLDAP extensions */ +#define SLAPI_X_CONN_CLIENTPATH 1300 +#define SLAPI_X_CONN_SERVERPATH 1301 +#define SLAPI_X_CONN_IS_UDP 1302 +#define SLAPI_X_CONN_SSF 1303 +#define SLAPI_X_CONN_SASL_CONTEXT 1304 +#define SLAPI_X_OPERATION_DELETE_GLUE_PARENT 1305 +#define SLAPI_X_RELAX 1306 +#define SLAPI_X_MANAGEDIT SLAPI_X_RELAX +#define SLAPI_X_OPERATION_NO_SCHEMA_CHECK 1307 +#define SLAPI_X_ADD_STRUCTURAL_CLASS 1308 +#define SLAPI_X_OPERATION_NO_SUBORDINATE_GLUE 1309 + +/* Authentication types */ +#define SLAPD_AUTH_NONE "none" +#define SLAPD_AUTH_SIMPLE "simple" +#define SLAPD_AUTH_SSL "SSL" +#define SLAPD_AUTH_SASL "SASL " + +/* plugin configuration parmams */ +#define SLAPI_PLUGIN 3 +#define SLAPI_PLUGIN_PRIVATE 4 +#define SLAPI_PLUGIN_TYPE 5 +#define SLAPI_PLUGIN_ARGV 6 +#define SLAPI_PLUGIN_ARGC 7 +#define SLAPI_PLUGIN_VERSION 8 +#define SLAPI_PLUGIN_OPRETURN 9 +#define SLAPI_PLUGIN_OBJECT 10 +#define SLAPI_PLUGIN_DESTROY_FN 11 +#define SLAPI_PLUGIN_DESCRIPTION 12 +#define SLAPI_PLUGIN_IDENTITY 13 + +/* internal opreations params */ +#define SLAPI_PLUGIN_INTOP_RESULT 15 +#define SLAPI_PLUGIN_INTOP_SEARCH_ENTRIES 16 +#define SLAPI_PLUGIN_INTOP_SEARCH_REFERRALS 17 + +/* transaction arguments */ +#define SLAPI_PARENT_TXN 190 +#define SLAPI_TXN 191 + +/* function pointer params for backends */ +#define SLAPI_PLUGIN_DB_BIND_FN 200 +#define SLAPI_PLUGIN_DB_UNBIND_FN 201 +#define SLAPI_PLUGIN_DB_SEARCH_FN 202 +#define SLAPI_PLUGIN_DB_COMPARE_FN 203 +#define SLAPI_PLUGIN_DB_MODIFY_FN 204 +#define SLAPI_PLUGIN_DB_MODRDN_FN 205 +#define SLAPI_PLUGIN_DB_ADD_FN 206 +#define SLAPI_PLUGIN_DB_DELETE_FN 207 +#define SLAPI_PLUGIN_DB_ABANDON_FN 208 +#define SLAPI_PLUGIN_DB_CONFIG_FN 209 +#define SLAPI_PLUGIN_CLOSE_FN 210 +#define SLAPI_PLUGIN_DB_FLUSH_FN 211 +#define SLAPI_PLUGIN_START_FN 212 +#define SLAPI_PLUGIN_DB_SEQ_FN 213 +#define SLAPI_PLUGIN_DB_ENTRY_FN 214 +#define SLAPI_PLUGIN_DB_REFERRAL_FN 215 +#define SLAPI_PLUGIN_DB_RESULT_FN 216 +#define SLAPI_PLUGIN_DB_LDIF2DB_FN 217 +#define SLAPI_PLUGIN_DB_DB2LDIF_FN 218 +#define SLAPI_PLUGIN_DB_BEGIN_FN 219 +#define SLAPI_PLUGIN_DB_COMMIT_FN 220 +#define SLAPI_PLUGIN_DB_ABORT_FN 221 +#define SLAPI_PLUGIN_DB_ARCHIVE2DB_FN 222 +#define SLAPI_PLUGIN_DB_DB2ARCHIVE_FN 223 +#define SLAPI_PLUGIN_DB_NEXT_SEARCH_ENTRY_FN 224 +#define SLAPI_PLUGIN_DB_FREE_RESULT_SET_FN 225 +#define SLAPI_PLUGIN_DB_SIZE_FN 226 +#define SLAPI_PLUGIN_DB_TEST_FN 227 + + +/* functions pointers for LDAP V3 extended ops */ +#define SLAPI_PLUGIN_EXT_OP_FN 300 +#define SLAPI_PLUGIN_EXT_OP_OIDLIST 301 + +/* preoperation */ +#define SLAPI_PLUGIN_PRE_BIND_FN 401 +#define SLAPI_PLUGIN_PRE_UNBIND_FN 402 +#define SLAPI_PLUGIN_PRE_SEARCH_FN 403 +#define SLAPI_PLUGIN_PRE_COMPARE_FN 404 +#define SLAPI_PLUGIN_PRE_MODIFY_FN 405 +#define SLAPI_PLUGIN_PRE_MODRDN_FN 406 +#define SLAPI_PLUGIN_PRE_ADD_FN 407 +#define SLAPI_PLUGIN_PRE_DELETE_FN 408 +#define SLAPI_PLUGIN_PRE_ABANDON_FN 409 +#define SLAPI_PLUGIN_PRE_ENTRY_FN 410 +#define SLAPI_PLUGIN_PRE_REFERRAL_FN 411 +#define SLAPI_PLUGIN_PRE_RESULT_FN 412 + +/* internal preoperation */ +#define SLAPI_PLUGIN_INTERNAL_PRE_ADD_FN 420 +#define SLAPI_PLUGIN_INTERNAL_PRE_MODIFY_FN 421 +#define SLAPI_PLUGIN_INTERNAL_PRE_MODRDN_FN 422 +#define SLAPI_PLUGIN_INTERNAL_PRE_DELETE_FN 423 + +/* backend preoperation */ +#define SLAPI_PLUGIN_BE_PRE_ADD_FN 450 +#define SLAPI_PLUGIN_BE_PRE_MODIFY_FN 451 +#define SLAPI_PLUGIN_BE_PRE_MODRDN_FN 452 +#define SLAPI_PLUGIN_BE_PRE_DELETE_FN 453 + +/* postoperation */ +#define SLAPI_PLUGIN_POST_BIND_FN 501 +#define SLAPI_PLUGIN_POST_UNBIND_FN 502 +#define SLAPI_PLUGIN_POST_SEARCH_FN 503 +#define SLAPI_PLUGIN_POST_COMPARE_FN 504 +#define SLAPI_PLUGIN_POST_MODIFY_FN 505 +#define SLAPI_PLUGIN_POST_MODRDN_FN 506 +#define SLAPI_PLUGIN_POST_ADD_FN 507 +#define SLAPI_PLUGIN_POST_DELETE_FN 508 +#define SLAPI_PLUGIN_POST_ABANDON_FN 509 +#define SLAPI_PLUGIN_POST_ENTRY_FN 510 +#define SLAPI_PLUGIN_POST_REFERRAL_FN 511 +#define SLAPI_PLUGIN_POST_RESULT_FN 512 + +/* internal postoperation */ +#define SLAPI_PLUGIN_INTERNAL_POST_ADD_FN 520 +#define SLAPI_PLUGIN_INTERNAL_POST_MODIFY_FN 521 +#define SLAPI_PLUGIN_INTERNAL_POST_MODRDN_FN 522 +#define SLAPI_PLUGIN_INTERNAL_POST_DELETE_FN 523 + +/* backend postoperation */ +#define SLAPI_PLUGIN_BE_POST_ADD_FN 550 +#define SLAPI_PLUGIN_BE_POST_MODIFY_FN 551 +#define SLAPI_PLUGIN_BE_POST_MODRDN_FN 552 +#define SLAPI_PLUGIN_BE_POST_DELETE_FN 553 + +#define SLAPI_OPERATION_TYPE 590 +#define SLAPI_OPERATION_MSGID 591 + +#define SLAPI_PLUGIN_MR_FILTER_CREATE_FN 600 +#define SLAPI_PLUGIN_MR_INDEXER_CREATE_FN 601 +#define SLAPI_PLUGIN_MR_FILTER_MATCH_FN 602 +#define SLAPI_PLUGIN_MR_FILTER_INDEX_FN 603 +#define SLAPI_PLUGIN_MR_FILTER_RESET_FN 604 +#define SLAPI_PLUGIN_MR_INDEX_FN 605 +#define SLAPI_PLUGIN_MR_OID 610 +#define SLAPI_PLUGIN_MR_TYPE 611 +#define SLAPI_PLUGIN_MR_VALUE 612 +#define SLAPI_PLUGIN_MR_VALUES 613 +#define SLAPI_PLUGIN_MR_KEYS 614 +#define SLAPI_PLUGIN_MR_FILTER_REUSABLE 615 +#define SLAPI_PLUGIN_MR_QUERY_OPERATOR 616 +#define SLAPI_PLUGIN_MR_USAGE 617 + +#define SLAPI_MATCHINGRULE_NAME 1 +#define SLAPI_MATCHINGRULE_OID 2 +#define SLAPI_MATCHINGRULE_DESC 3 +#define SLAPI_MATCHINGRULE_SYNTAX 4 +#define SLAPI_MATCHINGRULE_OBSOLETE 5 + +#define SLAPI_OP_LESS 1 +#define SLAPI_OP_LESS_OR_EQUAL 2 +#define SLAPI_OP_EQUAL 3 +#define SLAPI_OP_GREATER_OR_EQUAL 4 +#define SLAPI_OP_GREATER 5 +#define SLAPI_OP_SUBSTRING 6 + +#define SLAPI_PLUGIN_MR_USAGE_INDEX 0 +#define SLAPI_PLUGIN_MR_USAGE_SORT 1 + +#define SLAPI_PLUGIN_SYNTAX_FILTER_AVA 700 +#define SLAPI_PLUGIN_SYNTAX_FILTER_SUB 701 +#define SLAPI_PLUGIN_SYNTAX_VALUES2KEYS 702 +#define SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_AVA 703 +#define SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_SUB 704 +#define SLAPI_PLUGIN_SYNTAX_NAMES 705 +#define SLAPI_PLUGIN_SYNTAX_OID 706 +#define SLAPI_PLUGIN_SYNTAX_FLAGS 707 +#define SLAPI_PLUGIN_SYNTAX_COMPARE 708 + +#define SLAPI_PLUGIN_SYNTAX_FLAG_ORKEYS 1 +#define SLAPI_PLUGIN_SYNTAX_FLAG_ORDERING 2 + +#define SLAPI_PLUGIN_ACL_INIT 730 +#define SLAPI_PLUGIN_ACL_SYNTAX_CHECK 731 +#define SLAPI_PLUGIN_ACL_ALLOW_ACCESS 732 +#define SLAPI_PLUGIN_ACL_MODS_ALLOWED 733 +#define SLAPI_PLUGIN_ACL_MODS_UPDATE 734 + +#define SLAPI_OPERATION_AUTHTYPE 741 +#define SLAPI_OPERATION_ID 742 +#define SLAPI_CONN_CERT 743 +#define SLAPI_CONN_AUTHMETHOD 746 +#define SLAPI_IS_INTERNAL_OPERATION 748 + +#define SLAPI_RESULT_CODE 881 +#define SLAPI_RESULT_TEXT 882 +#define SLAPI_RESULT_MATCHED 883 + +/* managedsait control */ +#define SLAPI_MANAGEDSAIT 1000 + +/* audit plugin defines */ +#define SLAPI_PLUGIN_AUDIT_DATA 1100 +#define SLAPI_PLUGIN_AUDIT_FN 1101 + +/* backend_group extension */ +#define SLAPI_X_PLUGIN_PRE_GROUP_FN 1202 +#define SLAPI_X_PLUGIN_POST_GROUP_FN 1203 + +#define SLAPI_X_GROUP_ENTRY 1250 /* group entry */ +#define SLAPI_X_GROUP_ATTRIBUTE 1251 /* member attribute */ +#define SLAPI_X_GROUP_OPERATION_DN 1252 /* asserted value */ +#define SLAPI_X_GROUP_TARGET_ENTRY 1253 /* target entry */ + +/* internal preoperation extensions */ +#define SLAPI_PLUGIN_INTERNAL_PRE_BIND_FN 1260 +#define SLAPI_PLUGIN_INTERNAL_PRE_UNBIND_FN 1261 +#define SLAPI_PLUGIN_INTERNAL_PRE_SEARCH_FN 1262 +#define SLAPI_PLUGIN_INTERNAL_PRE_COMPARE_FN 1263 +#define SLAPI_PLUGIN_INTERNAL_PRE_ABANDON_FN 1264 + +/* internal postoperation extensions */ +#define SLAPI_PLUGIN_INTERNAL_POST_BIND_FN 1270 +#define SLAPI_PLUGIN_INTERNAL_POST_UNBIND_FN 1271 +#define SLAPI_PLUGIN_INTERNAL_POST_SEARCH_FN 1272 +#define SLAPI_PLUGIN_INTERNAL_POST_COMPARE_FN 1273 +#define SLAPI_PLUGIN_INTERNAL_POST_ABANDON_FN 1274 + +/* config stuff */ +#define SLAPI_CONFIG_FILENAME 40 +#define SLAPI_CONFIG_LINENO 41 +#define SLAPI_CONFIG_ARGC 42 +#define SLAPI_CONFIG_ARGV 43 + +/* operational params */ +#define SLAPI_TARGET_ADDRESS 48 +#define SLAPI_TARGET_UNIQUEID 49 +#define SLAPI_TARGET_DN 50 + +/* server LDAPv3 controls */ +#define SLAPI_REQCONTROLS 51 +#define SLAPI_RESCONTROLS 55 +#define SLAPI_ADD_RESCONTROL 56 +#define SLAPI_CONTROLS_ARG 58 + +/* add params */ +#define SLAPI_ADD_TARGET SLAPI_TARGET_DN +#define SLAPI_ADD_ENTRY 60 +#define SLAPI_ADD_EXISTING_DN_ENTRY 61 +#define SLAPI_ADD_PARENT_ENTRY 62 +#define SLAPI_ADD_PARENT_UNIQUEID 63 +#define SLAPI_ADD_EXISTING_UNIQUEID_ENTRY 64 + +/* bind params */ +#define SLAPI_BIND_TARGET SLAPI_TARGET_DN +#define SLAPI_BIND_METHOD 70 +#define SLAPI_BIND_CREDENTIALS 71 +#define SLAPI_BIND_SASLMECHANISM 72 +#define SLAPI_BIND_RET_SASLCREDS 73 + +/* compare params */ +#define SLAPI_COMPARE_TARGET SLAPI_TARGET_DN +#define SLAPI_COMPARE_TYPE 80 +#define SLAPI_COMPARE_VALUE 81 + +/* delete params */ +#define SLAPI_DELETE_TARGET SLAPI_TARGET_DN +#define SLAPI_DELETE_EXISTING_ENTRY SLAPI_ADD_EXISTING_DN_ENTRY + +/* modify params */ +#define SLAPI_MODIFY_TARGET SLAPI_TARGET_DN +#define SLAPI_MODIFY_MODS 90 +#define SLAPI_MODIFY_EXISTING_ENTRY SLAPI_ADD_EXISTING_DN_ENTRY + +/* modrdn params */ +#define SLAPI_MODRDN_TARGET SLAPI_TARGET_DN +#define SLAPI_MODRDN_NEWRDN 100 +#define SLAPI_MODRDN_DELOLDRDN 101 +#define SLAPI_MODRDN_NEWSUPERIOR 102 /* v3 only */ +#define SLAPI_MODRDN_EXISTING_ENTRY SLAPI_ADD_EXISTING_DN_ENTRY +#define SLAPI_MODRDN_PARENT_ENTRY 104 +#define SLAPI_MODRDN_NEWPARENT_ENTRY 105 +#define SLAPI_MODRDN_TARGET_ENTRY 106 +#define SLAPI_MODRDN_NEWSUPERIOR_ADDRESS 107 + +/* search params */ +#define SLAPI_SEARCH_TARGET SLAPI_TARGET_DN +#define SLAPI_SEARCH_SCOPE 110 +#define SLAPI_SEARCH_DEREF 111 +#define SLAPI_SEARCH_SIZELIMIT 112 +#define SLAPI_SEARCH_TIMELIMIT 113 +#define SLAPI_SEARCH_FILTER 114 +#define SLAPI_SEARCH_STRFILTER 115 +#define SLAPI_SEARCH_ATTRS 116 +#define SLAPI_SEARCH_ATTRSONLY 117 + +/* abandon params */ +#define SLAPI_ABANDON_MSGID 120 + +/* extended operation params */ +#define SLAPI_EXT_OP_REQ_OID 160 +#define SLAPI_EXT_OP_REQ_VALUE 161 + +/* extended operation return codes */ +#define SLAPI_EXT_OP_RET_OID 162 +#define SLAPI_EXT_OP_RET_VALUE 163 + +#define SLAPI_PLUGIN_EXTENDED_SENT_RESULT -1 + +#define SLAPI_FAIL_DISKFULL -2 +#define SLAPI_FAIL_GENERAL -1 +#define SLAPI_PLUGIN_EXTENDED_NOT_HANDLED -2 +#define SLAPI_BIND_SUCCESS 0 +#define SLAPI_BIND_FAIL 2 +#define SLAPI_BIND_ANONYMOUS 3 + +/* Search result params */ +#define SLAPI_SEARCH_RESULT_SET 193 +#define SLAPI_SEARCH_RESULT_ENTRY 194 +#define SLAPI_NENTRIES 195 +#define SLAPI_SEARCH_REFERRALS 196 + +/* filter types */ +#ifndef LDAP_FILTER_AND +#define LDAP_FILTER_AND 0xa0L +#endif +#ifndef LDAP_FILTER_OR +#define LDAP_FILTER_OR 0xa1L +#endif +#ifndef LDAP_FILTER_NOT +#define LDAP_FILTER_NOT 0xa2L +#endif +#ifndef LDAP_FILTER_EQUALITY +#define LDAP_FILTER_EQUALITY 0xa3L +#endif +#ifndef LDAP_FILTER_SUBSTRINGS +#define LDAP_FILTER_SUBSTRINGS 0xa4L +#endif +#ifndef LDAP_FILTER_GE +#define LDAP_FILTER_GE 0xa5L +#endif +#ifndef LDAP_FILTER_LE +#define LDAP_FILTER_LE 0xa6L +#endif +#ifndef LDAP_FILTER_PRESENT +#define LDAP_FILTER_PRESENT 0x87L +#endif +#ifndef LDAP_FILTER_APPROX +#define LDAP_FILTER_APPROX 0xa8L +#endif +#ifndef LDAP_FILTER_EXT_MATCH +#define LDAP_FILTER_EXT_MATCH 0xa9L +#endif + +int slapi_log_error( int severity, char *subsystem, char *fmt, ... ); +#define SLAPI_LOG_FATAL 0 +#define SLAPI_LOG_TRACE 1 +#define SLAPI_LOG_PACKETS 2 +#define SLAPI_LOG_ARGS 3 +#define SLAPI_LOG_CONNS 4 +#define SLAPI_LOG_BER 5 +#define SLAPI_LOG_FILTER 6 +#define SLAPI_LOG_CONFIG 7 +#define SLAPI_LOG_ACL 8 +#define SLAPI_LOG_SHELL 9 +#define SLAPI_LOG_PARSE 10 +#define SLAPI_LOG_HOUSE 11 +#define SLAPI_LOG_REPL 12 +#define SLAPI_LOG_CACHE 13 +#define SLAPI_LOG_PLUGIN 14 +#define SLAPI_LOG_TIMING 15 + +#define SLAPI_PLUGIN_DESCRIPTION 12 +typedef struct slapi_plugindesc { + char *spd_id; + char *spd_vendor; + char *spd_version; + char *spd_description; +} Slapi_PluginDesc; + +#define SLAPI_PLUGIN_VERSION_01 "01" +#define SLAPI_PLUGIN_VERSION_02 "02" +#define SLAPI_PLUGIN_VERSION_03 "03" +#define SLAPI_PLUGIN_CURRENT_VERSION SLAPI_PLUGIN_VERSION_03 + +#endif /* _SLAPI_PLUGIN_H */ + diff --git a/deps/include/stamp-h1 b/deps/include/stamp-h1 new file mode 100644 index 0000000..defa4e5 --- /dev/null +++ b/deps/include/stamp-h1 @@ -0,0 +1 @@ +timestamp for include/portable.h diff --git a/deps/include/stamp-h2 b/deps/include/stamp-h2 new file mode 100644 index 0000000..f00f18c --- /dev/null +++ b/deps/include/stamp-h2 @@ -0,0 +1 @@ +timestamp for include/ldap_features.h diff --git a/deps/include/stamp-h3 b/deps/include/stamp-h3 new file mode 100644 index 0000000..6f22db2 --- /dev/null +++ b/deps/include/stamp-h3 @@ -0,0 +1 @@ +timestamp for include/lber_types.h diff --git a/deps/include/sysexits-compat.h b/deps/include/sysexits-compat.h new file mode 100644 index 0000000..1272dcd --- /dev/null +++ b/deps/include/sysexits-compat.h @@ -0,0 +1,115 @@ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2020 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ +/* Portions Copyright (c) 1987 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * @(#)sysexits.h 4.5 (Berkeley) 7/6/88 + */ + +/* +** SYSEXITS.H -- Exit status codes for system programs. +** +** This include file attempts to categorize possible error +** exit statuses for system programs, notably delivermail +** and the Berkeley network. +** +** Error numbers begin at EX__BASE to reduce the possibility of +** clashing with other exit statuses that random programs may +** already return. The meaning of the codes is approximately +** as follows: +** +** EX_USAGE -- The command was used incorrectly, e.g., with +** the wrong number of arguments, a bad flag, a bad +** syntax in a parameter, or whatever. +** EX_DATAERR -- The input data was incorrect in some way. +** This should only be used for user's data & not +** system files. +** EX_NOINPUT -- An input file (not a system file) did not +** exist or was not readable. This could also include +** errors like "No message" to a mailer (if it cared +** to catch it). +** EX_NOUSER -- The user specified did not exist. This might +** be used for mail addresses or remote logins. +** EX_NOHOST -- The host specified did not exist. This is used +** in mail addresses or network requests. +** EX_UNAVAILABLE -- A service is unavailable. This can occur +** if a support program or file does not exist. This +** can also be used as a catchall message when something +** you wanted to do doesn't work, but you don't know +** why. +** EX_SOFTWARE -- An internal software error has been detected. +** This should be limited to non-operating system related +** errors as possible. +** EX_OSERR -- An operating system error has been detected. +** This is intended to be used for such things as "cannot +** fork", "cannot create pipe", or the like. It includes +** things like getuid returning a user that does not +** exist in the passwd file. +** EX_OSFILE -- Some system file (e.g., /etc/passwd, /etc/utmp, +** etc.) does not exist, cannot be opened, or has some +** sort of error (e.g., syntax error). +** EX_CANTCREAT -- A (user specified) output file cannot be +** created. +** EX_IOERR -- An error occurred while doing I/O on some file. +** EX_TEMPFAIL -- temporary failure, indicating something that +** is not really an error. In sendmail, this means +** that a mailer (e.g.) could not create a connection, +** and the request should be reattempted later. +** EX_PROTOCOL -- the remote system returned something that +** was "not possible" during a protocol exchange. +** EX_NOPERM -- You did not have sufficient permission to +** perform the operation. This is not intended for +** file system problems, which should use NOINPUT or +** CANTCREAT, but rather for higher level permissions. +** For example, kre uses this to restrict who students +** can send mail to. +** +** Maintained by Eric Allman (eric@berkeley, ucbvax!eric) -- +** please mail changes to me. +** +** @(#)sysexits.h 4.5 7/6/88 +*/ + +# define EX_OK 0 /* successful termination */ + +# define EX__BASE 64 /* base value for error messages */ + +# define EX_USAGE 64 /* command line usage error */ +# define EX_DATAERR 65 /* data format error */ +# define EX_NOINPUT 66 /* cannot open input */ +# define EX_NOUSER 67 /* addressee unknown */ +# define EX_NOHOST 68 /* host name unknown */ +# define EX_UNAVAILABLE 69 /* service unavailable */ +# define EX_SOFTWARE 70 /* internal software error */ +# define EX_OSERR 71 /* system error (e.g., can't fork) */ +# define EX_OSFILE 72 /* critical OS file missing */ +# define EX_CANTCREAT 73 /* can't create (user) output file */ +# define EX_IOERR 74 /* input/output error */ +# define EX_TEMPFAIL 75 /* temp failure; user is invited to retry */ +# define EX_PROTOCOL 76 /* remote error in protocol */ +# define EX_NOPERM 77 /* permission denied */ +# define EX_CONFIG 78 /* configuration error */ diff --git a/deps/liblber.a b/deps/liblber.a new file mode 100644 index 0000000000000000000000000000000000000000..a62ab3347a0cbd6cf9dc4f9cdb6ca67f81a832cc GIT binary patch literal 112102 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 QH%5O^((`X(ZqVuf7nRtd!vFvP literal 0 HcmV?d00001 diff --git a/deps/libldap.a b/deps/libldap.a new file mode 100644 index 0000000000000000000000000000000000000000..5be6d85201adb2ce9825737dabed579a68f66f21 GIT binary patch literal 622808 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 z%0Drn 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 D-qEjh literal 0 HcmV?d00001