#include "ipp-var.h"
char *
ippGetTemplateDir(void)
{
const char *datadir;
static char templates[1024] = "";
if (!templates[0])
{
if ((datadir = getenv("CUPS_DATADIR")) == NULL)
datadir = CUPS_DATADIR;
snprintf(templates, sizeof(templates), "%s/templates", datadir);
}
return (templates);
}
void
ippSetServerVersion(void)
{
cgiSetVariable("SERVER_NAME", getenv("SERVER_NAME"));
cgiSetVariable("REMOTE_USER", getenv("REMOTE_USER"));
cgiSetVariable("CUPS_VERSION", CUPS_SVERSION);
}
void
ippSetCGIVars(ipp_t *response,
const char *filter_name,
const char *filter_value)
{
int element;
ipp_attribute_t *attr,
*filter;
int i;
char name[1024],
value[16384],
*valptr;
char method[HTTP_MAX_URI],
username[HTTP_MAX_URI],
hostname[HTTP_MAX_URI],
resource[HTTP_MAX_URI],
uri[HTTP_MAX_URI];
int port;
int ishttps;
const char *server;
struct tm *date;
ippSetServerVersion();
server = getenv("SERVER_NAME");
ishttps = getenv("HTTPS") != NULL;
for (attr = response->attrs;
attr && attr->group_tag == IPP_TAG_OPERATION;
attr = attr->next);
for (element = 0; attr != NULL; attr = attr->next, element ++)
{
if (filter_name)
{
for (filter = attr;
filter != NULL && filter->group_tag != IPP_TAG_ZERO;
filter = filter->next)
if (filter->name && strcmp(filter->name, filter_name) == 0 &&
(filter->value_tag == IPP_TAG_STRING ||
(filter->value_tag >= IPP_TAG_TEXTLANG &&
filter->value_tag <= IPP_TAG_MIMETYPE)) &&
filter->values[0].string.text != NULL &&
strcasecmp(filter->values[0].string.text, filter_value) == 0)
break;
if (!filter)
return;
if (filter->group_tag == IPP_TAG_ZERO)
{
attr = filter;
element --;
continue;
}
}
for (; attr != NULL && attr->group_tag != IPP_TAG_ZERO; attr = attr->next)
{
if (attr->name == NULL)
continue;
for (i = 0; attr->name[i]; i ++)
if (attr->name[i] == '-')
name[i] = '_';
else
name[i] = attr->name[i];
name[i] = '\0';
if (strcmp(name, "job_printer_uri") == 0)
{
if ((valptr = strrchr(attr->values[0].string.text, '/')) == NULL)
valptr = "unknown";
else
valptr ++;
cgiSetArray("job_printer_name", element, valptr);
}
value[0] = '\0';
valptr = value;
for (i = 0; i < attr->num_values; i ++)
{
if (i)
strlcat(valptr, ",", sizeof(value) - (valptr - value));
valptr += strlen(valptr);
switch (attr->value_tag)
{
case IPP_TAG_INTEGER :
case IPP_TAG_ENUM :
if (strncmp(name, "time_at_", 8) == 0)
{
date = localtime((time_t *)&(attr->values[i].integer));
strftime(valptr, sizeof(value) - (valptr - value),
CUPS_STRFTIME_FORMAT, date);
}
else
snprintf(valptr, sizeof(value) - (valptr - value),
"%d", attr->values[i].integer);
break;
case IPP_TAG_BOOLEAN :
snprintf(valptr, sizeof(value) - (valptr - value),
"%d", attr->values[i].boolean);
break;
case IPP_TAG_NOVALUE :
strlcat(valptr, "novalue", sizeof(value) - (valptr - value));
break;
case IPP_TAG_RANGE :
snprintf(valptr, sizeof(value) - (valptr - value),
"%d-%d", attr->values[i].range.lower,
attr->values[i].range.upper);
break;
case IPP_TAG_RESOLUTION :
snprintf(valptr, sizeof(value) - (valptr - value),
"%dx%d%s", attr->values[i].resolution.xres,
attr->values[i].resolution.yres,
attr->values[i].resolution.units == IPP_RES_PER_INCH ?
"dpi" : "dpc");
break;
case IPP_TAG_URI :
if (strchr(attr->values[i].string.text, ':') != NULL)
{
httpSeparate(attr->values[i].string.text, method, username,
hostname, &port, resource);
if (strcmp(method, "ipp") == 0 ||
strcmp(method, "http") == 0)
{
if (strcasecmp(hostname, server) == 0)
{
strlcpy(uri, resource, sizeof(uri));
}
else
{
if (username[0])
snprintf(uri, sizeof(uri), "%s://%s@%s:%d%s",
ishttps ? "https" : "http",
username, hostname, port, resource);
else
snprintf(uri, sizeof(uri), "%s://%s:%d%s",
ishttps ? "https" : "http",
hostname, port, resource);
}
strlcat(valptr, uri, sizeof(value) - (valptr - value));
break;
}
}
case IPP_TAG_STRING :
case IPP_TAG_TEXT :
case IPP_TAG_NAME :
case IPP_TAG_KEYWORD :
case IPP_TAG_CHARSET :
case IPP_TAG_LANGUAGE :
strlcat(valptr, attr->values[i].string.text,
sizeof(value) - (valptr - value));
break;
default :
break;
}
}
cgiSetArray(name, element, value);
}
if (attr == NULL)
break;
}
}