lots of rpc calls without memory usage increasing.
#include "includes.h"
#include "lib/ejs/ejs.h"
+#include "scripting/ejs/smbcalls.h"
#include "librpc/gen_ndr/ndr_security.h"
#include "librpc/gen_ndr/ndr_lsa.h"
#include "scripting/ejs/ejsrpc.h"
return NT_STATUS_INTERNAL_ERROR;
}
-/*
- find a mpr component, allowing for sub objects, using the '.' convention
-*/
-static 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
-*/
-static 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;
- }
- 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) {
- struct MprVar val2 = mprCreateObjVar(objname, MPR_DEFAULT_HASH_SIZE);
- v2 = mprCreateProperty(v, objname, &val2);
- }
- status = mprSetVar(v2, p+1, val);
- talloc_free(objname);
- return status;
-}
-
-
/*
start the ejs pull process for a structure
*/
#include "lib/ejs/ejs.h"
#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
*/
{
char idx[16];
mprItoa(i, idx, sizeof(idx));
- mprCreateProperty(var, idx, &v);
+ mprSetVar(var, idx, v);
}
/*
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);
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;
*/
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;
}
*/
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;
}
*/
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));
}
/*
}
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));
+}
+
+
#include "includes.h"
#include "lib/ejs/ejs.h"
#include "auth/auth.h"
+#include "scripting/ejs/smbcalls.h"
/*
return the type of a variable
}
if (type == NULL) return -1;
- ejsSetReturnString(eid, type);
+ mpr_ReturnString(eid, type);
return 0;
}
/*
setup a return of a string list
*/
- void ejs_returnlist(MprVarHandle eid, const char *name, const char **list)
+void ejs_returnlist(int eid, const char *name, const char **list)
{
- ejsSetReturnValue(eid, mprList(name, list));
+ mpr_Return(eid, mprList(name, list));
}
static int ejs_systemAuth(TALLOC_CTX *tmp_ctx, struct MprVar *auth, const char *username, const char *password, const char *domain, const char *remote_host)
mprSetPropertyValue(&auth, "report", mprCreateStringVar("Unknown Domain", 1));
}
- ejsSetReturnValue(eid, auth);
+ mpr_Return(eid, auth);
talloc_free(tmp_ctx);
return 0;
}
static int ejs_domain_list(MprVarHandle eid, int argc, char **argv)
{
struct MprVar list;
- struct MprVar dom;
if (argc != 0) {
ejsSetErrorMsg(eid, "domList invalid arguments");
}
list = mprCreateObjVar("list", MPR_DEFAULT_HASH_SIZE);
- dom = mprCreateStringVar("System User", 1);
- mprCreateProperty(&list, "0", &dom);
+ mprSetVar(&list, "0", mprCreateStringVar("System User", 1));
- ejsSetReturnValue(eid, list);
+ mpr_Return(eid, list);
return 0;
}
#include "lib/ejs/ejs.h"
-void ejs_returnlist(MprVarHandle eid, const char *name, const char **list);
+void mpr_Return(int eid, struct MprVar);
+NTSTATUS mprSetVar(struct MprVar *v, const char *name, struct MprVar val);
+NTSTATUS mprGetVar(struct MprVar **v, const char *name);
+
+
*/
#include "includes.h"
+#include "scripting/ejs/smbcalls.h"
#include "lib/ejs/ejs.h"
#include "libcli/raw/libcliraw.h"
#include "libcli/composite/composite.h"
result = smb_raw_negotiate(transport, lp_maxprotocol());
if (!NT_STATUS_IS_OK(result)) {
- ejsSetReturnValue(eid, mprNTSTATUS(result));
+ mpr_Return(eid, mprNTSTATUS(result));
return 0;
}
/* Return a socket object */
- ejsSetReturnValue(eid, mprCreatePtrVar(transport,
+ mpr_Return(eid, mprCreatePtrVar(transport,
talloc_get_name(transport)));
return 0;
/* Return a session object */
- ejsSetReturnValue(eid, mprCreatePtrVar(session,
+ mpr_Return(eid, mprCreatePtrVar(session,
talloc_get_name(session)));
result = 0;
talloc_free(mem_ctx);
- ejsSetReturnValue(eid, mprCreatePtrVar(tree,
+ mpr_Return(eid, mprCreatePtrVar(tree,
talloc_get_name(tree)));
return 0;
talloc_free(mem_ctx);
if (!NT_STATUS_IS_OK(result)) {
- ejsSetReturnValue(eid, mprNTSTATUS(result));
+ mpr_Return(eid, mprNTSTATUS(result));
return 0;
}
- ejsSetReturnValue(eid, mprCreatePtrVar(tree, talloc_get_name(tree)));
+ mpr_Return(eid, mprCreatePtrVar(tree, talloc_get_name(tree)));
return 0;
}
result = smb_tree_disconnect(tree);
- ejsSetReturnValue(eid, mprNTSTATUS(result));
+ mpr_Return(eid, mprNTSTATUS(result));
return 0;
}
result = smbcli_mkdir(tree, argv[1]->string);
- ejsSetReturnValue(eid, mprNTSTATUS(result));
+ mpr_Return(eid, mprNTSTATUS(result));
return 0;
}
result = smbcli_rmdir(tree, argv[1]->string);
- ejsSetReturnValue(eid, mprNTSTATUS(result));
+ mpr_Return(eid, mprNTSTATUS(result));
return 0;
}
result = smbcli_rename(tree, argv[1]->string, argv[2]->string);
- ejsSetReturnValue(eid, mprNTSTATUS(result));
+ mpr_Return(eid, mprNTSTATUS(result));
return 0;
}
result = smbcli_unlink(tree, argv[1]->string);
- ejsSetReturnValue(eid, mprNTSTATUS(result));
+ mpr_Return(eid, mprNTSTATUS(result));
return 0;
}
void *state)
{
- MprVar *result = (MprVar *)state, value;
+ MprVar *result = (MprVar *)state;
char idx[16];
mprItoa(result->properties->numDataItems, idx, sizeof(idx));
- value = mprCreateStringVar(info->name, 1);
- mprCreateProperty(result, idx, &value);
+ mprSetVar(result, idx, mprCreateStringVar(info->name, 1));
}
static int ejs_list(MprVarHandle eid, int argc, MprVar **argv)
smbcli_list(tree, mask, attribute, ejs_list_helper, &result);
- ejsSetReturnValue(eid, result);
+ mpr_Return(eid, result);
return 0;
}
if (type == NULL || option == NULL) return -1;
value = lp_get_parametric(snum, type, option);
if (value == NULL) return -1;
- ejsSetReturnString(eid, value);
+ mpr_ReturnString(eid, value);
return 0;
}
if (type == NULL || option == NULL) return -1;
value = lp_get_parametric(-1, type, option);
if (value == NULL) return -1;
- ejsSetReturnString(eid, value);
+ mpr_ReturnString(eid, value);
return 0;
} else {
/* its a global parameter */
switch (parm->type) {
case P_STRING:
case P_USTRING:
- ejsSetReturnString(eid, *(char **)parm_ptr);
+ mpr_ReturnString(eid, *(char **)parm_ptr);
break;
case P_BOOL:
- ejsSetReturnValue(eid, mprCreateBoolVar(*(BOOL *)parm_ptr));
+ mpr_Return(eid, mprCreateBoolVar(*(BOOL *)parm_ptr));
break;
case P_INTEGER:
- ejsSetReturnValue(eid, mprCreateIntegerVar(*(int *)parm_ptr));
+ mpr_Return(eid, mprCreateIntegerVar(*(int *)parm_ptr));
break;
case P_ENUM:
for (i=0; parm->enum_list[i].name; i++) {
if (*(int *)parm_ptr == parm->enum_list[i].value) {
- ejsSetReturnString(eid, parm->enum_list[i].name);
+ mpr_ReturnString(eid, parm->enum_list[i].name);
return 0;
}
}
*/
#include "includes.h"
+#include "scripting/ejs/smbcalls.h"
#include "lib/ejs/ejs.h"
#include "lib/ldb/include/ldb.h"
goto failed;
}
- ejsSetReturnValue(eid, mprLdbArray(res, ret, "ldb_message"));
+ mpr_Return(eid, mprLdbArray(res, ret, "ldb_message"));
talloc_free(tmp_ctx);
return 0;
*/
#include "includes.h"
+#include "scripting/ejs/smbcalls.h"
#include "lib/ejs/ejs.h"
#include "librpc/gen_ndr/ndr_nbt.h"
mprCreateStringVar(reply_addr, 1));
}
- ejsSetReturnValue(eid, mprNTSTATUS(nt_status));
+ mpr_Return(eid, mprNTSTATUS(nt_status));
done:
talloc_free(tmp_ctx);
*/
#include "includes.h"
+#include "scripting/ejs/smbcalls.h"
#include "lib/ejs/ejs.h"
#include "librpc/gen_ndr/ndr_echo.h"
#include "lib/cmdline/popt_common.h"
mprSetPtr(conn, "iface", iface);
done:
- ejsSetReturnValue(eid, mprNTSTATUS(status));
+ mpr_Return(eid, mprNTSTATUS(status));
return 0;
}
done:
talloc_free(ejs);
- ejsSetReturnValue(eid, mprNTSTATUS(status));
+ mpr_Return(eid, mprNTSTATUS(status));
if (NT_STATUS_EQUAL(status, NT_STATUS_INTERNAL_ERROR)) {
return -1;
}
#include "lib/cmdline/popt_common.h"
#include "dynconfig.h"
#include "lib/ejs/ejs.h"
+#include "scripting/ejs/smbcalls.h"
void ejs_exception(const char *reason)
{
talloc_steal(mem_ctx, argv_list);
v = mprList("ARGV", argv_list);
mprSetPropertyValue(&v, "length", mprCreateIntegerVar(i-1));
- mprCreateProperty(ejsGetGlobalObject(eid), "ARGV", &v);
+ mprSetVar(ejsGetGlobalObject(eid), "ARGV", v);
/* load the script and advance past interpreter line*/
script = file_load(fname, &script_size, mem_ctx);