r9496: added a regToVar() function that converts a registry blob variable to a ejs...
authorAndrew Tridgell <tridge@samba.org>
Tue, 23 Aug 2005 01:59:08 +0000 (01:59 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:34:22 +0000 (13:34 -0500)
(This used to be commit 76ffc200794cdae6dcd7d07adb5617f1b09fe435)

source4/scripting/ejs/smbcalls_data.c

index 3b431dc8c30938df851d51cc0422438acddbe55f..a3501b7d31ce52308cb6064ce5fd4d0c3536fd1c 100644 (file)
@@ -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;
 }