summaryrefslogtreecommitdiff
path: root/source4/scripting
diff options
context:
space:
mode:
Diffstat (limited to 'source4/scripting')
-rw-r--r--source4/scripting/ejs/smbcalls_data.c119
1 files changed, 119 insertions, 0 deletions
diff --git a/source4/scripting/ejs/smbcalls_data.c b/source4/scripting/ejs/smbcalls_data.c
index 3b431dc8c3..a3501b7d31 100644
--- a/source4/scripting/ejs/smbcalls_data.c
+++ b/source4/scripting/ejs/smbcalls_data.c
@@ -23,6 +23,7 @@
#include "includes.h"
#include "scripting/ejs/smbcalls.h"
#include "lib/appweb/ejs/ejs.h"
+#include "librpc/gen_ndr/winreg.h"
/*
create a data blob object from a ejs array of integers
@@ -142,6 +143,123 @@ done:
return 0;
}
+
+/*
+ convert a blob in winreg format to a mpr variable
+
+ usage:
+ v = data.regToVar(blob, type);
+*/
+static int ejs_regToVar(MprVarHandle eid, int argc, struct MprVar **argv)
+{
+ DATA_BLOB *blob;
+ enum winreg_Type type;
+ struct MprVar v;
+
+ if (argc != 2) {
+ ejsSetErrorMsg(eid, "regToVar invalid arguments");
+ return -1;
+ }
+
+ blob = mprToDataBlob(argv[0]);
+ type = mprToInt(argv[1]);
+
+ if (blob == NULL) {
+ ejsSetErrorMsg(eid, "regToVar null data");
+ return -1;
+ }
+
+ switch (type) {
+ case REG_NONE:
+ v = mprCreateUndefinedVar();
+ break;
+
+ case REG_SZ:
+ case REG_EXPAND_SZ: {
+ char *s;
+ ssize_t len;
+ len = convert_string_talloc(mprMemCtx(), CH_UTF16, CH_UNIX,
+ blob->data, blob->length, &s);
+ if (len == -1) {
+ ejsSetErrorMsg(eid, "regToVar invalid REG_SZ string");
+ return -1;
+ }
+ v = mprString(s);
+ talloc_free(s);
+ break;
+ }
+
+ case REG_DWORD: {
+ if (blob->length != 4) {
+ ejsSetErrorMsg(eid, "regToVar invalid REG_DWORD length %d", blob->length);
+ return -1;
+ }
+ v = mprCreateNumberVar(IVAL(blob->data, 0));
+ break;
+ }
+
+ case REG_DWORD_BIG_ENDIAN: {
+ if (blob->length != 4) {
+ ejsSetErrorMsg(eid, "regToVar invalid REG_DWORD_BIG_ENDIAN length %d", blob->length);
+ return -1;
+ }
+ v = mprCreateNumberVar(RIVAL(blob->data, 0));
+ break;
+ }
+
+ case REG_QWORD: {
+ if (blob->length != 8) {
+ ejsSetErrorMsg(eid, "regToVar invalid REG_QWORD length %d", blob->length);
+ return -1;
+ }
+ v = mprCreateNumberVar(BVAL(blob->data, 0));
+ break;
+ }
+
+ case REG_MULTI_SZ: {
+ DATA_BLOB b = *blob;
+ char **list = NULL;
+ while (b.length > 0) {
+ char *s;
+ ssize_t len;
+ size_t slen = utf16_len_n(b.data, b.length);
+ if (slen == 2 && b.length == 2 && SVAL(b.data, 0) == 0) {
+ break;
+ }
+ len = convert_string_talloc(mprMemCtx(), CH_UTF16, CH_UNIX,
+ b.data, slen, &s);
+ if (len == -1) {
+ ejsSetErrorMsg(eid, "regToVar invalid REG_MULTI_SZ string");
+ return -1;
+ }
+ list = str_list_add(list, s);
+ talloc_free(s);
+ talloc_steal(mprMemCtx(), list);
+ b.data += slen;
+ b.length -= slen;
+ }
+ v = mprList("REG_MULTI_SZ", list);
+ talloc_free(list);
+ break;
+ }
+
+
+ case REG_FULL_RESOURCE_DESCRIPTOR:
+ case REG_RESOURCE_LIST:
+ case REG_BINARY:
+ case REG_RESOURCE_REQUIREMENTS_LIST:
+ case REG_LINK:
+ return ejs_blobToArray(eid, 1, argv);
+
+ default:
+ ejsSetErrorMsg(eid, "regToVar invalid type %d", type);
+ return -1;
+ }
+
+ mpr_Return(eid, v);
+ return 0;
+}
+
/*
initialise datablob ejs subsystem
*/
@@ -152,6 +270,7 @@ static int ejs_datablob_init(MprVarHandle eid, int argc, struct MprVar **argv)
mprSetCFunction(obj, "blobFromArray", ejs_blobFromArray);
mprSetCFunction(obj, "blobToArray", ejs_blobToArray);
mprSetCFunction(obj, "blobCompare", ejs_blobCompare);
+ mprSetCFunction(obj, "regToVar", ejs_regToVar);
return 0;
}