The branch, v3-0-test has been updated
       via  bfc99dcfe6f592477b8f62adbb1e1a7baec65dcd (commit)
      from  20c499dada296ffe5ee533730316a8ec963c6284 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-0-test


- Log -----------------------------------------------------------------
commit bfc99dcfe6f592477b8f62adbb1e1a7baec65dcd
Author: Jeremy Allison <[EMAIL PROTECTED]>
Date:   Fri Apr 4 11:14:15 2008 -0700

    Fix bug #5372. With a large CUPS installation with a remote server, 
contacting
    the server when searching for a name for the location and comment fields can
    take so much time the client times out. When searching for a name we don't
    use these fields anyway, so add a function get_a_printer_search() which
    doesn't contact the CUPS server.
    Jeremy.

-----------------------------------------------------------------------

Summary of changes:
 source/printing/nt_printing.c      |   42 +++++++++++++++++++++++++++++------
 source/rpc_server/srv_spoolss_nt.c |    7 +++++-
 2 files changed, 40 insertions(+), 9 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/printing/nt_printing.c b/source/printing/nt_printing.c
index 34f46c4..4356cd9 100644
--- a/source/printing/nt_printing.c
+++ b/source/printing/nt_printing.c
@@ -3743,7 +3743,11 @@ static void map_to_os2_driver(fstring drivername)
 /****************************************************************************
  Get a default printer info 2 struct.
 ****************************************************************************/
-static WERROR get_a_printer_2_default(NT_PRINTER_INFO_LEVEL_2 *info, const 
char *servername, const char* sharename)
+
+static WERROR get_a_printer_2_default(NT_PRINTER_INFO_LEVEL_2 *info,
+                                       const char *servername,
+                                       const char* sharename,
+                                       BOOL get_loc_com)
 {
        int snum = lp_servicenumber(sharename);
 
@@ -3770,7 +3774,7 @@ static WERROR 
get_a_printer_2_default(NT_PRINTER_INFO_LEVEL_2 *info, const char
        fstrcpy(info->datatype, "RAW");
 
 #ifdef HAVE_CUPS
-       if ( (enum printing_types)lp_printing(snum) == PRINT_CUPS ) {           
+       if (get_loc_com && (enum printing_types)lp_printing(snum) == PRINT_CUPS 
) {             
                /* Pull the location and comment strings from cups if we don't
                   already have one */
                if ( !strlen(info->location) || !strlen(info->comment) )
@@ -3819,7 +3823,11 @@ fail:
 
 /****************************************************************************
 ****************************************************************************/
-static WERROR get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 *info, const char 
*servername, const char *sharename)
+
+static WERROR get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 *info,
+                               const char *servername,
+                               const char *sharename,
+                               BOOL get_loc_com)
 {
        int len = 0;
        int snum = lp_servicenumber(sharename);
@@ -3831,7 +3839,8 @@ static WERROR get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 
*info, const char *servern
 
        dbuf = tdb_fetch(tdb_printers, kbuf);
        if (!dbuf.dptr) {
-               return get_a_printer_2_default(info, servername, sharename);
+               return get_a_printer_2_default(info, servername,
+                               sharename, get_loc_com);
        }
 
        len += tdb_unpack(dbuf.dptr+len, dbuf.dsize-len, 
"dddddddddddfffffPfffff",
@@ -3874,7 +3883,7 @@ static WERROR get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 
*info, const char *servern
        fstrcpy(info->printername, printername);
 
 #ifdef HAVE_CUPS
-       if ( (enum printing_types)lp_printing(snum) == PRINT_CUPS ) {           
+       if (get_loc_com && (enum printing_types)lp_printing(snum) == PRINT_CUPS 
) {             
                /* Pull the location and comment strings from cups if we don't
                   already have one */
                if ( !strlen(info->location) || !strlen(info->comment) )
@@ -4448,8 +4457,8 @@ WERROR save_driver_init(NT_PRINTER_INFO_LEVEL *printer, 
uint32 level, uint8 *dat
 
 ****************************************************************************/
 
-WERROR get_a_printer( Printer_entry *print_hnd, NT_PRINTER_INFO_LEVEL 
**pp_printer, uint32 level, 
-                       const char *sharename)
+static WERROR get_a_printer_internal( Printer_entry *print_hnd, 
NT_PRINTER_INFO_LEVEL **pp_printer, uint32 level, 
+                       const char *sharename, BOOL get_loc_com)
 {
        WERROR result;
        fstring servername;
@@ -4477,7 +4486,10 @@ WERROR get_a_printer( Printer_entry *print_hnd, 
NT_PRINTER_INFO_LEVEL **pp_print
                                                    sizeof(servername)-1 );
                        }
 
-                       result = get_a_printer_2( (*pp_printer)->info_2, 
servername, sharename );
+                       result = get_a_printer_2( (*pp_printer)->info_2,
+                                       servername,
+                                       sharename,
+                                       get_loc_com);
        
                        
                        /* we have a new printer now.  Save it with this handle 
*/
@@ -4501,6 +4513,20 @@ WERROR get_a_printer( Printer_entry *print_hnd, 
NT_PRINTER_INFO_LEVEL **pp_print
        return WERR_OK;
 }
 
+WERROR get_a_printer( Printer_entry *print_hnd, NT_PRINTER_INFO_LEVEL 
**pp_printer, uint32 level, 
+                       const char *sharename)
+{
+       return get_a_printer_internal(print_hnd, pp_printer, level,
+                                       sharename, True);
+}
+
+WERROR get_a_printer_search( Printer_entry *print_hnd, NT_PRINTER_INFO_LEVEL 
**pp_printer, uint32 level, 
+                       const char *sharename)
+{
+       return get_a_printer_internal(print_hnd, pp_printer, level,
+                                       sharename, False);
+}
+
 /****************************************************************************
  Deletes a NT_PRINTER_INFO_LEVEL struct.
 ****************************************************************************/
diff --git a/source/rpc_server/srv_spoolss_nt.c 
b/source/rpc_server/srv_spoolss_nt.c
index 0bc7a39..40ad81a 100644
--- a/source/rpc_server/srv_spoolss_nt.c
+++ b/source/rpc_server/srv_spoolss_nt.c
@@ -510,7 +510,12 @@ static BOOL set_printer_hnd_name(Printer_entry *Printer, 
char *handlename)
                fstrcpy(sname, lp_servicename(snum));
 
                printer = NULL;
-               result = get_a_printer( NULL, &printer, 2, sname );
+
+               /* This call doesn't fill in the location or comment from
+                * a CUPS server for efficiency with large numbers of printers.
+                * JRA.
+                */
+               result = get_a_printer_search( NULL, &printer, 2, sname );
                if ( !W_ERROR_IS_OK(result) ) {
                        DEBUG(0,("set_printer_hnd_name: failed to lookup 
printer [%s] -- result [%s]\n",
                                sname, dos_errstr(result)));


-- 
Samba Shared Repository

Reply via email to