/*
- * "$Id: classes.c 4988 2006-01-26 00:53:00Z mike $"
+ * "$Id: classes.c 7608 2008-05-21 01:37:21Z mike $"
*
* Printer class routines for the Common UNIX Printing System (CUPS).
*
- * Copyright 1997-2005 by Easy Software Products, all rights reserved.
+ * Copyright 2007 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
- * property of Easy Software Products and are protected by Federal
- * copyright law. Distribution and use rights are outlined in the file
- * "LICENSE.txt" which should have been included with this file. If this
- * file is missing or damaged please contact Easy Software Products
- * at:
- *
- * Attn: CUPS Licensing Information
- * Easy Software Products
- * 44141 Airport View Drive, Suite 204
- * Hollywood, Maryland 20636 USA
- *
- * Voice: (301) 373-9600
- * EMail: cups-info@cups.org
- * WWW: http://www.cups.org
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * file is missing or damaged, see the license at "http://www.cups.org/".
*
* Contents:
*
return (NULL);
}
+ if (c->num_printers == 0)
+ return (NULL);
+
+ /*
+ * Make sure that the last printer is also a valid index into the printer
+ * array. If not, reset the last printer to 0...
+ */
+
+ if (c->last_printer >= c->num_printers)
+ c->last_printer = 0;
+
/*
* Loop through the printers in the class and return the first idle
* printer... We keep track of the last printer that we used so that
if ((fp = cupsFileOpen(line, "r")) == NULL)
{
if (errno != ENOENT)
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "cupsdLoadAllClasses: Unable to open %s - %s", line,
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to open %s - %s", line,
strerror(errno));
return;
}
if (p == NULL && value)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "cupsdLoadAllClasses: Loading class %s...", value);
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Loading class %s...", value);
+
+ /*
+ * Since prior classes may have implicitly defined this class,
+ * see if it already exists...
+ */
+
+ if ((p = cupsdFindDest(value)) != NULL)
+ {
+ p->type = CUPS_PRINTER_CLASS;
+ cupsdSetStringf(&p->uri, "ipp://%s:%d/classes/%s", ServerName,
+ LocalPort, value);
+ cupsdSetString(&p->error_policy, "retry-job");
+ }
+ else
+ p = cupsdAddClass(value);
- p = cupsdAddClass(value);
p->accepting = 1;
p->state = IPP_PRINTER_IDLE;
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.", linenum);
- return;
+ break;
}
}
else if (!strcasecmp(line, "</Class>"))
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.", linenum);
- return;
+ break;
}
}
else if (!p)
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.", linenum);
- return;
+ break;
+ }
+ else if (!strcasecmp(line, "AuthInfoRequired"))
+ {
+ if (!cupsdSetAuthInfoRequired(p, value, NULL))
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Bad AuthInfoRequired on line %d of classes.conf.",
+ linenum);
}
else if (!strcasecmp(line, "Info"))
{
if (value)
cupsdSetString(&p->location, value);
}
+ else if (!strcasecmp(line, "Option") && value)
+ {
+ /*
+ * Option name value
+ */
+
+ for (valueptr = value; *valueptr && !isspace(*valueptr & 255); valueptr ++);
+
+ if (!*valueptr)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Syntax error on line %d of classes.conf.", linenum);
+ else
+ {
+ for (; *valueptr && isspace(*valueptr & 255); *valueptr++ = '\0');
+
+ p->num_options = cupsAddOption(value, valueptr, p->num_options,
+ &(p->options));
+ }
+ }
else if (!strcasecmp(line, "Printer"))
{
if (!value)
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.", linenum);
- return;
+ break;
}
else if ((temp = cupsdFindPrinter(value)) == NULL)
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.",
linenum);
- return;
+ break;
}
}
else if (!strcasecmp(line, "StateMessage"))
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.",
linenum);
- return;
+ break;
}
}
else if (!strcasecmp(line, "Shared"))
else
{
cupsdLogMessage(CUPSD_LOG_ERROR,
- "Syntax error on line %d of printers.conf.",
+ "Syntax error on line %d of classes.conf.",
linenum);
- return;
+ break;
}
}
else if (!strcasecmp(line, "JobSheets"))
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.", linenum);
- return;
+ break;
}
}
else if (!strcasecmp(line, "AllowUser"))
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.", linenum);
- return;
+ break;
}
}
else if (!strcasecmp(line, "DenyUser"))
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.", linenum);
- return;
+ break;
}
}
else if (!strcasecmp(line, "QuotaPeriod"))
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.", linenum);
- return;
+ break;
}
}
else if (!strcasecmp(line, "PageLimit"))
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.", linenum);
- return;
+ break;
}
}
else if (!strcasecmp(line, "KLimit"))
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.", linenum);
- return;
+ break;
}
}
else if (!strcasecmp(line, "OpPolicy"))
{
if (value)
- cupsdSetString(&p->op_policy, value);
+ {
+ cupsd_policy_t *pol; /* Policy */
+
+
+ if ((pol = cupsdFindPolicy(value)) != NULL)
+ {
+ cupsdSetString(&p->op_policy, value);
+ p->op_policy_ptr = pol;
+ }
+ else
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Bad policy \"%s\" on line %d of classes.conf",
+ value, linenum);
+ }
else
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.", linenum);
- return;
+ break;
}
}
else if (!strcasecmp(line, "ErrorPolicy"))
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.", linenum);
- return;
+ break;
}
}
else
int i; /* Looping var */
time_t curtime; /* Current time */
struct tm *curdate; /* Current date */
+ cups_option_t *option; /* Current option */
+ const char *ptr; /* Pointer into info/location */
/*
else
cupsFilePrintf(fp, "<Class %s>\n", pclass->name);
+ if (pclass->num_auth_info_required > 0)
+ {
+ cupsFilePrintf(fp, "AuthInfoRequired %s", pclass->auth_info_required[0]);
+ for (i = 1; i < pclass->num_auth_info_required; i ++)
+ cupsFilePrintf(fp, ",%s", pclass->auth_info_required[i]);
+ cupsFilePutChar(fp, '\n');
+ }
+
if (pclass->info)
- cupsFilePrintf(fp, "Info %s\n", pclass->info);
+ {
+ if ((ptr = strchr(pclass->info, '#')) != NULL)
+ {
+ /*
+ * Need to quote the first # in the info string...
+ */
+
+ cupsFilePuts(fp, "Info ");
+ cupsFileWrite(fp, pclass->info, ptr - pclass->info);
+ cupsFilePutChar(fp, '\\');
+ cupsFilePuts(fp, ptr);
+ cupsFilePutChar(fp, '\n');
+ }
+ else
+ cupsFilePrintf(fp, "Info %s\n", pclass->info);
+ }
if (pclass->location)
- cupsFilePrintf(fp, "Location %s\n", pclass->location);
+ {
+ if ((ptr = strchr(pclass->info, '#')) != NULL)
+ {
+ /*
+ * Need to quote the first # in the location string...
+ */
+
+ cupsFilePuts(fp, "Location ");
+ cupsFileWrite(fp, pclass->location, ptr - pclass->location);
+ cupsFilePutChar(fp, '\\');
+ cupsFilePuts(fp, ptr);
+ cupsFilePutChar(fp, '\n');
+ }
+ else
+ cupsFilePrintf(fp, "Location %s\n", pclass->location);
+ }
if (pclass->state == IPP_PRINTER_STOPPED)
{
cupsFilePrintf(fp, "JobSheets %s %s\n", pclass->job_sheets[0],
pclass->job_sheets[1]);
- for (i = 0; i < pclass->num_printers; i ++)
- cupsFilePrintf(fp, "Printer %s\n", pclass->printers[i]->name);
+ for (i = 0; i < pclass->num_users; i ++)
+ {
+ if ((ptr = strchr(pclass->users[i], '#')) != NULL)
+ {
+ /*
+ * Need to quote the first # in the user string...
+ */
+
+ cupsFilePrintf(fp, "%sUser ", pclass->deny_users ? "Deny" : "Allow");
+ cupsFileWrite(fp, pclass->users[i], ptr - pclass->users[i]);
+ cupsFilePutChar(fp, '\\');
+ cupsFilePuts(fp, ptr);
+ cupsFilePutChar(fp, '\n');
+ }
+ else
+ cupsFilePrintf(fp, "%sUser %s\n",
+ pclass->deny_users ? "Deny" : "Allow",
+ pclass->users[i]);
+ }
cupsFilePrintf(fp, "QuotaPeriod %d\n", pclass->quota_period);
cupsFilePrintf(fp, "PageLimit %d\n", pclass->page_limit);
if (pclass->error_policy)
cupsFilePrintf(fp, "ErrorPolicy %s\n", pclass->error_policy);
+ for (i = pclass->num_options, option = pclass->options;
+ i > 0;
+ i --, option ++)
+ cupsFilePrintf(fp, "Option %s %s\n", option->name, option->value);
+
cupsFilePuts(fp, "</Class>\n");
}
/*
- * End of "$Id: classes.c 4988 2006-01-26 00:53:00Z mike $".
+ * End of "$Id: classes.c 7608 2008-05-21 01:37:21Z mike $".
*/