printing: Add new parameter "cups timeout".
authorKarolin Seeger <kseeger@samba.org>
Tue, 23 Sep 2008 23:54:05 +0000 (16:54 -0700)
committerKarolin Seeger <kseeger@samba.org>
Tue, 23 Sep 2008 23:57:58 +0000 (16:57 -0700)
The default timeout for connections to CUPS servers is set
to 5 minutes in the CUPS libraries. The smbd hangs on startup
until the timeout is reached if the CUPS server is unreachable.
This parameter makes the timeout configurable. The default value
is set to 30 seconds.

Karolin

docs-xml/smbdotconf/printing/cupstimeout.xml [new file with mode: 0644]
source3/include/printing.h
source3/include/proto.h
source3/param/loadparm.c
source3/printing/print_cups.c

diff --git a/docs-xml/smbdotconf/printing/cupstimeout.xml b/docs-xml/smbdotconf/printing/cupstimeout.xml
new file mode 100644 (file)
index 0000000..727ccce
--- /dev/null
@@ -0,0 +1,17 @@
+<samba:parameter name="cups timeout"
+                 context="G"
+                type="integer"
+                print="1"
+                advanced="1"
+                 xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
+
+<description>
+    <para>
+    This parameter determines the timeout for connections to a CUPS server
+    in seconds.
+    </para>
+</description>
+
+<value type="default">30</value>
+<value type="example">cups timeout = 10</value>
+</samba:parameter>
index 2788143cc5435a7793e448361d9c503edc943e6c..04e30a011b73387dc45efd91b605444329fff434 100644 (file)
@@ -77,6 +77,7 @@ extern struct printif iprint_printif;
 #define NEXT_JOBID(j) ((j+1) % PRINT_MAX_JOBID > 0 ? (j+1) % PRINT_MAX_JOBID : 1)
 
 #define MAX_CACHE_VALID_TIME 3600
+#define CUPS_DEFAULT_TIMEOUT 30
 
 #ifndef PRINT_SPOOL_PREFIX
 #define PRINT_SPOOL_PREFIX "smbprn."
index 9ee3fc90717e4d6239a7778d4917bebc934292b1..6eac9d112980d545055d34165a8e35289bb1623a 100644 (file)
@@ -5936,6 +5936,7 @@ const char **lp_svcctl_list(void);
 char *lp_cups_options(int );
 char *lp_cups_server(void);
 char *lp_iprint_server(void);
+int lp_cups_timeout(void);
 const char *lp_ctdbd_socket(void);
 const char **lp_cluster_addresses(void);
 bool lp_clustering(void);
index 60a1fa485842f7c7bc362cd1ea76c3d50251341a..db9e990e64fc07896cf08787ba460a217647b2c9 100644 (file)
@@ -52,6 +52,7 @@
  */
 
 #include "includes.h"
+#include "printing.h"
 
 bool bLoaded = False;
 
@@ -340,6 +341,7 @@ struct global {
        int iKeepalive;
        int iminreceivefile;
        struct param_opt_struct *param_opt;
+       int cups_timeout;
 };
 
 static struct global Globals;
@@ -2594,6 +2596,15 @@ static struct parm_struct parm_table[] = {
                .enum_list      = NULL,
                .flags          = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
        },
+       {
+               .label          = "cups timeout",
+               .type           = P_INTEGER,
+               .p_class        = P_GLOBAL,
+               .ptr            = &Globals.cups_timeout,
+               .special        = NULL,
+               .enum_list      = NULL,
+               .flags          = FLAG_ADVANCED,
+       },
        {
                .label          = "iprint server",
                .type           = P_STRING,
@@ -4794,6 +4805,7 @@ static void init_globals(bool first_time_only)
         * to never expire, though, when this runs out the afs client will 
         * forget the token. Set to 0 to get NEVERDATE.*/
        Globals.iAfsTokenLifetime = 604800;
+       Globals.cups_timeout = CUPS_DEFAULT_TIMEOUT;
 
 /* these parameters are set to defaults that are more appropriate
    for the increasing samba install base:
@@ -5235,6 +5247,7 @@ FN_GLOBAL_LIST(lp_svcctl_list, &Globals.szServicesList)
 FN_LOCAL_STRING(lp_cups_options, szCupsOptions)
 FN_GLOBAL_STRING(lp_cups_server, &Globals.szCupsServer)
 FN_GLOBAL_STRING(lp_iprint_server, &Globals.szIPrintServer)
+FN_GLOBAL_INTEGER(lp_cups_timeout, &Globals.cups_timeout)
 FN_GLOBAL_CONST_STRING(lp_ctdbd_socket, &Globals.ctdbdSocket)
 FN_GLOBAL_LIST(lp_cluster_addresses, &Globals.szClusterAddresses)
 FN_GLOBAL_BOOL(lp_clustering, &Globals.clustering)
index 593c5c7a1f60e06dc6abdf52a5ed3a106f57c890..2b2cf159fb41a8ab541bab92a81b6f71cfc6aafe 100644 (file)
 #include <cups/cups.h>
 #include <cups/language.h>
 
+static SIG_ATOMIC_T gotalarm;
+
+/***************************************************************
+ Signal function to tell us we timed out.
+****************************************************************/
+
+static void gotalarm_sig(void)
+{
+        gotalarm = 1;
+}
+
 extern userdom_struct current_user_info;
 
 /*
@@ -45,7 +56,15 @@ static http_t *cups_connect(void)
        http_t *http;
        char *server, *p;
        int port;
-       
+       int timeout = lp_cups_timeout();
+
+       gotalarm = 0;
+
+       if (timeout) {
+                CatchSignal(SIGALRM, SIGNAL_CAST gotalarm_sig);
+                alarm(timeout);
+        }
+
        if (lp_cups_server() != NULL && strlen(lp_cups_server()) > 0) {
                server = smb_xstrdup(lp_cups_server());
        } else {
@@ -59,15 +78,18 @@ static http_t *cups_connect(void)
        } else {
                port = ippPort();
        }
-       
+
        DEBUG(10, ("connecting to cups server %s:%d\n",
                   server, port));
 
-       if ((http = httpConnect(server, port)) == NULL) {
-               DEBUG(0,("Unable to connect to CUPS server %s:%d - %s\n", 
+       http = httpConnect(server, port);
+
+       CatchSignal(SIGALRM, SIGNAL_CAST SIG_IGN);
+        alarm(0);
+
+       if (http == NULL) {
+               DEBUG(0,("Unable to connect to CUPS server %s:%d - %s\n",
                         server, port, strerror(errno)));
-               SAFE_FREE(server);
-               return NULL;
        }
 
        SAFE_FREE(server);