mirror of
https://github.com/samba-team/samba.git
synced 2025-10-25 19:33:18 +03:00
r9496: added a regToVar() function that converts a registry blob variable to a ejs variable.
This commit is contained in:
committed by
Gerald (Jerry) Carter
parent
198aff894e
commit
76ffc20079
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user