diff options
author | Andrew Tridgell <tridge@samba.org> | 2005-07-10 02:37:50 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:19:30 -0500 |
commit | 60ec75cbc7dccfceec9c57799e2af5be21a08609 (patch) | |
tree | 2e98a1f002878f63264f3e22b2f4ad46f488ca4d /source4/scripting/ejs/mprutil.c | |
parent | 1e5b309b4fc15dcc48007d856a954a2bea08b380 (diff) | |
download | samba-60ec75cbc7dccfceec9c57799e2af5be21a08609.tar.gz |
r8276: fixed the remaining memory leaks in smbscript. We can now loop doing
lots of rpc calls without memory usage increasing.
(This used to be commit 9c885a7edb771486793eb287288158157b34e8f3)
Diffstat (limited to 'source4/scripting/ejs/mprutil.c')
-rw-r--r-- | source4/scripting/ejs/mprutil.c | 126 |
1 files changed, 95 insertions, 31 deletions
diff --git a/source4/scripting/ejs/mprutil.c b/source4/scripting/ejs/mprutil.c index 7b64d042f53..3c28cb4bf18 100644 --- a/source4/scripting/ejs/mprutil.c +++ b/source4/scripting/ejs/mprutil.c @@ -25,13 +25,74 @@ #include "lib/ldb/include/ldb.h" /* + find a mpr component, allowing for sub objects, using the '.' convention +*/ + NTSTATUS mprGetVar(struct MprVar **v, const char *name) +{ + const char *p = strchr(name, '.'); + char *objname; + NTSTATUS status; + if (p == NULL) { + *v = mprGetProperty(*v, name, NULL); + if (*v == NULL) { + DEBUG(1,("mprGetVar unable to find '%s'\n", name)); + return NT_STATUS_INVALID_PARAMETER; + } + return NT_STATUS_OK; + } + objname = talloc_strndup(mprMemCtx(), name, p-name); + NT_STATUS_HAVE_NO_MEMORY(objname); + *v = mprGetProperty(*v, objname, NULL); + NT_STATUS_HAVE_NO_MEMORY(*v); + status = mprGetVar(v, p+1); + talloc_free(objname); + return status; +} + + +/* + set a mpr component, allowing for sub objects, using the '.' convention + destroys 'val' after setting +*/ + NTSTATUS mprSetVar(struct MprVar *v, const char *name, struct MprVar val) +{ + const char *p = strchr(name, '.'); + char *objname; + struct MprVar *v2; + NTSTATUS status; + if (p == NULL) { + v2 = mprSetProperty(v, name, &val); + if (v2 == NULL) { + DEBUG(1,("mprSetVar unable to set '%s'\n", name)); + return NT_STATUS_INVALID_PARAMETER_MIX; + } + mprDestroyVar(&val); + return NT_STATUS_OK; + } + objname = talloc_strndup(mprMemCtx(), name, p-name); + if (objname == NULL) { + return NT_STATUS_NO_MEMORY; + } + v2 = mprGetProperty(v, objname, NULL); + if (v2 == NULL) { + mprSetVar(v, objname, mprCreateObjVar(objname, MPR_DEFAULT_HASH_SIZE)); + v2 = mprGetProperty(v, objname, NULL); + } + status = mprSetVar(v2, p+1, val); + talloc_free(objname); + return status; +} + + + +/* add an indexed array element to a property */ static void mprAddArray(struct MprVar *var, int i, struct MprVar v) { char idx[16]; mprItoa(i, idx, sizeof(idx)); - mprCreateProperty(var, idx, &v); + mprSetVar(var, idx, v); } /* @@ -76,12 +137,12 @@ struct MprVar mprLdbMessage(struct ldb_message *msg) need a special case for the single value case */ const char *multivalued[] = { "objectClass", "memberOf", "privilege", "member", NULL }; - struct MprVar val; var = mprCreateObjVar(msg->dn, MPR_DEFAULT_HASH_SIZE); for (i=0;i<msg->num_elements;i++) { struct ldb_message_element *el = &msg->elements[i]; + struct MprVar val; if (el->num_values == 1 && !str_list_check_ci(multivalued, el->name)) { val = mprData(el->values[0].data, el->values[0].length); @@ -94,13 +155,12 @@ struct MprVar mprLdbMessage(struct ldb_message *msg) el->values[j].length)); } } - mprCreateProperty(&var, el->name, &val); + mprSetVar(&var, el->name, val); } /* add the dn if it is not already specified */ if (mprGetProperty(&var, "dn", 0) == 0) { - val = mprCreateStringVar(msg->dn, 1); - mprCreateProperty(&var, "dn", &val); + mprSetVar(&var, "dn", mprCreateStringVar(msg->dn, 1)); } return var; @@ -172,21 +232,14 @@ const char **mprToList(TALLOC_CTX *mem_ctx, struct MprVar *v) */ struct MprVar mprNTSTATUS(NTSTATUS status) { - struct MprVar res, val; + struct MprVar res; res = mprCreateObjVar("ntstatus", MPR_DEFAULT_HASH_SIZE); - val = mprCreateStringVar(nt_errstr(status), 1); - mprCreateProperty(&res, "errstr", &val); - - val = mprCreateIntegerVar(NT_STATUS_V(status)); - mprCreateProperty(&res, "v", &val); - - val = mprCreateBoolVar(NT_STATUS_IS_OK(status)); - mprCreateProperty(&res, "is_ok", &val); - - val = mprCreateBoolVar(NT_STATUS_IS_ERR(status)); - mprCreateProperty(&res, "is_err", &val); + mprSetVar(&res, "errstr", mprCreateStringVar(nt_errstr(status), 1)); + mprSetVar(&res, "v", mprCreateIntegerVar(NT_STATUS_V(status))); + mprSetVar(&res, "is_ok", mprCreateBoolVar(NT_STATUS_IS_OK(status))); + mprSetVar(&res, "is_err", mprCreateBoolVar(NT_STATUS_IS_ERR(status))); return res; } @@ -196,21 +249,14 @@ struct MprVar mprNTSTATUS(NTSTATUS status) */ struct MprVar mprWERROR(WERROR status) { - struct MprVar res, val; + struct MprVar res; res = mprCreateObjVar("werror", MPR_DEFAULT_HASH_SIZE); - val = mprCreateStringVar(win_errstr(status), 1); - mprCreateProperty(&res, "errstr", &val); - - val = mprCreateIntegerVar(W_ERROR_V(status)); - mprCreateProperty(&res, "v", &val); - - val = mprCreateBoolVar(W_ERROR_IS_OK(status)); - mprCreateProperty(&res, "is_ok", &val); - - val = mprCreateBoolVar(True); - mprCreateProperty(&res, "is_err", &val); + mprSetVar(&res, "errstr", mprCreateStringVar(win_errstr(status), 1)); + mprSetVar(&res, "v", mprCreateIntegerVar(W_ERROR_V(status))); + mprSetVar(&res, "is_ok", mprCreateBoolVar(W_ERROR_IS_OK(status))); + mprSetVar(&res, "is_err", mprCreateBoolVar(!W_ERROR_IS_OK(status))); return res; } @@ -221,8 +267,7 @@ struct MprVar mprWERROR(WERROR status) */ void mprSetPtr(struct MprVar *v, const char *propname, const void *p) { - struct MprVar val = mprCreatePtrVar(discard_const(p), NULL); - mprCreateProperty(v, propname, &val); + mprSetVar(v, propname, mprCreatePtrVar(discard_const(p), NULL)); } /* @@ -240,3 +285,22 @@ void *mprGetPtr(struct MprVar *v, const char *propname) } return val->ptr; } + +/* + set the return value then free the variable +*/ + void mpr_Return(int eid, struct MprVar v) +{ + ejsSetReturnValue(eid, v); + mprDestroyVar(&v); +} + +/* + set the return value then free the variable +*/ +void mpr_ReturnString(int eid, const char *s) +{ + mpr_Return(eid, mprCreateStringVar(s, False)); +} + + |