s3-ntsvcs: use pidl for _PNP_GetDeviceList.
authorGünther Deschner <gd@samba.org>
Wed, 19 Nov 2008 13:33:36 +0000 (14:33 +0100)
committerGünther Deschner <gd@samba.org>
Wed, 17 Dec 2008 22:52:41 +0000 (23:52 +0100)
Guenther

source3/rpc_server/srv_ntsvcs.c
source3/rpc_server/srv_ntsvcs_nt.c

index 840da3eec4e4b69cec58103e1602935870b4cbad..c37d2dda7e6295e5c1798771d32cee230d604669 100644 (file)
@@ -65,23 +65,7 @@ static bool api_ntsvcs_get_device_list_size(pipes_struct *p)
 
 static bool api_ntsvcs_get_device_list(pipes_struct *p)
 {
-       NTSVCS_Q_GET_DEVICE_LIST q_u;
-       NTSVCS_R_GET_DEVICE_LIST r_u;
-       prs_struct *data = &p->in_data.data;
-       prs_struct *rdata = &p->out_data.rdata;
-
-       ZERO_STRUCT(q_u);
-       ZERO_STRUCT(r_u);
-
-       if(!ntsvcs_io_q_get_device_list("", &q_u, data, 0))
-               return False;
-
-       r_u.status = _ntsvcs_get_device_list(p, &q_u, &r_u);
-
-       if(!ntsvcs_io_r_get_device_list("", &r_u, rdata, 0))
-               return False;
-
-       return True;
+       return proxy_ntsvcs_call(p, NDR_PNP_GETDEVICELIST);
 }
 
 /*******************************************************************
index f2c85bbd3e42beefdf1dde6f25f9c118da24caca..681c543c24375037f5f13ac213c53b66216a73f9 100644 (file)
@@ -65,29 +65,46 @@ WERROR _PNP_GetDeviceListSize(pipes_struct *p,
        return WERR_OK;
 }
 
+/****************************************************************
+ _PNP_GetDeviceList
+****************************************************************/
 
-/********************************************************************
-********************************************************************/
-
-WERROR _ntsvcs_get_device_list( pipes_struct *p, NTSVCS_Q_GET_DEVICE_LIST *q_u, NTSVCS_R_GET_DEVICE_LIST *r_u )
+WERROR _PNP_GetDeviceList(pipes_struct *p,
+                         struct PNP_GetDeviceList *r)
 {
-       fstring device;
        char *devicepath;
+       uint32_t size = 0;
 
-       if ( !q_u->devicename )
-               return WERR_ACCESS_DENIED;
+       DATA_BLOB blob;
+       struct lsa_StringLarge s;
+       enum ndr_err_code ndr_err;
 
-       rpcstr_pull(device, q_u->devicename->buffer, sizeof(device), q_u->devicename->uni_str_len*2, 0);
+       if ( !r->in.filter )
+               return WERR_ACCESS_DENIED;
 
-       if (!(devicepath = get_device_path(p->mem_ctx, device))) {
+       if (!(devicepath = get_device_path(p->mem_ctx, r->in.filter))) {
                return WERR_NOMEM;
        }
 
+       size = strlen(devicepath) + 2;
+
+       if (*r->in.length < size) {
+               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));
+       }
 
-       init_unistr2( &r_u->devicepath, devicepath, UNI_STR_DBLTERMINATE );
-       TALLOC_FREE(devicepath);
-       r_u->needed = r_u->devicepath.uni_str_len;
+       r->out.buffer = (uint16_t *)talloc_memdup(p->mem_ctx, blob.data, blob.length);
+       if (!r->out.buffer) {
+               return WERR_NOMEM;
+       }
 
        return WERR_OK;
 }
@@ -271,16 +288,6 @@ WERROR _PNP_EnumerateSubKeys(pipes_struct *p,
 /****************************************************************
 ****************************************************************/
 
-WERROR _PNP_GetDeviceList(pipes_struct *p,
-                         struct PNP_GetDeviceList *r)
-{
-       p->rng_fault_state = true;
-       return WERR_NOT_SUPPORTED;
-}
-
-/****************************************************************
-****************************************************************/
-
 WERROR _PNP_GetDepth(pipes_struct *p,
                     struct PNP_GetDepth *r)
 {