diff options
author | Marek Kasik <mkasik@redhat.com> | 2010-06-03 10:13:17 +0200 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2010-06-10 09:50:59 -0400 |
commit | 52c7ad6de3bce82c9cda9ae2b30cb00ef24a122a (patch) | |
tree | 3d20b97b619054fbae4909b807701a57989f12ba | |
parent | 05dad359e799179903ff6c4c7473b8df59ffe34b (diff) | |
download | gdk-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.c | 18 | ||||
-rw-r--r-- | modules/printbackends/cups/gtkcupsutils.h | 1 |
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 }; |