--- /dev/null
+diff -up cups-1.4.3/backend/snmp-supplies.c.snmp-quirks cups-1.4.3/backend/snmp-supplies.c
+--- cups-1.4.3/backend/snmp-supplies.c.snmp-quirks 2009-11-20 01:27:57.000000000 +0000
++++ cups-1.4.3/backend/snmp-supplies.c 2010-06-09 16:27:05.515019804 +0100
+@@ -38,6 +38,13 @@
+
+
+ /*
++ * Printer quirks...
++ */
++
++#define QUIRK_CAPACITY (1<<0)
++
++
++/*
+ * Local structures...
+ */
+
+@@ -57,6 +64,12 @@ typedef struct /**** Printer state ta
+ const char *keyword; /* IPP printer-state-reasons keyword */
+ } backend_state_t;
+
++typedef struct /**** Quirk names table ****/
++{
++ int bit; /* Quirk bit */
++ const char *keyword; /* cupsSNMPQuirks keyword */
++} quirk_name_t;
++
+
+ /*
+ * Local globals...
+@@ -68,6 +81,7 @@ static int current_state = -1;
+ static int charset = -1; /* Character set for supply names */
+ static int num_supplies = 0;
+ /* Number of supplies found */
++static int quirks = 0; /* Printer quirks */
+ static backend_supplies_t supplies[CUPS_MAX_SUPPLIES];
+ /* Supply information */
+
+@@ -153,6 +167,15 @@ static const backend_state_t const print
+ { CUPS_TC_outputFull, "output-area-full-warning" }
+ };
+
++static const quirk_name_t const quirk_names[] =
++ {
++ /*
++ * The prtMarkerSuppliesLevel values are
++ * percentages, not levels relative to the
++ * stated capacity.
++ */
++ { QUIRK_CAPACITY, "capacity" }
++ };
+
+ /*
+ * Local functions...
+@@ -208,6 +231,9 @@ backendSNMPSupplies(
+ if (i)
+ *ptr++ = ',';
+
++ if (quirks & QUIRK_CAPACITY)
++ supplies[i].max_capacity = 100;
++
+ if (supplies[i].max_capacity > 0)
+ sprintf(ptr, "%d", 100 * supplies[i].level / supplies[i].max_capacity);
+ else
+@@ -305,6 +331,7 @@ backend_init_supplies(
+ http_addr_t *addr) /* I - Printer address */
+ {
+ int i, /* Looping var */
++ len, /* Quirk name length */
+ type; /* Current marker type */
+ cups_file_t *cachefile; /* Cache file */
+ const char *cachedir; /* CUPS_CACHEDIR value */
+@@ -366,6 +393,7 @@ backend_init_supplies(
+ current_state = -1;
+ num_supplies = -1;
+ charset = -1;
++ quirks = 0;
+
+ memset(supplies, 0, sizeof(supplies));
+
+@@ -381,6 +409,34 @@ backend_init_supplies(
+ return;
+ }
+
++ if (ppd &&
++ (ppdattr = ppdFindAttr(ppd, "cupsSNMPQuirks", NULL)) != NULL &&
++ ppdattr->value)
++ {
++ ptr = ppdattr->value;
++ while (*ptr != '\0')
++ {
++ /*
++ * Match keyword against quirk_names table.
++ */
++
++ for (i = 0; i < sizeof (quirk_names) / sizeof (quirk_names[0]); i++)
++ {
++ len = strlen (quirk_names[i].keyword);
++ if (!strncmp (ptr, quirk_names[i].keyword, len) &&
++ (ptr[len] == '\0' || ptr[len] == ' '))
++ quirks |= quirk_names[i].bit;
++ }
++
++ /*
++ * Advance to next keyword.
++ */
++
++ ptr += strcspn (ptr, " ");
++ ptr += strspn (ptr, " ");
++ }
++ }
++
+ ppdClose(ppd);
+
+ /*