r1271: Return spoolss enumprinters info level1 from spoolss.ldb - woot!
authorTim Potter <tpot@samba.org>
Sun, 27 Jun 2004 12:03:57 +0000 (12:03 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:56:47 +0000 (12:56 -0500)
(This used to be commit 60e48790dc7ee8a98be1914ff4a2c335d25639a8)

source4/rpc_server/config.mk
source4/rpc_server/spoolss/dcesrv_spoolss.c
source4/rpc_server/spoolss/spoolssdb.c

index beef89f23fa33ca0644596cab4ed8954b04bc441..9d9f12d9aaffb6a97d2220d7e629d1c15d283b7b 100644 (file)
@@ -5,7 +5,8 @@
 [SUBSYSTEM::DCERPC_COMMON]
 ADD_OBJ_FILES = \
                rpc_server/common/server_info.o \
-               rpc_server/common/share_info.o
+               rpc_server/common/share_info.o \
+               rpc_server/common/gendb.o
 #
 # End SUBSYSTEM DCERPC_COMMON
 ################################################
@@ -122,7 +123,6 @@ INIT_OBJ_FILES = \
                rpc_server/spoolss/dcesrv_spoolss.o \
                rpc_server/spoolss/spoolssdb.o
 REQUIRED_SUBSYSTEMS = \
-               SAMDB \
                DCERPC_COMMON
 # End MODULE dcerpc_lsa
 ################################################
index 0916ddf0811f075076e4bdf2d8f018fe0599b228..7c14975106ef6a6705f5bff9eef3794de6a8afef 100644 (file)
 #include "rpc_server/common/common.h"
 #include "rpc_server/spoolss/dcesrv_spoolss.h"
 
-
-static WERROR spoolss_EnumPrinters1(TALLOC_CTX *mem_ctx, void *spoolss_ctx,
-                                   struct ndr_push *ndr, uint32_t *count)
+static WERROR spoolss_EnumPrinters1(TALLOC_CTX *mem_ctx, 
+                                   struct ldb_message **msgs, int num_msgs,
+                                   struct ndr_push *ndr)
 {
-       struct spoolss_PrinterInfo1 info[2];
+       struct spoolss_PrinterInfo1 *info;
+       int i;
+
+       info = talloc(mem_ctx, num_msgs * sizeof(struct spoolss_PrinterInfo1));
 
-       info[0].flags = 0x80;
-       info[0].name = "p";
-       info[0].description = "a printer";
-       info[0].comment = "a comment";
+       if (!info)
+               return WERR_NOMEM;
 
-       info[1].flags = 0x80;
-       info[1].name = "p2";
-       info[1].description = "spottyfoot";
-       info[1].comment = "the doggy";
+       for (i = 0; i < num_msgs; i++) {
+               info[i].flags = samdb_result_uint(msgs[i], "flags", 0);
+               info[i].name = samdb_result_string(msgs[i], "name", "");
+               info[i].description = samdb_result_string(msgs[i], "description", "");
+               info[i].comment = samdb_result_string(msgs[i], "comment", "");
+       }
 
        ndr_push_array(ndr, NDR_SCALARS|NDR_BUFFERS, info,
-                      sizeof(struct spoolss_PrinterInfo1), 2,
+                      sizeof(struct spoolss_PrinterInfo1), num_msgs,
                       (ndr_push_flags_fn_t)ndr_push_spoolss_PrinterInfo1);
 
-       *count = 2;
-
        return WERR_OK;
 }
 
@@ -58,22 +59,27 @@ static WERROR spoolss_EnumPrinters(struct dcesrv_call_state *dce_call, TALLOC_CT
        struct ndr_push *ndr;
        void *spoolss_ctx;
        WERROR result;
+       struct ldb_message **msgs;
+       int ret;
 
        spoolss_ctx = spoolssdb_connect();
        if (spoolss_ctx == NULL)
                return WERR_NOMEM;
 
+       ret = spoolssdb_search(spoolss_ctx, mem_ctx, NULL, &msgs, NULL,
+                              "(&(objectclass=printer))");
+       
        ndr = ndr_push_init();
 
+       r->out.count = 0;
+       *r->out.buf_size = 0;
+
        switch(r->in.level) {
        case 1:
-               result = spoolss_EnumPrinters1(
-                       mem_ctx, spoolss_ctx, ndr, &r->out.count);
+               result = spoolss_EnumPrinters1(mem_ctx, msgs, ret, ndr);
                break;
        default:
                r->out.buffer = NULL;
-               *r->out.buf_size = 0;
-               r->out.count = 0;
                result = WERR_INVALID_PARAM;
                goto done;
        }
index f4180af0efce67d709d11f8dcdfcea9c346a9ef6..94f91b4f1609d23ed46a94d9bf8b1e745649bac4 100644 (file)
@@ -87,3 +87,25 @@ void spoolssdb_close(void *ctx)
        spoolss_ctx->ldb = NULL;
        free(spoolss_ctx);
 }
+
+/*
+  search the db for the specified attributes - varargs variant
+*/
+int spoolssdb_search(void *ctx,
+                TALLOC_CTX *mem_ctx, 
+                const char *basedn,
+                struct ldb_message ***res,
+                const char * const *attrs,
+                const char *format, ...) _PRINTF_ATTRIBUTE(6,7)
+{
+       struct spoolssdb_context *spoolss_ctx = ctx;
+       va_list ap;
+       int count;
+
+       va_start(ap, format);
+       count = gendb_search_v(spoolss_ctx->ldb, mem_ctx, basedn, res, attrs, format, ap);
+       va_end(ap);
+
+       return count;
+}
+