Imported from gentoo:
https://bugs.gentoo.org/show_bug.cgi?id=428672

diff -Naur hplip-3.12.6_old/prnt/cupsext/cupsext.c hplip-3.12.6/prnt/cupsext/cupsext.c
--- hplip-3.12.6_old/prnt/cupsext/cupsext.c	2012-08-04 09:18:18.388330038 +0200
+++ hplip-3.12.6/prnt/cupsext/cupsext.c	2012-08-04 09:18:27.855181327 +0200
@@ -87,6 +87,46 @@
 #define PY_SSIZE_T_MIN INT_MIN
 #endif
 
+#if (CUPS_VERSION_MAJOR > 1) || (CUPS_VERSION_MINOR > 5)
+#define HAVE_CUPS_1_6 1
+#endif
+
+#ifndef HAVE_CUPS_1_6
+#define ippGetCount(attr)     attr->num_values
+#define ippGetGroupTag(attr)  attr->group_tag
+#define ippGetValueTag(attr)  attr->value_tag
+#define ippGetName(attr)      attr->name
+#define ippGetBoolean(attr, element) attr->values[element].boolean
+#define ippGetInteger(attr, element) attr->values[element].integer
+#define ippGetStatusCode(ipp) ipp->request.status.status_code
+#define ippGetString(attr, element, language) attr->values[element].string.text
+
+static ipp_attribute_t * ippFirstAttribute( ipp_t *ipp )
+{
+    if (!ipp)
+        return (NULL);
+    return (ipp->current = ipp->attrs);
+}
+
+static ipp_attribute_t * ippNextAttribute( ipp_t *ipp )
+{
+    if (!ipp || !ipp->current)
+        return (NULL);
+    return (ipp->current = ipp->current->next);
+}
+
+static int ippSetOperation( ipp_t *ipp, ipp_op_t op )
+{
+    ipp->request.op.operation_id = op;
+    return (1);
+}
+
+static int ippSetRequestId( ipp_t *ipp, int request_id )
+{
+    ipp->request.any.request_id = request_id;
+    return (1);
+}
+#endif
 
 int g_num_options = 0;
 cups_option_t * g_options;
@@ -333,8 +373,8 @@
     request = ippNew();
     language = cupsLangDefault();
 
-    request->request.op.operation_id = CUPS_GET_PRINTERS;
-    request->request.any.request_id = 1;
+    ippSetOperation( request, CUPS_GET_PRINTERS );
+    ippSetRequestId ( request, 1);
 
     ippAddString( request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
                   "attributes-charset", NULL, cupsLangEncoding( language ) );
@@ -378,10 +418,10 @@
         ipp_pstate_t state;
         int i = 0;
 
-        for ( attr = response->attrs; attr != NULL; attr = attr->next )
+        for ( attr = ippFirstAttribute( response ); attr != NULL; attr = ippNextAttribute( response ) )
         {
-            while ( attr != NULL && attr->group_tag != IPP_TAG_PRINTER )
-                attr = attr->next;
+            while ( attr != NULL && ippGetGroupTag( attr ) != IPP_TAG_PRINTER )
+                attr = ippNextAttribute( response );
 
             if ( attr == NULL )
                 break;
@@ -390,41 +430,41 @@
             state = IPP_PRINTER_IDLE;
             accepting = 0;
 
-            while ( attr != NULL && attr->group_tag == IPP_TAG_PRINTER )
+            while ( attr != NULL && ippGetGroupTag( attr ) == IPP_TAG_PRINTER )
             {
-                if ( strcmp( attr->name, "printer-name" ) == 0 &&
-                        attr->value_tag == IPP_TAG_NAME )
-                    name = attr->values[ 0 ].string.text;
-
-                else if ( strcmp( attr->name, "device-uri" ) == 0 &&
-                        attr->value_tag == IPP_TAG_URI )
-                    device_uri = attr->values[ 0 ].string.text;
-
-                else if ( strcmp( attr->name, "printer-uri-supported" ) == 0 &&
-                        attr->value_tag == IPP_TAG_URI )
-                    printer_uri = attr->values[ 0 ].string.text;
-
-                else if ( strcmp( attr->name, "printer-info" ) == 0 &&
-                        attr->value_tag == IPP_TAG_TEXT )
-                    info = attr->values[ 0 ].string.text;
-
-                else if ( strcmp( attr->name, "printer-location" ) == 0 &&
-                        attr->value_tag == IPP_TAG_TEXT )
-                    location = attr->values[ 0 ].string.text;
-
-                else if ( strcmp( attr->name, "printer-make-and-model" ) == 0 &&
-                        attr->value_tag == IPP_TAG_TEXT )
-                    make_model = attr->values[ 0 ].string.text;
-
-                else if ( strcmp( attr->name, "printer-state" ) == 0 &&
-                        attr->value_tag == IPP_TAG_ENUM )
-                    state = ( ipp_pstate_t ) attr->values[ 0 ].integer;
-
-                else if (!strcmp(attr->name, "printer-is-accepting-jobs") &&
-                        attr->value_tag == IPP_TAG_BOOLEAN)
-                    accepting = attr->values[ 0 ].boolean;
+                if ( strcmp( ippGetName( attr ), "printer-name" ) == 0 &&
+                        ippGetValueTag( attr ) == IPP_TAG_NAME )
+                    name = ippGetString( attr, 0, NULL );
+
+                else if ( strcmp( ippGetName( attr ), "device-uri" ) == 0 &&
+                        ippGetValueTag( attr ) == IPP_TAG_URI )
+                    device_uri = ippGetString( attr, 0, NULL );
+
+                else if ( strcmp( ippGetName( attr ), "printer-uri-supported" ) == 0 &&
+                        ippGetValueTag( attr ) == IPP_TAG_URI )
+                    printer_uri = ippGetString( attr, 0, NULL );
+
+                else if ( strcmp( ippGetName( attr ), "printer-info" ) == 0 &&
+                        ippGetValueTag( attr ) == IPP_TAG_TEXT )
+                    info = ippGetString( attr, 0, NULL );
+
+                else if ( strcmp( ippGetName( attr ), "printer-location" ) == 0 &&
+                        ippGetValueTag( attr ) == IPP_TAG_TEXT )
+                    location = ippGetString( attr, 0, NULL );
+
+                else if ( strcmp( ippGetName( attr ), "printer-make-and-model" ) == 0 &&
+                        ippGetValueTag( attr ) == IPP_TAG_TEXT )
+                    make_model = ippGetString( attr, 0, NULL );
+
+                else if ( strcmp( ippGetName( attr ), "printer-state" ) == 0 &&
+                        ippGetValueTag( attr ) == IPP_TAG_ENUM )
+                    state = ( ipp_pstate_t ) ippGetInteger( attr, 0 );
+
+                else if (!strcmp(ippGetName( attr ), "printer-is-accepting-jobs") &&
+                        ippGetValueTag( attr ) == IPP_TAG_BOOLEAN)
+                    accepting = ippGetBoolean( attr, 0 );
 
-                attr = attr->next;
+                attr = ippNextAttribute( response );
             }
 
             if ( device_uri == NULL )
@@ -522,8 +562,8 @@
     request = ippNew();
     language = cupsLangDefault();
 
-    request->request.op.operation_id = CUPS_ADD_PRINTER;
-    request->request.any.request_id = 1;
+    ippSetOperation( request, CUPS_ADD_PRINTER );
+    ippSetRequestId ( request, 1 );
 
     ippAddString( request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
                   "attributes-charset", NULL, cupsLangEncoding( language ) );
@@ -568,7 +608,7 @@
     }
     else
     {
-        status = response->request.status.status_code;
+        status = ippGetStatusCode( response );
         //ippDelete( response );
         r = 1;
     }
@@ -631,8 +671,8 @@
        */
     request = ippNew();
 
-    request->request.op.operation_id = CUPS_DELETE_PRINTER;
-    request->request.op.request_id = 1;
+    ippSetOperation( request, CUPS_DELETE_PRINTER );
+    ippSetRequestId ( request, 1 );
 
     language = cupsLangDefault();
 
@@ -650,7 +690,7 @@
      */
     response = cupsDoRequest( http, request, "/admin/" );
 
-    if ( ( response != NULL ) && ( response->request.status.status_code <= IPP_OK_CONFLICT ) )
+    if ( ( response != NULL ) && ( ippGetStatusCode( response ) <= IPP_OK_CONFLICT ) )
     {
         r = 1;
     }
@@ -721,8 +761,8 @@
 
     request = ippNew();
 
-    request->request.op.operation_id = CUPS_SET_DEFAULT;
-    request->request.op.request_id = 1;
+    ippSetOperation( request, CUPS_SET_DEFAULT );
+    ippSetRequestId ( request, 1 );
 
     language = cupsLangDefault();
 
@@ -743,7 +783,7 @@
 
     response = cupsDoRequest( http, request, "/admin/" );
 
-    if ( ( response != NULL ) && ( response->request.status.status_code <= IPP_OK_CONFLICT ) )
+    if ( ( response != NULL ) && ( ippGetStatusCode( response ) <= IPP_OK_CONFLICT ) )
     {
         r = 1;
     }
@@ -797,8 +837,8 @@
 
     request = ippNew();
 
-    request->request.op.operation_id = op;
-    request->request.op.request_id = 1;
+    ippSetOperation( request, op );
+    ippSetRequestId ( request, 1 );
 
     language = cupsLangDefault();
 
@@ -822,7 +862,7 @@
 
     response = cupsDoRequest(http, request, "/admin/");
 
-    if (( response != NULL ) && (response->request.status.status_code <= IPP_OK_CONFLICT))
+    if (( response != NULL ) && (ippGetStatusCode( response ) <= IPP_OK_CONFLICT))
     {
         r = 1;
     }
@@ -837,7 +877,7 @@
     if ( response != NULL )
         ippDelete( response );
 
-    return Py_BuildValue( "i", r );;
+    return Py_BuildValue( "i", r );
 }
 
 
@@ -1116,8 +1156,8 @@
 
     request = ippNew();
 
-    request->request.op.operation_id = CUPS_GET_PPDS;
-    request->request.op.request_id   = 1;
+    ippSetOperation( request, CUPS_GET_PPDS );
+    ippSetRequestId ( request, 1 );
 
     language = cupsLangDefault();
 
@@ -1143,43 +1183,43 @@
     if ((response = cupsDoRequest(http, request, "/")) != NULL)
     {
 
-        for (attr = response->attrs; attr; attr = attr->next)
+        for (attr = ippFirstAttribute( response ); attr; attr = ippNextAttribute( response ))
         {
             PyObject *dict;
             char *ppdname = NULL;
 
-            while (attr && attr->group_tag != IPP_TAG_PRINTER)
-                attr = attr->next;
+            while (attr && ippGetGroupTag( attr ) != IPP_TAG_PRINTER)
+                attr = ippNextAttribute( response );
 
             if (!attr)
                 break;
 
             dict = PyDict_New ();
 
-            for (; attr && attr->group_tag == IPP_TAG_PRINTER; attr = attr->next)
+            for (; attr && ippGetGroupTag( attr ) == IPP_TAG_PRINTER; attr = ippNextAttribute( response ))
             {
                 PyObject *val = NULL;
 
-                if (!strcmp (attr->name, "ppd-name") && attr->value_tag == IPP_TAG_NAME)
+                if (!strcmp (ippGetName( attr ), "ppd-name") && ippGetValueTag( attr ) == IPP_TAG_NAME)
                 {
-                    ppdname = attr->values[0].string.text;
+                    ppdname = ippGetString( attr, 0, NULL );
 
                     //sprintf( buf, "print '%s'", ppdname);
                     //PyRun_SimpleString( buf );
                 }
 
-                else if (attr->value_tag == IPP_TAG_TEXT || attr->value_tag == IPP_TAG_NAME || attr->value_tag == IPP_TAG_KEYWORD)
-                //else if ((!strcmp (attr->name, "ppd-natural-language") && attr->value_tag == IPP_TAG_LANGUAGE) ||
-                //    (!strcmp (attr->name, "ppd-make-and-model") && attr->value_tag == IPP_TAG_TEXT) ||
-                //    (!strcmp (attr->name, "ppd-make") && attr->value_tag == IPP_TAG_TEXT) ||
-                //    (!strcmp (attr->name, "ppd-device-id") && attr->value_tag == IPP_TAG_TEXT))
+                else if (ippGetValueTag( attr ) == IPP_TAG_TEXT || ippGetValueTag( attr ) == IPP_TAG_NAME || ippGetValueTag( attr ) == IPP_TAG_KEYWORD)
+                //else if ((!strcmp (ippGetName( attr ), "ppd-natural-language") && ippGetValueTag( attr ) == IPP_TAG_LANGUAGE) ||
+                //    (!strcmp (ippGetName( attr ), "ppd-make-and-model") && ippGetValueTag( attr ) == IPP_TAG_TEXT) ||
+                //    (!strcmp (ippGetName( attr ), "ppd-make") && ippGetValueTag( attr ) == IPP_TAG_TEXT) ||
+                //    (!strcmp (ippGetName( attr ), "ppd-device-id") && ippGetValueTag( attr ) == IPP_TAG_TEXT))
                 {
-                    val = PyObj_from_UTF8(attr->values[0].string.text);
+                    val = PyObj_from_UTF8(ippGetString( attr, 0, NULL ));
                 }
 
                 if (val)
                 {
-                    PyDict_SetItemString (dict, attr->name, val);
+                    PyDict_SetItemString (dict, ippGetName( attr ), val);
                     Py_DECREF (val);
                 }
             }
diff -Naur hplip-3.12.6_old/scan/sane/hpaio.c hplip-3.12.6/scan/sane/hpaio.c
--- hplip-3.12.6_old/scan/sane/hpaio.c	2012-08-04 09:18:21.458389913 +0200
+++ hplip-3.12.6/scan/sane/hpaio.c	2012-08-04 09:18:27.875181720 +0200
@@ -47,6 +47,43 @@
 #define DEBUG_DECLARE_ONLY
 #include "sanei_debug.h"
 
+#if (CUPS_VERSION_MAJOR > 1) || (CUPS_VERSION_MINOR > 5)
+#define HAVE_CUPS_1_6 1
+#endif
+
+#ifndef HAVE_CUPS_1_6
+#define ippGetGroupTag(attr)  attr->group_tag
+#define ippGetValueTag(attr)  attr->value_tag
+#define ippGetName(attr)      attr->name
+#define ippGetString(attr, element, language) attr->values[element].string.text
+
+static ipp_attribute_t * ippFirstAttribute( ipp_t *ipp )
+{
+    if (!ipp)
+        return (NULL);
+    return (ipp->current = ipp->attrs);
+}
+
+static ipp_attribute_t * ippNextAttribute( ipp_t *ipp )
+{
+    if (!ipp || !ipp->current)
+        return (NULL);
+    return (ipp->current = ipp->current->next);
+}
+
+static int ippSetOperation( ipp_t *ipp, ipp_op_t op )
+{
+    ipp->request.op.operation_id = op;
+    return (1);
+}
+
+static int ippSetRequestId( ipp_t *ipp, int request_id )
+{
+    ipp->request.any.request_id = request_id;
+    return (1);
+}
+#endif
+
 static SANE_Device **DeviceList = NULL;
 
 static int AddDeviceList(char *uri, char *model, SANE_Device ***pd)
@@ -186,8 +223,8 @@
    /* Assemble the IPP request */
    request = ippNew();
 
-   request->request.op.operation_id = CUPS_GET_PRINTERS;
-   request->request.any.request_id  = 1;
+   ippSetOperation( request, CUPS_GET_PRINTERS );
+   ippSetRequestId( request, 1 );
 
    ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, "utf-8");
    ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, "en");
@@ -197,20 +234,20 @@
    if ((response = cupsDoRequest(http, request, "/")) == NULL)
       goto bugout;
 
-   for (attr = response->attrs; attr != NULL; attr = attr->next)
+   for (attr = ippFirstAttribute ( response ); attr != NULL; attr = ippNextAttribute( response ))
    {
       /* Skip leading attributes until we hit a printer. */
-      while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER)
-         attr = attr->next;
+      while (attr != NULL && ippGetGroupTag( attr ) != IPP_TAG_PRINTER)
+         attr = ippNextAttribute( response );
 
       if (attr == NULL)
          break;
 
-      while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER)
+      while (attr != NULL && ippGetGroupTag( attr ) == IPP_TAG_PRINTER)
       {
-         if (strcmp(attr->name, "device-uri") == 0 && attr->value_tag == IPP_TAG_URI && AddCupsList(attr->values[0].string.text, printer) == 0)
+         if (strcmp(ippGetName( attr ), "device-uri") == 0 && ippGetValueTag( attr ) == IPP_TAG_URI && AddCupsList(ippGetString( attr, 0, NULL ), printer) == 0)
             cnt++;
-         attr = attr->next;
+         attr = ippNextAttribute( response );
       }
 
       if (attr == NULL)
