=== modified file 'cups/ipp.c' --- cups/ipp.c 2009-01-22 22:25:42 +0000 +++ cups/ipp.c 2009-01-28 21:47:34 +0000 @@ -988,6 +988,100 @@ http->blocking || http->used != 0, NULL, ipp)); } +/* + * 'ippFilterPrinters()' - Filter printer list based on environment variables + */ +ipp_state_t /* O - Current state */ +ippFilterPrinters(ipp_t *ipp) /* I - IPP data */ +{ + char *env_printer_list = NULL; + char *result_printer_list; + char delim_printers[] = ","; + char **printer_list_array; + char *default_printer_env; + int printer_list_size = 0; + ipp_attribute_t *filtertmpattr; + ipp_attribute_t *filtertmpattr2; + ipp_attribute_t **prevattr = NULL; + int i = 0; + int found = 0; + + /* + * First we create an array from PRINTER and PRINTER_LIST + */ + if(getenv("PRINTER") != NULL) { + default_printer_env = getenv("PRINTER"); + printer_list_size++; + } else { + default_printer_env = (char *)malloc(sizeof(char)); + default_printer_env = ""; + } + + env_printer_list = strdup(getenv("PRINTER_LIST")); + result_printer_list = strtok(env_printer_list, delim_printers); + while(result_printer_list) { + if(default_printer_env && strcasecmp(result_printer_list, default_printer_env) != 0) + printer_list_size++; + result_printer_list = strtok( NULL, delim_printers); + } + + printer_list_array = (char **)malloc(printer_list_size * sizeof(char *)); + + env_printer_list = strdup(getenv("PRINTER_LIST")); + + result_printer_list = strtok(env_printer_list, delim_printers); + while(result_printer_list) { + /* + * Don't add the default printer if it's defined + */ + if(strcasecmp(result_printer_list, default_printer_env) != 0) { + printer_list_array[i] = (char *)malloc(sizeof(result_printer_list)); + printer_list_array[i++] = result_printer_list; + } + result_printer_list = strtok( NULL, delim_printers); + } + + if(strcasecmp(default_printer_env, "") != 0) + printer_list_array[printer_list_size-1] = default_printer_env; + + /* + * for filtertmpattr : + * if next == printer_name + * if next.value == printer-to-remove + * if first + * first_attr = next.next + * else + * prev.next = next.next + * else + * prev = filtertmpattr + */ + for (filtertmpattr = ipp->attrs; filtertmpattr != NULL && filtertmpattr->next != NULL; + filtertmpattr = filtertmpattr->next) { + if ((filtertmpattr->next->name != NULL) && + (filtertmpattr->next->value_tag == IPP_TAG_NAME) && + (strcasecmp(filtertmpattr->next->name, "printer-name") == 0)) + { + for(i = 0; i < printer_list_size; i++) { + if (printer_list_array[i] && filtertmpattr->next->values[0].string.text && (strcasecmp(filtertmpattr->next->values[0].string.text, printer_list_array[i]) == 0)) { + found = 1; + prevattr = &(filtertmpattr->next); + filtertmpattr2 = *prevattr; + } + } + if(found == 0) { + if(prevattr) { + filtertmpattr2 = *prevattr; + filtertmpattr2->next = filtertmpattr->next->next; + } else { + ipp->attrs = filtertmpattr->next->next; + } + } + found = 0; + } + } + return 0; +} + /* * 'ippReadFile()' - Read data for an IPP message from a file. @@ -1117,6 +1211,8 @@ */ DEBUG_puts("ippReadIO: IPP_TAG_END!"); + if(getenv("PRINTER_LIST")) + ippFilterPrinters(ipp); ipp->state = IPP_DATA; break;