Author: tridge
Date: 2004-09-03 13:36:58 +0000 (Fri, 03 Sep 2004)
New Revision: 2209

WebSVN: 
http://websvn.samba.org/websvn/changeset.php?rep=samba&path=/branches/SAMBA_4_0/source&rev=2209&nolog=1

Log:
patch from volker to add EnumPorts spoolss IDL and test code

the ndr->offset=0; stuff is ugly. We need a better way to handle this.


Modified:
   branches/SAMBA_4_0/source/librpc/idl/spoolss.idl
   branches/SAMBA_4_0/source/librpc/ndr/ndr_spoolss_buf.c
   branches/SAMBA_4_0/source/torture/rpc/spoolss.c


Changeset:
Modified: branches/SAMBA_4_0/source/librpc/idl/spoolss.idl
===================================================================
--- branches/SAMBA_4_0/source/librpc/idl/spoolss.idl    2004-09-03 13:21:52 UTC (rev 
2208)
+++ branches/SAMBA_4_0/source/librpc/idl/spoolss.idl    2004-09-03 13:36:58 UTC (rev 
2209)
@@ -464,9 +464,31 @@
                [out] uint32 count
        );
 
+       typedef [flag(RELATIVE_CURRENT)] struct {
+               [relative] nstring *port_name;
+       } spoolss_PortInfo1;
+
+       typedef struct {
+               [relative] nstring *port_name;
+               [relative] nstring *monitor_name;
+               [relative] nstring *description;
+               uint32 port_type;
+               uint32 reserved;
+       } spoolss_PortInfo2;
+
+       typedef [nondiscriminant,public] union {
+               [case(1)] spoolss_PortInfo1 info1;
+               [case(2)] spoolss_PortInfo2 info2;
+       } spoolss_PortInfo;
+
        /******************/
        /* Function: 0x23 */
        WERROR spoolss_EnumPorts(
+               [in] unistr *servername,
+               [in] uint32 level,
+               [in,out] DATA_BLOB *buffer,
+               [in,out,ref] uint32 *buf_size,
+               [out] uint32 count
        );
 
        /******************/

Modified: branches/SAMBA_4_0/source/librpc/ndr/ndr_spoolss_buf.c
===================================================================
--- branches/SAMBA_4_0/source/librpc/ndr/ndr_spoolss_buf.c      2004-09-03 13:21:52 
UTC (rev 2208)
+++ branches/SAMBA_4_0/source/librpc/ndr/ndr_spoolss_buf.c      2004-09-03 13:36:58 
UTC (rev 2209)
@@ -36,6 +36,8 @@
        }
        NDR_ALLOC_N(ndr, *info, count);
        for (i=0;i<count;i++) {
+               ndr->data += ndr->offset;
+               ndr->offset = 0;
                NDR_CHECK(ndr_pull_spoolss_PrinterInfo(ndr, NDR_SCALARS|NDR_BUFFERS, 
level, &(*info)[i]));
        }
        return NT_STATUS_OK;
@@ -91,3 +93,22 @@
        }
        return NT_STATUS_OK;
 }
+
+NTSTATUS pull_spoolss_PortInfoArray(DATA_BLOB *blob, TALLOC_CTX *mem_ctx,
+                                     uint32_t level, uint32_t count,
+                                     union spoolss_PortInfo **info)
+{
+       int i;
+       struct ndr_pull *ndr;
+       ndr = ndr_pull_init_blob(blob, mem_ctx);
+       if (!ndr) {
+               return NT_STATUS_NO_MEMORY;
+       }
+       NDR_ALLOC_N(ndr, *info, count);
+       for (i=0;i<count;i++) {
+               ndr->data += ndr->offset;
+               ndr->offset = 0;
+               NDR_CHECK(ndr_pull_spoolss_PortInfo(ndr, NDR_SCALARS|NDR_BUFFERS, 
level, &(*info)[i]));
+       }
+       return NT_STATUS_OK;
+}

Modified: branches/SAMBA_4_0/source/torture/rpc/spoolss.c
===================================================================
--- branches/SAMBA_4_0/source/torture/rpc/spoolss.c     2004-09-03 13:21:52 UTC (rev 
2208)
+++ branches/SAMBA_4_0/source/torture/rpc/spoolss.c     2004-09-03 13:36:58 UTC (rev 
2209)
@@ -270,6 +270,68 @@
        return ret;
 }
 
+static BOOL test_EnumPorts(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
+{
+       NTSTATUS status;
+       struct spoolss_EnumPorts r;
+       uint32_t buf_size;
+
+       r.in.servername = talloc_asprintf(mem_ctx, "\\\\%s", 
+                                         dcerpc_server_name(p));
+       r.in.level = 2;
+       r.in.buffer = NULL;
+       buf_size = 0;
+       r.in.buf_size = &buf_size;
+       r.out.buf_size = &buf_size;
+
+       printf("Testing EnumPorts\n");
+
+       status = dcerpc_spoolss_EnumPorts(p, mem_ctx, &r);
+
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("EnumPorts failed -- %s\n", nt_errstr(status));
+               return False;
+       }
+
+       if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
+               DATA_BLOB blob = data_blob_talloc(mem_ctx, NULL, buf_size);
+               union spoolss_PortInfo *info;
+               int j;
+
+               data_blob_clear(&blob);
+               r.in.buffer = &blob;
+
+               status = dcerpc_spoolss_EnumPorts(p, mem_ctx, &r);
+
+               if (!NT_STATUS_IS_OK(status)) {
+                       printf("EnumPorts failed -- %s\n", nt_errstr(status));
+                       return False;
+               }
+
+               if (!r.out.buffer) {
+                       printf("No ports returned");
+                       return False;
+               }
+
+               status = pull_spoolss_PortInfoArray(r.out.buffer, mem_ctx,
+                                                   r.in.level, r.out.count,
+                                                   &info);
+               if (!NT_STATUS_IS_OK(status)) {
+                       printf("EnumPortArray parse failed - %s\n",
+                              nt_errstr(status));
+                       return False;
+               }
+
+               for (j=0;j<r.out.count;j++) {
+                       printf("Port %d\n", j);
+                       NDR_PRINT_UNION_DEBUG(spoolss_PortInfo, r.in.level,
+                                             &info[j]);
+               }
+       }
+
+       return True;
+}
+
 static BOOL test_GetJob(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
                  struct policy_handle *handle, uint32_t job_id)
 {
@@ -973,6 +1035,10 @@
                return False;
        }
 
+       if (!test_EnumPorts(p, mem_ctx)) {
+               ret = False;
+       }
+
        if (!test_EnumPrinters(p, mem_ctx)) {
                ret = False;
        }

Reply via email to