s3-printing: Add new printers to registry.
authorBjörn Baumbach <bb@sernet.de>
Tue, 7 Feb 2012 10:41:54 +0000 (11:41 +0100)
committerAndreas Schneider <asn@cryptomilk.org>
Thu, 9 Feb 2012 15:39:04 +0000 (16:39 +0100)
This fixes bug #8554, #8612 and #8748.

Pair-Programmed-With: Stefan Metzmacher <metze@samba.org>

Autobuild-User: Andreas Schneider <asn@cryptomilk.org>
Autobuild-Date: Thu Feb  9 16:39:04 CET 2012 on sn-devel-104

source3/include/nt_printing.h
source3/printing/nt_printing.c
source3/smbd/server_reload.c

index 4735c4e5df3fa5fc9beffcd3b288f833aa1b99f2..08a21615dbae59b260e358c3d6fa25f66b0ea8fa 100644 (file)
@@ -176,5 +176,9 @@ void nt_printer_remove(TALLOC_CTX *mem_ctx,
                        const struct auth_session_info *server_info,
                        struct messaging_context *msg_ctx,
                        const char *printer);
+void nt_printer_add(TALLOC_CTX *mem_ctx,
+                   const struct auth_session_info *server_info,
+                   struct messaging_context *msg_ctx,
+                   const char *printer);
 
 #endif /* NT_PRINTING_H_ */
index 7fc55c3098b71372e09a82b3034fbd5c8bb1a6b0..92aa320b718c0b42af35a28b73451479225a507a 100644 (file)
@@ -1845,7 +1845,22 @@ void nt_printer_remove(TALLOC_CTX *mem_ctx,
        result = winreg_delete_printer_key_internal(mem_ctx, session_info, msg_ctx,
                                           printer, "");
        if (!W_ERROR_IS_OK(result)) {
-               DEBUG(0, ("nt_printer_remove: failed to remove printer %s",
-                         printer));
+               DEBUG(0, ("nt_printer_remove: failed to remove printer %s: "
+               "%s\n", printer, win_errstr(result)));
+       }
+}
+
+void nt_printer_add(TALLOC_CTX *mem_ctx,
+                   const struct auth_session_info *session_info,
+                   struct messaging_context *msg_ctx,
+                   const char *printer)
+{
+       WERROR result;
+
+       result = winreg_create_printer_internal(mem_ctx, session_info, msg_ctx,
+                                               printer);
+       if (!W_ERROR_IS_OK(result)) {
+               DEBUG(0, ("nt_printer_add: failed to add printer %s: %s\n",
+                         printer, win_errstr(result)));
        }
 }
index f15f80e13fadfa3fe8a8a2dafbf3d900c67d1ad4..6d4b8765d85008619220f0099125d879061660f0 100644 (file)
@@ -50,14 +50,19 @@ void delete_and_reload_printers(struct tevent_context *ev,
 {
        struct auth_session_info *session_info = NULL;
        struct spoolss_PrinterInfo2 *pinfo2 = NULL;
+       int n_services;
+       int pnum;
        int snum;
-       int n_services = lp_numservices();
-       int pnum = lp_servicenumber(PRINTERS_NAME);
        const char *pname;
+       const char *sname;
        NTSTATUS status;
-       bool skip = false;
 
-       SMB_ASSERT(pcap_cache_loaded());
+       /* Get pcap printers updated */
+       load_printers(ev, msg_ctx);
+
+       n_services = lp_numservices();
+       pnum = lp_servicenumber(PRINTERS_NAME);
+
        DEBUG(10, ("reloading printer services from pcap cache\n"));
 
        status = make_session_info_system(talloc_tos(), &session_info);
@@ -66,18 +71,29 @@ void delete_and_reload_printers(struct tevent_context *ev,
                          "Could not create system session_info\n"));
                /* can't remove stale printers before we
                 * are fully initilized */
-               skip = true;
+               return;
        }
 
-       /* remove stale printers */
-       for (snum = 0; skip == false && snum < n_services; snum++) {
-               /* avoid removing PRINTERS_NAME or non-autoloaded printers */
-               if (snum == pnum || !(lp_snum_ok(snum) && lp_print_ok(snum) &&
-                                     lp_autoloaded(snum)))
+       /*
+        * Add default config for printers added to smb.conf file and remove
+        * stale printers
+        */
+       for (snum = 0; snum < n_services; snum++) {
+               /* avoid removing PRINTERS_NAME */
+               if (snum == pnum) {
+                       continue;
+               }
+
+               /* skip no-printer services */
+               if (!(lp_snum_ok(snum) && lp_print_ok(snum))) {
                        continue;
+               }
 
+               sname = lp_const_servicename(snum);
                pname = lp_printername(snum);
-               if (!pcap_printername_ok(pname)) {
+
+               /* check printer, but avoid removing non-autoloaded printers */
+               if (!pcap_printername_ok(pname) && lp_autoloaded(snum)) {
                        DEBUG(3, ("removing stale printer %s\n", pname));
 
                        if (is_printer_published(session_info, session_info,
@@ -94,9 +110,15 @@ void delete_and_reload_printers(struct tevent_context *ev,
                        nt_printer_remove(session_info, session_info, msg_ctx,
                                          pname);
                        lp_killservice(snum);
+               } else {
+                       DEBUG(8, ("Adding default registry entry for printer "
+                                 "[%s], if it doesn't exist.\n", sname));
+                       nt_printer_add(session_info, session_info, msg_ctx,
+                                      sname);
                }
        }
 
+       /* Make sure deleted printers are gone */
        load_printers(ev, msg_ctx);
 
        TALLOC_FREE(session_info);