Blame scheduler/testmime.c

Packit 2fc92b
/*
Packit 2fc92b
 * MIME test program for CUPS.
Packit 2fc92b
 *
Packit 2fc92b
 * Copyright 2007-2014 by Apple Inc.
Packit 2fc92b
 * Copyright 1997-2006 by Easy Software Products, all rights reserved.
Packit 2fc92b
 *
Packit 2fc92b
 * These coded instructions, statements, and computer programs are the
Packit 2fc92b
 * property of Apple Inc. and are protected by Federal copyright
Packit 2fc92b
 * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
Packit 2fc92b
 * which should have been included with this file.  If this file is
Packit 2fc92b
 * missing or damaged, see the license at "http://www.cups.org/".
Packit 2fc92b
 */
Packit 2fc92b
Packit 2fc92b
/*
Packit 2fc92b
 * Include necessary headers...
Packit 2fc92b
 */
Packit 2fc92b
Packit 2fc92b
#include <cups/string-private.h>
Packit 2fc92b
#include <cups/dir.h>
Packit 2fc92b
#include <cups/debug-private.h>
Packit 2fc92b
#include <cups/ppd-private.h>
Packit 2fc92b
#include "mime.h"
Packit 2fc92b
Packit 2fc92b
Packit 2fc92b
/*
Packit 2fc92b
 * Local functions...
Packit 2fc92b
 */
Packit 2fc92b
Packit 2fc92b
static void	add_ppd_filter(mime_t *mime, mime_type_t *filtertype,
Packit 2fc92b
		               const char *filter);
Packit 2fc92b
static void	add_ppd_filters(mime_t *mime, ppd_file_t *ppd);
Packit 2fc92b
static void	print_rules(mime_magic_t *rules);
Packit 2fc92b
static void	type_dir(mime_t *mime, const char *dirname);
Packit 2fc92b
Packit 2fc92b
Packit 2fc92b
/*
Packit 2fc92b
 * 'main()' - Main entry for the test program.
Packit 2fc92b
 */
Packit 2fc92b
Packit 2fc92b
int					/* O - Exit status */
Packit 2fc92b
main(int  argc,				/* I - Number of command-line args */
Packit 2fc92b
     char *argv[])			/* I - Command-line arguments */
Packit 2fc92b
{
Packit 2fc92b
  int		i;			/* Looping vars */
Packit 2fc92b
  const char	*filter_path;		/* Filter path */
Packit 2fc92b
  char		super[MIME_MAX_SUPER],	/* Super-type name */
Packit 2fc92b
		type[MIME_MAX_TYPE];	/* Type name */
Packit 2fc92b
  int		compression;		/* Compression of file */
Packit 2fc92b
  int		cost;			/* Cost of filters */
Packit 2fc92b
  mime_t	*mime;			/* MIME database */
Packit 2fc92b
  mime_type_t	*src,			/* Source type */
Packit 2fc92b
		*dst;			/* Destination type */
Packit 2fc92b
  struct stat	srcinfo;		/* Source information */
Packit 2fc92b
  ppd_file_t	*ppd;			/* PPD file */
Packit 2fc92b
  cups_array_t	*filters;		/* Filters for the file */
Packit 2fc92b
  mime_filter_t	*filter;		/* Current filter */
Packit 2fc92b
Packit 2fc92b
Packit 2fc92b
  mime        = NULL;
Packit 2fc92b
  src         = NULL;
Packit 2fc92b
  dst         = NULL;
Packit 2fc92b
  ppd         = NULL;
Packit 2fc92b
  filter_path = "../filter:" CUPS_SERVERBIN "/filter";
Packit 2fc92b
Packit 2fc92b
  srcinfo.st_size = 0;
Packit 2fc92b
Packit 2fc92b
  for (i = 1; i < argc; i ++)
Packit 2fc92b
    if (!strcmp(argv[i], "-d"))
Packit 2fc92b
    {
Packit 2fc92b
      i ++;
Packit 2fc92b
Packit 2fc92b
      if (i < argc)
Packit 2fc92b
      {
Packit 2fc92b
        mime = mimeLoad(argv[i], filter_path);
Packit 2fc92b
Packit 2fc92b
	if (ppd)
Packit 2fc92b
	  add_ppd_filters(mime, ppd);
Packit 2fc92b
      }
Packit 2fc92b
    }
Packit 2fc92b
    else if (!strcmp(argv[i], "-f"))
Packit 2fc92b
    {
Packit 2fc92b
      i ++;
Packit 2fc92b
Packit 2fc92b
      if (i < argc)
Packit 2fc92b
        filter_path = argv[i];
Packit 2fc92b
    }
Packit 2fc92b
    else if (!strcmp(argv[i], "-p"))
Packit 2fc92b
    {
Packit 2fc92b
      i ++;
Packit 2fc92b
Packit 2fc92b
      if (i < argc)
Packit 2fc92b
      {
Packit 2fc92b
        ppd = ppdOpenFile(argv[i]);
Packit 2fc92b
Packit 2fc92b
	if (mime)
Packit 2fc92b
	  add_ppd_filters(mime, ppd);
Packit 2fc92b
      }
Packit 2fc92b
    }
Packit 2fc92b
    else if (!src)
Packit 2fc92b
    {
Packit 2fc92b
      if (!mime)
Packit 2fc92b
	mime = mimeLoad("../conf", filter_path);
Packit 2fc92b
Packit 2fc92b
      if (ppd)
Packit 2fc92b
        add_ppd_filters(mime, ppd);
Packit 2fc92b
Packit 2fc92b
      src = mimeFileType(mime, argv[i], NULL, &compression);
Packit 2fc92b
      stat(argv[i], &srcinfo);
Packit 2fc92b
Packit 2fc92b
      if (src)
Packit 2fc92b
	printf("%s: %s/%s%s\n", argv[i], src->super, src->type,
Packit 2fc92b
	       compression ? " (gzipped)" : "");
Packit 2fc92b
      else if ((src = mimeType(mime, "application", "octet-stream")) != NULL)
Packit 2fc92b
	printf("%s: application/octet-stream\n", argv[i]);
Packit 2fc92b
      else
Packit 2fc92b
      {
Packit 2fc92b
	printf("%s: unknown\n", argv[i]);
Packit 2fc92b
	if (mime)
Packit 2fc92b
	  mimeDelete(mime);
Packit 2fc92b
	return (1);
Packit 2fc92b
      }
Packit 2fc92b
    }
Packit 2fc92b
    else
Packit 2fc92b
    {
Packit 2fc92b
      sscanf(argv[i], "%15[^/]/%255s", super, type);
Packit 2fc92b
      dst = mimeType(mime, super, type);
Packit 2fc92b
Packit 2fc92b
      filters = mimeFilter2(mime, src, (size_t)srcinfo.st_size, dst, &cost);
Packit 2fc92b
Packit 2fc92b
      if (!filters)
Packit 2fc92b
      {
Packit 2fc92b
	printf("No filters to convert from %s/%s to %s.\n", src->super,
Packit 2fc92b
	       src->type, argv[i]);
Packit 2fc92b
      }
Packit 2fc92b
      else
Packit 2fc92b
      {
Packit 2fc92b
        int first = 1;			/* First filter shown? */
Packit 2fc92b
Packit 2fc92b
        printf("Filter cost = %d\n", cost);
Packit 2fc92b
Packit 2fc92b
        for (filter = (mime_filter_t *)cupsArrayFirst(filters);
Packit 2fc92b
	     filter;
Packit 2fc92b
	     filter = (mime_filter_t *)cupsArrayNext(filters))
Packit 2fc92b
	{
Packit 2fc92b
	  if (!strcmp(filter->filter, "-"))
Packit 2fc92b
	    continue;
Packit 2fc92b
Packit 2fc92b
          if (first)
Packit 2fc92b
	  {
Packit 2fc92b
	    first = 0;
Packit 2fc92b
	    fputs(filter->filter, stdout);
Packit 2fc92b
	  }
Packit 2fc92b
	  else
Packit 2fc92b
	    printf(" | %s", filter->filter);
Packit 2fc92b
	}
Packit 2fc92b
Packit 2fc92b
        putchar('\n');
Packit 2fc92b
Packit 2fc92b
        cupsArrayDelete(filters);
Packit 2fc92b
      }
Packit 2fc92b
    }
Packit 2fc92b
Packit 2fc92b
  if (!mime)
Packit 2fc92b
  {
Packit 2fc92b
    mime = mimeLoad("../conf", filter_path);
Packit 2fc92b
    if (ppd)
Packit 2fc92b
      add_ppd_filters(mime, ppd);
Packit 2fc92b
  }
Packit 2fc92b
Packit 2fc92b
  if (!src)
Packit 2fc92b
  {
Packit 2fc92b
    puts("MIME database types:");
Packit 2fc92b
    for (src = mimeFirstType(mime); src; src = mimeNextType(mime))
Packit 2fc92b
    {
Packit 2fc92b
      printf("\t%s/%s (%d):\n", src->super, src->type, src->priority);
Packit 2fc92b
      print_rules(src->rules);
Packit 2fc92b
      puts("");
Packit 2fc92b
    }
Packit 2fc92b
Packit 2fc92b
    puts("");
Packit 2fc92b
Packit 2fc92b
    puts("MIME database filters:");
Packit 2fc92b
    for (filter = mimeFirstFilter(mime); filter; filter = mimeNextFilter(mime))
Packit 2fc92b
      printf("\t%s/%s to %s/%s: %s (%d)\n",
Packit 2fc92b
             filter->src->super, filter->src->type,
Packit 2fc92b
	     filter->dst->super, filter->dst->type,
Packit 2fc92b
	     filter->filter, filter->cost);
Packit 2fc92b
Packit 2fc92b
    type_dir(mime, "../doc");
Packit 2fc92b
  }
Packit 2fc92b
Packit 2fc92b
  return (0);
Packit 2fc92b
}
Packit 2fc92b
Packit 2fc92b
Packit 2fc92b
/*
Packit 2fc92b
 * 'add_printer_filter()' - Add a printer filter from a PPD.
Packit 2fc92b
 */
Packit 2fc92b
Packit 2fc92b
static void
Packit 2fc92b
add_ppd_filter(mime_t      *mime,	/* I - MIME database */
Packit 2fc92b
               mime_type_t *filtertype,	/* I - Filter or prefilter MIME type */
Packit 2fc92b
	       const char  *filter)	/* I - Filter to add */
Packit 2fc92b
{
Packit 2fc92b
  char		super[MIME_MAX_SUPER],	/* Super-type for filter */
Packit 2fc92b
		type[MIME_MAX_TYPE],	/* Type for filter */
Packit 2fc92b
		dsuper[MIME_MAX_SUPER],	/* Destination super-type for filter */
Packit 2fc92b
		dtype[MIME_MAX_TYPE],	/* Destination type for filter */
Packit 2fc92b
		dest[MIME_MAX_SUPER + MIME_MAX_TYPE + 2],
Packit 2fc92b
					/* Destination super/type */
Packit 2fc92b
		program[1024];		/* Program/filter name */
Packit 2fc92b
  int		cost;			/* Cost of filter */
Packit 2fc92b
  size_t	maxsize = 0;		/* Maximum supported file size */
Packit 2fc92b
  mime_type_t	*temptype,		/* MIME type looping var */
Packit 2fc92b
		*desttype;		/* Destination MIME type */
Packit 2fc92b
  mime_filter_t	*filterptr;		/* MIME filter */
Packit 2fc92b
Packit 2fc92b
Packit 2fc92b
  DEBUG_printf(("add_ppd_filter(mime=%p, filtertype=%p(%s/%s), filter=\"%s\")",
Packit 2fc92b
                mime, filtertype, filtertype->super, filtertype->type, filter));
Packit 2fc92b
Packit 2fc92b
 /*
Packit 2fc92b
  * Parse the filter string; it should be in one of the following formats:
Packit 2fc92b
  *
Packit 2fc92b
  *     source/type cost program
Packit 2fc92b
  *     source/type cost maxsize(nnnn) program
Packit 2fc92b
  *     source/type dest/type cost program
Packit 2fc92b
  *     source/type dest/type cost maxsize(nnnn) program
Packit 2fc92b
  */
Packit 2fc92b
Packit 2fc92b
  if (sscanf(filter, "%15[^/]/%255s%*[ \t]%15[^/]/%255s%d%*[ \t]%1023[^\n]",
Packit 2fc92b
             super, type, dsuper, dtype, &cost, program) == 6)
Packit 2fc92b
  {
Packit 2fc92b
    snprintf(dest, sizeof(dest), "test/%s/%s", dsuper, dtype);
Packit 2fc92b
Packit 2fc92b
    if ((desttype = mimeType(mime, "printer", dest)) == NULL)
Packit 2fc92b
      desttype = mimeAddType(mime, "printer", dest);
Packit 2fc92b
  }
Packit 2fc92b
  else
Packit 2fc92b
  {
Packit 2fc92b
    if (sscanf(filter, "%15[^/]/%255s%d%*[ \t]%1023[^\n]", super, type, &cost,
Packit 2fc92b
               program) == 4)
Packit 2fc92b
    {
Packit 2fc92b
      desttype = filtertype;
Packit 2fc92b
    }
Packit 2fc92b
    else
Packit 2fc92b
    {
Packit 2fc92b
      printf("testmime: Invalid filter string \"%s\".\n", filter);
Packit 2fc92b
      return;
Packit 2fc92b
    }
Packit 2fc92b
  }
Packit 2fc92b
Packit 2fc92b
  if (!strncmp(program, "maxsize(", 8))
Packit 2fc92b
  {
Packit 2fc92b
    char	*ptr;			/* Pointer into maxsize(nnnn) program */
Packit 2fc92b
Packit 2fc92b
    maxsize = (size_t)strtoll(program + 8, &ptr, 10);
Packit 2fc92b
Packit 2fc92b
    if (*ptr != ')')
Packit 2fc92b
    {
Packit 2fc92b
      printf("testmime: Invalid filter string \"%s\".\n", filter);
Packit 2fc92b
      return;
Packit 2fc92b
    }
Packit 2fc92b
Packit 2fc92b
    ptr ++;
Packit 2fc92b
    while (_cups_isspace(*ptr))
Packit 2fc92b
      ptr ++;
Packit 2fc92b
Packit 2fc92b
    _cups_strcpy(program, ptr);
Packit 2fc92b
  }
Packit 2fc92b
Packit 2fc92b
 /*
Packit 2fc92b
  * Add the filter to the MIME database, supporting wildcards as needed...
Packit 2fc92b
  */
Packit 2fc92b
Packit 2fc92b
  for (temptype = mimeFirstType(mime);
Packit 2fc92b
       temptype;
Packit 2fc92b
       temptype = mimeNextType(mime))
Packit 2fc92b
    if (((super[0] == '*' && _cups_strcasecmp(temptype->super, "printer")) ||
Packit 2fc92b
         !_cups_strcasecmp(temptype->super, super)) &&
Packit 2fc92b
        (type[0] == '*' || !_cups_strcasecmp(temptype->type, type)))
Packit 2fc92b
    {
Packit 2fc92b
      if (desttype != filtertype)
Packit 2fc92b
      {
Packit 2fc92b
        DEBUG_printf(("add_ppd_filter: Adding filter %s/%s %s/%s %d %s",
Packit 2fc92b
		      temptype->super, temptype->type, desttype->super,
Packit 2fc92b
		      desttype->type, cost, program));
Packit 2fc92b
        filterptr = mimeAddFilter(mime, temptype, desttype, cost, program);
Packit 2fc92b
Packit 2fc92b
        if (!mimeFilterLookup(mime, desttype, filtertype))
Packit 2fc92b
        {
Packit 2fc92b
          DEBUG_printf(("add_printer_filter: Adding filter %s/%s %s/%s 0 -",
Packit 2fc92b
	                desttype->super, desttype->type, filtertype->super,
Packit 2fc92b
	                filtertype->type));
Packit 2fc92b
          mimeAddFilter(mime, desttype, filtertype, 0, "-");
Packit 2fc92b
        }
Packit 2fc92b
      }
Packit 2fc92b
      else
Packit 2fc92b
      {
Packit 2fc92b
        DEBUG_printf(("add_printer_filter: Adding filter %s/%s %s/%s %d %s",
Packit 2fc92b
		      temptype->super, temptype->type, filtertype->super,
Packit 2fc92b
		      filtertype->type, cost, program));
Packit 2fc92b
        filterptr = mimeAddFilter(mime, temptype, filtertype, cost, program);
Packit 2fc92b
      }
Packit 2fc92b
Packit 2fc92b
      if (filterptr)
Packit 2fc92b
	filterptr->maxsize = maxsize;
Packit 2fc92b
    }
Packit 2fc92b
}
Packit 2fc92b
Packit 2fc92b
Packit 2fc92b
/*
Packit 2fc92b
 * 'add_ppd_filters()' - Add all filters from a PPD.
Packit 2fc92b
 */
Packit 2fc92b
Packit 2fc92b
static void
Packit 2fc92b
add_ppd_filters(mime_t     *mime,	/* I - MIME database */
Packit 2fc92b
                ppd_file_t *ppd)	/* I - PPD file */
Packit 2fc92b
{
Packit 2fc92b
  _ppd_cache_t	*pc;			/* Cache data for PPD */
Packit 2fc92b
  const char	*value;			/* Filter definition value */
Packit 2fc92b
  mime_type_t	*filter,		/* Filter type */
Packit 2fc92b
		*prefilter;		/* Pre-filter type */
Packit 2fc92b
Packit 2fc92b
Packit 2fc92b
  pc = _ppdCacheCreateWithPPD(ppd);
Packit 2fc92b
  if (!pc)
Packit 2fc92b
    return;
Packit 2fc92b
Packit 2fc92b
  filter = mimeAddType(mime, "printer", "test");
Packit 2fc92b
Packit 2fc92b
  if (pc->filters)
Packit 2fc92b
  {
Packit 2fc92b
    for (value = (const char *)cupsArrayFirst(pc->filters);
Packit 2fc92b
         value;
Packit 2fc92b
         value = (const char *)cupsArrayNext(pc->filters))
Packit 2fc92b
      add_ppd_filter(mime, filter, value);
Packit 2fc92b
  }
Packit 2fc92b
  else
Packit 2fc92b
  {
Packit 2fc92b
    add_ppd_filter(mime, filter, "application/vnd.cups-raw 0 -");
Packit 2fc92b
    add_ppd_filter(mime, filter, "application/vnd.cups-postscript 0 -");
Packit 2fc92b
  }
Packit 2fc92b
Packit 2fc92b
  if (pc->prefilters)
Packit 2fc92b
  {
Packit 2fc92b
    prefilter = mimeAddType(mime, "prefilter", "test");
Packit 2fc92b
Packit 2fc92b
    for (value = (const char *)cupsArrayFirst(pc->prefilters);
Packit 2fc92b
         value;
Packit 2fc92b
         value = (const char *)cupsArrayNext(pc->prefilters))
Packit 2fc92b
      add_ppd_filter(mime, prefilter, value);
Packit 2fc92b
  }
Packit 2fc92b
}
Packit 2fc92b
Packit 2fc92b
Packit 2fc92b
/*
Packit 2fc92b
 * 'print_rules()' - Print the rules for a file type...
Packit 2fc92b
 */
Packit 2fc92b
Packit 2fc92b
static void
Packit 2fc92b
print_rules(mime_magic_t *rules)	/* I - Rules to print */
Packit 2fc92b
{
Packit 2fc92b
  int	i;				/* Looping var */
Packit 2fc92b
  static char	indent[255] = "\t";	/* Indentation for rules */
Packit 2fc92b
Packit 2fc92b
Packit 2fc92b
  if (rules == NULL)
Packit 2fc92b
    return;
Packit 2fc92b
Packit 2fc92b
  while (rules != NULL)
Packit 2fc92b
  {
Packit 2fc92b
    printf("%s[%p] ", indent, rules);
Packit 2fc92b
Packit 2fc92b
    if (rules->invert)
Packit 2fc92b
      printf("NOT ");
Packit 2fc92b
Packit 2fc92b
    switch (rules->op)
Packit 2fc92b
    {
Packit 2fc92b
      case MIME_MAGIC_MATCH :
Packit 2fc92b
          printf("match(%s)", rules->value.matchv);
Packit 2fc92b
	  break;
Packit 2fc92b
      case MIME_MAGIC_LOCALE :
Packit 2fc92b
          printf("locale(%s)", rules->value.localev);
Packit 2fc92b
	  break;
Packit 2fc92b
      case MIME_MAGIC_ASCII :
Packit 2fc92b
          printf("ascii(%d,%d)", rules->offset, rules->length);
Packit 2fc92b
	  break;
Packit 2fc92b
      case MIME_MAGIC_PRINTABLE :
Packit 2fc92b
          printf("printable(%d,%d)", rules->offset, rules->length);
Packit 2fc92b
	  break;
Packit 2fc92b
      case MIME_MAGIC_STRING :
Packit 2fc92b
          printf("string(%d,", rules->offset);
Packit 2fc92b
	  for (i = 0; i < rules->length; i ++)
Packit 2fc92b
	    if (rules->value.stringv[i] < ' ' ||
Packit 2fc92b
	        rules->value.stringv[i] > 126)
Packit 2fc92b
	      printf("<%02X>", rules->value.stringv[i]);
Packit 2fc92b
	    else
Packit 2fc92b
	      putchar(rules->value.stringv[i]);
Packit 2fc92b
          putchar(')');
Packit 2fc92b
	  break;
Packit 2fc92b
      case MIME_MAGIC_CHAR :
Packit 2fc92b
          printf("char(%d,%d)", rules->offset, rules->value.charv);
Packit 2fc92b
	  break;
Packit 2fc92b
      case MIME_MAGIC_SHORT :
Packit 2fc92b
          printf("short(%d,%d)", rules->offset, rules->value.shortv);
Packit 2fc92b
	  break;
Packit 2fc92b
      case MIME_MAGIC_INT :
Packit 2fc92b
          printf("int(%d,%d)", rules->offset, rules->value.intv);
Packit 2fc92b
	  break;
Packit 2fc92b
      case MIME_MAGIC_CONTAINS :
Packit 2fc92b
          printf("contains(%d,%d,", rules->offset, rules->region);
Packit 2fc92b
	  for (i = 0; i < rules->length; i ++)
Packit 2fc92b
	    if (rules->value.stringv[i] < ' ' ||
Packit 2fc92b
	        rules->value.stringv[i] > 126)
Packit 2fc92b
	      printf("<%02X>", rules->value.stringv[i]);
Packit 2fc92b
	    else
Packit 2fc92b
	      putchar(rules->value.stringv[i]);
Packit 2fc92b
          putchar(')');
Packit 2fc92b
	  break;
Packit 2fc92b
      default :
Packit 2fc92b
	  break;
Packit 2fc92b
    }
Packit 2fc92b
Packit 2fc92b
    if (rules->child != NULL)
Packit 2fc92b
    {
Packit 2fc92b
      if (rules->op == MIME_MAGIC_OR)
Packit 2fc92b
	puts("OR (");
Packit 2fc92b
      else
Packit 2fc92b
	puts("AND (");
Packit 2fc92b
Packit 2fc92b
      strcat(indent, "\t");
Packit 2fc92b
      print_rules(rules->child);
Packit 2fc92b
      indent[strlen(indent) - 1] = '\0';
Packit 2fc92b
      printf("%s)\n", indent);
Packit 2fc92b
    }
Packit 2fc92b
    else
Packit 2fc92b
      putchar('\n');
Packit 2fc92b
Packit 2fc92b
    rules = rules->next;
Packit 2fc92b
  }
Packit 2fc92b
}
Packit 2fc92b
Packit 2fc92b
Packit 2fc92b
/*
Packit 2fc92b
 * 'type_dir()' - Show the MIME types for a given directory.
Packit 2fc92b
 */
Packit 2fc92b
Packit 2fc92b
static void
Packit 2fc92b
type_dir(mime_t     *mime,		/* I - MIME database */
Packit 2fc92b
         const char *dirname)		/* I - Directory */
Packit 2fc92b
{
Packit 2fc92b
  cups_dir_t	*dir;			/* Directory */
Packit 2fc92b
  cups_dentry_t	*dent;			/* Directory entry */
Packit 2fc92b
  char		filename[1024];		/* File to type */
Packit 2fc92b
  mime_type_t	*filetype;		/* File type */
Packit 2fc92b
  int		compression;		/* Compressed file? */
Packit 2fc92b
  mime_type_t	*pstype;		/* application/vnd.cups-postscript */
Packit 2fc92b
  cups_array_t	*filters;		/* Filters to pstype */
Packit 2fc92b
  mime_filter_t	*filter;		/* Current filter */
Packit 2fc92b
  int		cost;			/* Filter cost */
Packit 2fc92b
Packit 2fc92b
Packit 2fc92b
  dir = cupsDirOpen(dirname);
Packit 2fc92b
  if (!dir)
Packit 2fc92b
    return;
Packit 2fc92b
Packit 2fc92b
  pstype = mimeType(mime, "application", "vnd.cups-postscript");
Packit 2fc92b
Packit 2fc92b
  while ((dent = cupsDirRead(dir)) != NULL)
Packit 2fc92b
  {
Packit 2fc92b
    if (dent->filename[0] == '.')
Packit 2fc92b
      continue;
Packit 2fc92b
Packit 2fc92b
    snprintf(filename, sizeof(filename), "%s/%s", dirname, dent->filename);
Packit 2fc92b
Packit 2fc92b
    if (S_ISDIR(dent->fileinfo.st_mode))
Packit 2fc92b
      type_dir(mime, filename);
Packit 2fc92b
Packit 2fc92b
    if (!S_ISREG(dent->fileinfo.st_mode))
Packit 2fc92b
      continue;
Packit 2fc92b
Packit 2fc92b
    filetype = mimeFileType(mime, filename, NULL, &compression);
Packit 2fc92b
Packit 2fc92b
    if (filetype)
Packit 2fc92b
    {
Packit 2fc92b
      printf("%s: %s/%s%s\n", filename, filetype->super, filetype->type,
Packit 2fc92b
             compression ? " (compressed)" : "");
Packit 2fc92b
Packit 2fc92b
      filters = mimeFilter(mime, filetype, pstype, &cost);
Packit 2fc92b
Packit 2fc92b
      if (!filters)
Packit 2fc92b
	puts("    No filters to convert application/vnd.cups-postscript.");
Packit 2fc92b
      else
Packit 2fc92b
      {
Packit 2fc92b
        printf("    Filter cost = %d\n", cost);
Packit 2fc92b
Packit 2fc92b
        filter = (mime_filter_t *)cupsArrayFirst(filters);
Packit 2fc92b
	printf("    %s", filter->filter);
Packit 2fc92b
Packit 2fc92b
	for (filter = (mime_filter_t *)cupsArrayNext(filters);
Packit 2fc92b
	     filter;
Packit 2fc92b
	     filter = (mime_filter_t *)cupsArrayNext(filters))
Packit 2fc92b
	  printf(" | %s", filter->filter);
Packit 2fc92b
Packit 2fc92b
        putchar('\n');
Packit 2fc92b
Packit 2fc92b
        cupsArrayDelete(filters);
Packit 2fc92b
      }
Packit 2fc92b
    }
Packit 2fc92b
    else
Packit 2fc92b
      printf("%s: unknown%s\n", filename, compression ? " (compressed)" : "");
Packit 2fc92b
  }
Packit 2fc92b
Packit 2fc92b
  cupsDirClose(dir);
Packit 2fc92b
}