|
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 |
}
|