s3:registry: move reg_objects.h to registry/ and use it only where needed
[kai/samba.git] / source3 / rpc_server / srv_ntsvcs_nt.c
index 681c543c24375037f5f13ac213c53b66216a73f9..f864dc175dd4c72baa85ab5fee6d23869d96a5be 100644 (file)
@@ -3,6 +3,7 @@
  *  RPC Pipe client / server routines
  *
  *  Copyright (C) Gerald (Jerry) Carter             2005.
+ *  Copyright (C) Guenther Deschner                 2008,2009.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -19,6 +20,9 @@
  */
 
 #include "includes.h"
+#include "../librpc/gen_ndr/srv_ntsvcs.h"
+#include "registry.h"
+#include "registry/reg_objects.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_RPC_SRV
@@ -50,8 +54,9 @@ WERROR _PNP_GetDeviceListSize(pipes_struct *p,
 {
        char *devicepath;
 
-       if (!r->in.devicename) {
-               return WERR_ACCESS_DENIED;
+       if ((r->in.flags & CM_GETIDLIST_FILTER_SERVICE) &&
+           (!r->in.devicename)) {
+               return WERR_CM_INVALID_POINTER;
        }
 
        if (!(devicepath = get_device_path(p->mem_ctx, r->in.devicename))) {
@@ -74,13 +79,13 @@ WERROR _PNP_GetDeviceList(pipes_struct *p,
 {
        char *devicepath;
        uint32_t size = 0;
-
+       const char **multi_sz = NULL;
        DATA_BLOB blob;
-       struct lsa_StringLarge s;
-       enum ndr_err_code ndr_err;
 
-       if ( !r->in.filter )
-               return WERR_ACCESS_DENIED;
+       if ((r->in.flags & CM_GETIDLIST_FILTER_SERVICE) &&
+           (!r->in.filter)) {
+               return WERR_CM_INVALID_POINTER;
+       }
 
        if (!(devicepath = get_device_path(p->mem_ctx, r->in.filter))) {
                return WERR_NOMEM;
@@ -92,20 +97,23 @@ WERROR _PNP_GetDeviceList(pipes_struct *p,
                return WERR_CM_BUFFER_SMALL;
        }
 
-       s.string = r->in.filter;
-
-       /* This has to be DOUBLE NULL terminated */
-       ndr_err = ndr_push_struct_blob(&blob, p->mem_ctx, NULL, &s,
-                       (ndr_push_flags_fn_t)ndr_push_lsa_StringLarge);
-       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-               return ntstatus_to_werror(ndr_map_error2ntstatus(ndr_err));
+       multi_sz = talloc_zero_array(p->mem_ctx, const char *, 2);
+       if (!multi_sz) {
+               return WERR_NOMEM;
        }
 
-       r->out.buffer = (uint16_t *)talloc_memdup(p->mem_ctx, blob.data, blob.length);
-       if (!r->out.buffer) {
+       multi_sz[0] = devicepath;
+
+       if (!push_reg_multi_sz(multi_sz, &blob, multi_sz)) {
                return WERR_NOMEM;
        }
 
+       if (*r->in.length < blob.length/2) {
+               return WERR_CM_BUFFER_SMALL;
+       }
+
+       memcpy(r->out.buffer, blob.data, blob.length);
+
        return WERR_OK;
 }
 
@@ -117,8 +125,8 @@ WERROR _PNP_GetDeviceRegProp(pipes_struct *p,
                             struct PNP_GetDeviceRegProp *r)
 {
        char *ptr;
-       REGVAL_CTR *values;
-       REGISTRY_VALUE *val;
+       struct regval_ctr *values;
+       struct regval_blob *val;
 
        switch( r->in.property ) {
        case DEV_REGPROP_DESC:
@@ -142,22 +150,22 @@ WERROR _PNP_GetDeviceRegProp(pipes_struct *p,
                        return WERR_GENERAL_FAILURE;
                }
 
-               if (*r->in.buffer_size < val->size) {
-                       *r->out.needed = val->size;
+               if (*r->in.buffer_size < regval_size(val)) {
+                       *r->out.needed = regval_size(val);
                        *r->out.buffer_size = 0;
                        TALLOC_FREE( values );
                        return WERR_CM_BUFFER_SMALL;
                }
 
-               r->out.buffer = (uint8_t *)talloc_memdup(p->mem_ctx, val->data_p, val->size);
+               r->out.buffer = (uint8_t *)talloc_memdup(p->mem_ctx, regval_data_p(val), regval_size(val));
                TALLOC_FREE(values);
                if (!r->out.buffer) {
                        return WERR_NOMEM;
                }
 
                *r->out.reg_data_type = REG_SZ; /* always 1...tested using a remove device manager connection */
-               *r->out.buffer_size = val->size;
-               *r->out.needed = val->size;
+               *r->out.buffer_size = regval_size(val);
+               *r->out.needed = regval_size(val);
 
                break;