From 7ca399c0755e186508a4ed9796cbbbe6f50181e9 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Wed, 14 Feb 2007 21:55:29 +0000 Subject: r21351: Change ldb ejs bindings return codes. We were returning just true/false and discarding error number and string. This checking probably breaks swat, will fix it in next round as swat is what made me look into this as I had no way to get back error messages to show to the users. Simo. (This used to be commit 35886b4ae68be475b0fc8b2689ca04d766661261) --- source4/scripting/ejs/mprutil.c | 31 +++++++--- source4/scripting/ejs/smbcalls.h | 1 + source4/scripting/ejs/smbcalls_ldb.c | 10 ++-- source4/scripting/libjs/provision.js | 113 ++++++++++++++++++----------------- source4/setup/setpassword | 13 ++-- 5 files changed, 94 insertions(+), 74 deletions(-) (limited to 'source4') diff --git a/source4/scripting/ejs/mprutil.c b/source4/scripting/ejs/mprutil.c index cfed69dbe0..459f198dca 100644 --- a/source4/scripting/ejs/mprutil.c +++ b/source4/scripting/ejs/mprutil.c @@ -223,19 +223,32 @@ failed: /* - turn an array of ldb_messages into a ejs object variable + build a MprVar result object for ldb operations with lots of funky properties */ -struct MprVar mprLdbArray(struct ldb_context *ldb, - struct ldb_message **msg, int count, const char *name) +struct MprVar mprLdbResult(struct ldb_context *ldb, int err, struct ldb_result *result) { - struct MprVar res; - int i; + struct MprVar ret; + struct MprVar ary; + + ret = mprObject("ldbret"); + + mprSetVar(&ret, "error", mprCreateIntegerVar(err)); + mprSetVar(&ret, "errstr", mprString(ldb_errstring(ldb))); + + ary = mprArray("ldb_message"); + if (result) { + int i; - res = mprArray(name); - for (i=0;icount; i++) { + mprAddArray(&ary, i, mprLdbMessage(ldb, result->msgs[i])); + } } - return res; + + mprSetVar(&ret, "msgs", ary); + + /* TODO: add referrals, exteded ops, and controls */ + + return ret; } diff --git a/source4/scripting/ejs/smbcalls.h b/source4/scripting/ejs/smbcalls.h index 9fa9100276..a525403493 100644 --- a/source4/scripting/ejs/smbcalls.h +++ b/source4/scripting/ejs/smbcalls.h @@ -21,6 +21,7 @@ */ #include "lib/appweb/ejs/ejs.h" +#include "lib/ldb/include/ldb.h" void mpr_Return(int eid, struct MprVar); NTSTATUS mprSetVar(struct MprVar *v, const char *name, struct MprVar val); diff --git a/source4/scripting/ejs/smbcalls_ldb.c b/source4/scripting/ejs/smbcalls_ldb.c index 3c368bba4f..fc44862985 100644 --- a/source4/scripting/ejs/smbcalls_ldb.c +++ b/source4/scripting/ejs/smbcalls_ldb.c @@ -108,9 +108,9 @@ static int ejs_ldbSearch(MprVarHandle eid, int argc, struct MprVar **argv) ret = ldb_search(ldb, basedn, scope, expression, attrs, &res); if (ret != LDB_SUCCESS) { ejsSetErrorMsg(eid, "ldb.search failed - %s", ldb_errstring(ldb)); - mpr_Return(eid, mprCreateUndefinedVar()); + mpr_Return(eid, mprLdbResult(ldb, ret, NULL)); } else { - mpr_Return(eid, mprLdbArray(ldb, res->msgs, res->count, "ldb_message")); + mpr_Return(eid, mprLdbResult(ldb, ret, res)); talloc_free(res); } talloc_free(tmp_ctx); @@ -161,7 +161,7 @@ static int ejs_ldbAddModify(MprVarHandle eid, int argc, struct MprVar **argv, return -1; } - mpr_Return(eid, mprCreateBoolVar(ret == 0)); + mpr_Return(eid, mprLdbResult(ldb, ret, NULL)); return 0; } @@ -197,7 +197,7 @@ static int ejs_ldbDelete(MprVarHandle eid, int argc, struct MprVar **argv) talloc_free(dn); - mpr_Return(eid, mprCreateBoolVar(ret == 0)); + mpr_Return(eid, mprLdbResult(ldb, ret, NULL)); return 0; } @@ -234,7 +234,7 @@ static int ejs_ldbRename(MprVarHandle eid, int argc, struct MprVar **argv) talloc_free(dn1); talloc_free(dn2); - mpr_Return(eid, mprCreateBoolVar(ret == 0)); + mpr_Return(eid, mprLdbResult(ldb, ret, NULL)); return 0; } diff --git a/source4/scripting/libjs/provision.js b/source4/scripting/libjs/provision.js index 9f24b5e48b..b50e9b5bcf 100644 --- a/source4/scripting/libjs/provision.js +++ b/source4/scripting/libjs/provision.js @@ -23,7 +23,7 @@ function install_ok(session_info, credentials) return false; } var res = ldb.search("(cn=Administrator)"); - if (res.length != 1) { + if (res.error != 0 || res.msgs.length != 1) { return false; } return true; @@ -72,7 +72,7 @@ function setup_name_mapping(info, ldb, sid, unixname) var attrs = new Array("dn"); var res = ldb.search(sprintf("objectSid=%s", sid), info.subobj.DOMAINDN, ldb.SCOPE_SUBTREE, attrs); - if (res.length != 1) { + if (res.error != 0 || res.msgs.length != 1) { info.message("Failed to find record for objectSid %s\n", sid); return false; } @@ -82,9 +82,9 @@ changetype: modify replace: unixName unixName: %s ", - res[0].dn, unixname); + res.msgs[0].dn, unixname); var ok = ldb.modify(mod); - if (!ok) { + if (ok.error != 0) { info.message("name mapping for %s failed - %s\n", sid, ldb.errstring()); return false; @@ -172,20 +172,20 @@ function ldb_erase(ldb) var basedn = ""; var res = ldb.search("(&(|(objectclass=*)(dn=*))(!(dn=@BASEINFO)))", basedn, ldb.SCOPE_SUBTREE, attrs); var i; - if (typeof(res) == "undefined") { + if (res.error != 0) { ldb_delete(ldb); return; } - for (i=0;i