summaryrefslogtreecommitdiff
path: root/source3/rpc_server
diff options
context:
space:
mode:
authorGünther Deschner <gd@samba.org>2009-03-20 15:44:31 +0100
committerGünther Deschner <gd@samba.org>2009-03-20 17:20:33 +0100
commit95f2913c7de2ac69421911ec2cb0fcbb8c4e8e93 (patch)
tree0ca74c16c5aa979bcb07a20165c8db56bbf40b46 /source3/rpc_server
parent5a388115a944a425a774d7ec98260b7595998ee1 (diff)
downloadsamba-95f2913c7de2ac69421911ec2cb0fcbb8c4e8e93.tar.gz
samba-95f2913c7de2ac69421911ec2cb0fcbb8c4e8e93.tar.bz2
samba-95f2913c7de2ac69421911ec2cb0fcbb8c4e8e93.zip
s3-spoolss: add enum_all_printers_info_level().
Guenther
Diffstat (limited to 'source3/rpc_server')
-rw-r--r--source3/rpc_server/srv_spoolss_nt.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c
index 01438fc7d6..6c8c942c05 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -4204,6 +4204,83 @@ static bool snum_is_shared_printer(int snum)
Spoolss_enumprinters.
********************************************************************/
+static WERROR enum_all_printers_info_level(TALLOC_CTX *mem_ctx,
+ uint32_t level,
+ uint32_t flags,
+ union spoolss_PrinterInfo **info_p,
+ uint32_t *count_p)
+{
+ int snum;
+ int n_services = lp_numservices();
+ union spoolss_PrinterInfo *info = NULL;
+ uint32_t count = 0;
+ WERROR result = WERR_OK;
+
+ *count_p = 0;
+ *info_p = NULL;
+
+ for (snum = 0; snum < n_services; snum++) {
+
+ NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
+
+ if (!snum_is_shared_printer(snum)) {
+ continue;
+ }
+
+ DEBUG(4,("Found a printer in smb.conf: %s[%x]\n",
+ lp_servicename(snum), snum));
+
+ info = TALLOC_REALLOC_ARRAY(mem_ctx, info,
+ union spoolss_PrinterInfo,
+ count + 1);
+ if (!info) {
+ result = WERR_NOMEM;
+ goto out;
+ }
+
+ result = get_a_printer(NULL, &ntprinter, 2,
+ lp_const_servicename(snum));
+ if (!W_ERROR_IS_OK(result)) {
+ goto out;
+ }
+
+ switch (level) {
+ case 1:
+ result = construct_printer_info1(info, ntprinter, flags,
+ &info[count].info1, snum);
+ break;
+ case 2:
+ result = construct_printer_info2(info, ntprinter,
+ &info[count].info2, snum);
+ break;
+ default:
+ result = WERR_UNKNOWN_LEVEL;
+ free_a_printer(&ntprinter, 2);
+ goto out;
+ }
+
+ free_a_printer(&ntprinter, 2);
+ if (!W_ERROR_IS_OK(result)) {
+ goto out;
+ }
+
+ count++;
+ }
+
+ *count_p = count;
+ *info_p = info;
+
+ out:
+ if (!W_ERROR_IS_OK(result)) {
+ TALLOC_FREE(info);
+ return result;
+ }
+
+ *info_p = info;
+
+ return WERR_OK;
+}
+
static WERROR enum_all_printers_info_1(TALLOC_CTX *mem_ctx,
uint32_t flags,
union spoolss_PrinterInfo **info_p,