s3-spoolss: Get the printer location from cups.
authorAndreas Schneider <asn@samba.org>
Fri, 13 May 2011 08:28:20 +0000 (10:28 +0200)
committerGünther Deschner <gd@samba.org>
Mon, 16 May 2011 10:54:33 +0000 (12:54 +0200)
Signed-off-by: Günther Deschner <gd@samba.org>
source3/rpc_server/spoolss/srv_spoolss_nt.c

index 711939474c46e1a1310645aa566a56fb946832c9..e03f028c858b35f2d32ab920a5755c88c3ad095f 100644 (file)
@@ -52,6 +52,7 @@
 #include "rpc_server/spoolss/srv_spoolss_nt.h"
 #include "util_tdb.h"
 #include "libsmb/libsmb.h"
+#include "printing/printer_list.h"
 
 /* macros stolen from s4 spoolss server */
 #define SPOOLSS_BUFFER_UNION(fn,info,level) \
@@ -2879,7 +2880,21 @@ static void spoolss_notify_location(struct messaging_context *msg_ctx,
                                    struct spoolss_PrinterInfo2 *pinfo2,
                                    TALLOC_CTX *mem_ctx)
 {
-       SETUP_SPOOLSS_NOTIFY_DATA_STRING(data, pinfo2->location);
+       const char *loc = pinfo2->location;
+       NTSTATUS status;
+
+       status = printer_list_get_printer(mem_ctx,
+                                         pinfo2->sharename,
+                                         NULL,
+                                         &loc,
+                                         NULL);
+       if (NT_STATUS_IS_OK(status)) {
+               if (loc == NULL) {
+                       loc = pinfo2->location;
+               }
+       }
+
+       SETUP_SPOOLSS_NOTIFY_DATA_STRING(data, loc);
 }
 
 /*******************************************************************
@@ -4011,8 +4026,24 @@ static WERROR construct_printer_info2(TALLOC_CTX *mem_ctx,
        }
        W_ERROR_HAVE_NO_MEMORY(r->comment);
 
-       r->location             = talloc_strdup(mem_ctx, info2->location);
+       r->location     = talloc_strdup(mem_ctx, info2->location);
+       if (info2->location[0] == '\0') {
+               const char *loc = NULL;
+               NTSTATUS nt_status;
+
+               nt_status = printer_list_get_printer(mem_ctx,
+                                                    info2->sharename,
+                                                    NULL,
+                                                    &loc,
+                                                    NULL);
+               if (NT_STATUS_IS_OK(nt_status)) {
+                       if (loc != NULL) {
+                               r->location = talloc_strdup(mem_ctx, loc);
+                       }
+               }
+       }
        W_ERROR_HAVE_NO_MEMORY(r->location);
+
        r->sepfile              = talloc_strdup(mem_ctx, info2->sepfile);
        W_ERROR_HAVE_NO_MEMORY(r->sepfile);
        r->printprocessor       = talloc_strdup(mem_ctx, info2->printprocessor);