allow the 'printing' parameter to be set on a per share basis.
authorGerald Carter <jerry@samba.org>
Tue, 2 Mar 2004 14:26:45 +0000 (14:26 +0000)
committerGerald Carter <jerry@samba.org>
Tue, 2 Mar 2004 14:26:45 +0000 (14:26 +0000)
The problem was that the current_printif struct was set during
print_backend_init() based on the 'printcap name'.  So you could
not use cups and then override the setting for a specific printer
by setting 'printing = bsd' (a common setup for pdf generation
print services.

There is a subtle change in behavior in that the print
interface functions are selecting on the basis of lp_printing()
and not lp_printcap_name(), but the new behavior seems more
intuitive IMHO.
(This used to be commit 14de9c065787bd1675021a6cd6555f81ea965f17)

source3/printing/printing.c

index c453eb796c6e7984cb13478979a1719f25c34b8a..1efd9327496b4bda650ee61f659a70810cc571d9 100644 (file)
@@ -24,7 +24,6 @@
 #include "printing.h"
 
 /* Current printer interface */
-static struct printif *current_printif = &generic_printif;
 static BOOL remove_from_jobs_changed(int snum, uint32 jobid);
 
 /* 
@@ -206,12 +205,6 @@ BOOL print_backend_init(void)
 
        close_all_print_db(); /* Don't leave any open. */
 
-       /* select the appropriate printing interface... */
-#ifdef HAVE_CUPS
-       if (strcmp(lp_printcapname(), "cups") == 0)
-               current_printif = &cups_printif;
-#endif /* HAVE_CUPS */
-
        /* do NT print initialization... */
        return nt_printing_init();
 }
@@ -225,6 +218,28 @@ void printing_end(void)
        close_all_print_db(); /* Don't leave any open. */
 }
 
+/****************************************************************************
+ Retrieve the set of printing functions for a given service.  This allows 
+ us to set the printer function table based on the value of the 'printing'
+ service parameter.
+ Use the generic interface as the default and only use cups interface only
+ when asked for (and only when supported)
+****************************************************************************/
+
+static struct printif *get_printer_fns( int snum )
+{
+       struct printif *printer_fns = &generic_printif;
+
+#ifdef HAVE_CUPS
+       if ( lp_printing(snum) == PRINT_CUPS ) {
+               printer_fns = &cups_printif;
+       }
+#endif /* HAVE_CUPS */
+       
+       return printer_fns;
+}
+
 /****************************************************************************
  Useful function to generate a tdb key.
 ****************************************************************************/
@@ -951,6 +966,7 @@ static void print_queue_update(int snum)
        TDB_DATA data, key;
        TDB_DATA jcdata;
        struct tdb_print_db *pdb;
+       struct printif *current_printif = get_printer_fns( snum );
 
        fstrcpy(printer_name, lp_const_servicename(snum));
        pdb = get_print_db_byname(printer_name);
@@ -1448,6 +1464,7 @@ static BOOL print_job_delete1(int snum, uint32 jobid)
 {
        struct printjob *pjob = print_job_find(snum, jobid);
        int result = 0;
+       struct printif *current_printif = get_printer_fns( snum );
 
        if (!pjob)
                return False;
@@ -1589,6 +1606,7 @@ BOOL print_job_pause(struct current_user *user, int snum, uint32 jobid, WERROR *
 {
        struct printjob *pjob = print_job_find(snum, jobid);
        int ret = -1;
+       struct printif *current_printif = get_printer_fns( snum );
        
        if (!pjob || !user) 
                return False;
@@ -1639,6 +1657,7 @@ BOOL print_job_resume(struct current_user *user, int snum, uint32 jobid, WERROR
 {
        struct printjob *pjob = print_job_find(snum, jobid);
        int ret;
+       struct printif *current_printif = get_printer_fns( snum );
        
        if (!pjob || !user)
                return False;
@@ -2040,6 +2059,7 @@ BOOL print_job_end(int snum, uint32 jobid, BOOL normal_close)
        struct printjob *pjob = print_job_find(snum, jobid);
        int ret;
        SMB_STRUCT_STAT sbuf;
+       struct printif *current_printif = get_printer_fns( snum );
 
        if (!pjob)
                return False;
@@ -2296,6 +2316,7 @@ int print_queue_status(int snum,
 BOOL print_queue_pause(struct current_user *user, int snum, WERROR *errcode)
 {
        int ret;
+       struct printif *current_printif = get_printer_fns( snum );
        
        if (!print_access_check(user, snum, PRINTER_ACCESS_ADMINISTER)) {
                *errcode = WERR_ACCESS_DENIED;
@@ -2326,6 +2347,7 @@ BOOL print_queue_pause(struct current_user *user, int snum, WERROR *errcode)
 BOOL print_queue_resume(struct current_user *user, int snum, WERROR *errcode)
 {
        int ret;
+       struct printif *current_printif = get_printer_fns( snum );
 
        if (!print_access_check(user, snum, PRINTER_ACCESS_ADMINISTER)) {
                *errcode = WERR_ACCESS_DENIED;