summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Kasik <mkasik@redhat.com>2010-06-03 10:13:17 +0200
committerMatthias Clasen <mclasen@redhat.com>2010-06-10 09:50:59 -0400
commit52c7ad6de3bce82c9cda9ae2b30cb00ef24a122a (patch)
tree3d20b97b619054fbae4909b807701a57989f12ba
parent05dad359e799179903ff6c4c7473b8df59ffe34b (diff)
downloadgdk-pixbuf-52c7ad6de3bce82c9cda9ae2b30cb00ef24a122a.tar.gz
Test connection to all given addresses when printing
Go to the next address given by CUPS if we fail to connect to previous address (#603637). (cherry picked from commit f8ac1231923fe77eb243fe2333e83b03c29c8868)
-rw-r--r--modules/printbackends/cups/gtkcupsutils.c18
-rw-r--r--modules/printbackends/cups/gtkcupsutils.h1
2 files changed, 17 insertions, 2 deletions
diff --git a/modules/printbackends/cups/gtkcupsutils.c b/modules/printbackends/cups/gtkcupsutils.c
index cd97f10ef..1023da09e 100644
--- a/modules/printbackends/cups/gtkcupsutils.c
+++ b/modules/printbackends/cups/gtkcupsutils.c
@@ -1502,6 +1502,7 @@ gtk_cups_connection_test_new (const char *server)
result->socket = -1;
result->current_addr = NULL;
+ result->last_wrong_addr = NULL;
result->at_init = GTK_CUPS_CONNECTION_NOT_AVAILABLE;
result->at_init = gtk_cups_connection_test_get_state (result);
@@ -1540,7 +1541,14 @@ gtk_cups_connection_test_get_state (GtkCupsConnectionTest *test)
{
if (test->socket == -1)
{
- iter = test->addrlist;
+ if (test->last_wrong_addr != NULL && test->last_wrong_addr->next != NULL)
+ iter = test->last_wrong_addr->next;
+ else
+ {
+ test->last_wrong_addr = NULL;
+ iter = test->addrlist;
+ }
+
while (iter)
{
test->socket = socket (iter->addr.addr.sa_family,
@@ -1584,7 +1592,12 @@ gtk_cups_connection_test_get_state (GtkCupsConnectionTest *test)
if (error_code == EALREADY || error_code == EINPROGRESS)
result = GTK_CUPS_CONNECTION_IN_PROGRESS;
else
- result = GTK_CUPS_CONNECTION_NOT_AVAILABLE;
+ {
+ close (test->socket);
+ test->socket = -1;
+ test->last_wrong_addr = test->current_addr;
+ result = GTK_CUPS_CONNECTION_NOT_AVAILABLE;
+ }
}
}
@@ -1605,6 +1618,7 @@ gtk_cups_connection_test_free (GtkCupsConnectionTest *test)
#ifdef HAVE_CUPS_API_1_2
test->current_addr = NULL;
+ test->last_wrong_addr = NULL;
httpAddrFreeList (test->addrlist);
if (test->socket != -1)
{
diff --git a/modules/printbackends/cups/gtkcupsutils.h b/modules/printbackends/cups/gtkcupsutils.h
index ba43f875f..2438b8669 100644
--- a/modules/printbackends/cups/gtkcupsutils.h
+++ b/modules/printbackends/cups/gtkcupsutils.h
@@ -111,6 +111,7 @@ struct _GtkCupsConnectionTest
GtkCupsConnectionState at_init;
http_addrlist_t *addrlist;
http_addrlist_t *current_addr;
+ http_addrlist_t *last_wrong_addr;
gint socket;
#endif
};