/*
- * "$Id: classes.c 7724 2008-07-14 06:06:06Z mike $"
+ * "$Id$"
*
- * Printer class routines for the Common UNIX Printing System (CUPS).
+ * Printer class routines for the CUPS scheduler.
*
- * Copyright 2007-2010 by Apple Inc.
+ * Copyright 2007-2011 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
* cupsdFindClass() - Find the named class.
* cupsdLoadAllClasses() - Load classes from the classes.conf file.
* cupsdSaveAllClasses() - Save classes to the classes.conf file.
- * cupsdUpdateImplicitClasses() - Update the accepting state of implicit
- * classes.
*/
/*
cupsdAddClass(const char *name) /* I - Name of class */
{
cupsd_printer_t *c; /* New class */
+ char uri[1024]; /* Class URI */
/*
c->type = CUPS_PRINTER_CLASS;
- cupsdSetStringf(&c->uri, "ipp://%s:%d/classes/%s", ServerName, RemotePort,
- name);
+ httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
+ ServerName, RemotePort, "/classes/%s", name);
+ cupsdSetString(&c->uri, uri);
+
cupsdSetString(&c->error_policy, "retry-current-job");
}
for (c = (cupsd_printer_t *)cupsArrayFirst(Printers);
c;
c = (cupsd_printer_t *)cupsArrayNext(Printers))
- if (c->type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT))
+ if (c->type & CUPS_PRINTER_CLASS)
changed |= cupsdDeletePrinterFromClass(c, p);
- /*
- * Then clean out any empty implicit classes...
- */
-
- for (c = (cupsd_printer_t *)cupsArrayFirst(ImplicitPrinters);
- c;
- c = (cupsd_printer_t *)cupsArrayNext(ImplicitPrinters))
- if (c->num_printers == 0)
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG, "Deleting implicit class \"%s\"...",
- c->name);
- cupsdDeletePrinter(c, 0);
- changed = 1;
- }
-
return (changed);
}
cupsd_printer_t *c; /* Current class/printer */
- if ((c = cupsdFindDest(name)) != NULL &&
- (c->type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT)))
+ if ((c = cupsdFindDest(name)) != NULL && (c->type & CUPS_PRINTER_CLASS))
return (c);
else
return (NULL);
*/
snprintf(line, sizeof(line), "%s/classes.conf", ServerRoot);
- if ((fp = cupsFileOpen(line, "r")) == NULL)
- {
- if (errno != ENOENT)
- cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to open %s - %s", line,
- strerror(errno));
+ if ((fp = cupsdOpenConfFile(line)) == NULL)
return;
- }
/*
* Read class configurations until we hit EOF...
* Decode the directive...
*/
- if (!strcasecmp(line, "<Class") ||
- !strcasecmp(line, "<DefaultClass"))
+ if (!_cups_strcasecmp(line, "<Class") ||
+ !_cups_strcasecmp(line, "<DefaultClass"))
{
/*
* <Class name> or <DefaultClass name>
p->accepting = 1;
p->state = IPP_PRINTER_IDLE;
- if (!strcasecmp(line, "<DefaultClass"))
+ if (!_cups_strcasecmp(line, "<DefaultClass"))
DefaultPrinter = p;
}
else
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.", linenum);
}
- else if (!strcasecmp(line, "</Class>"))
+ else if (!_cups_strcasecmp(line, "</Class>"))
{
if (p != NULL)
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.", linenum);
}
- else if (!strcasecmp(line, "AuthInfoRequired"))
+ else if (!_cups_strcasecmp(line, "UUID"))
+ {
+ if (value && !strncmp(value, "urn:uuid:", 9))
+ cupsdSetString(&(p->uuid), value);
+ else
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Bad UUID on line %d of classes.conf.", linenum);
+ }
+ else if (!_cups_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"))
+ else if (!_cups_strcasecmp(line, "Info"))
{
if (value)
cupsdSetString(&p->info, value);
}
- else if (!strcasecmp(line, "Location"))
+ else if (!_cups_strcasecmp(line, "Location"))
{
if (value)
cupsdSetString(&p->location, value);
}
- else if (!strcasecmp(line, "Option") && value)
+ else if (!_cups_strcasecmp(line, "Option") && value)
{
/*
* Option name value
&(p->options));
}
}
- else if (!strcasecmp(line, "Printer"))
+ else if (!_cups_strcasecmp(line, "Printer"))
{
if (!value)
{
{
cupsdSetString(&temp->make_model, "Remote Printer on unknown");
- temp->state = IPP_PRINTER_STOPPED;
- temp->type |= CUPS_PRINTER_REMOTE;
- temp->browse_time = 2147483647;
+ temp->state = IPP_PRINTER_STOPPED;
+ temp->type |= CUPS_PRINTER_REMOTE;
cupsdSetString(&temp->location, "Location Unknown");
cupsdSetString(&temp->info, "No Information Available");
if (temp)
cupsdAddPrinterToClass(p, temp);
}
- else if (!strcasecmp(line, "State"))
+ else if (!_cups_strcasecmp(line, "State"))
{
/*
* Set the initial queue state...
*/
- if (!strcasecmp(value, "idle"))
+ if (!_cups_strcasecmp(value, "idle"))
p->state = IPP_PRINTER_IDLE;
- else if (!strcasecmp(value, "stopped"))
+ else if (!_cups_strcasecmp(value, "stopped"))
{
p->state = IPP_PRINTER_STOPPED;
"Syntax error on line %d of classes.conf.",
linenum);
}
- else if (!strcasecmp(line, "StateMessage"))
+ else if (!_cups_strcasecmp(line, "StateMessage"))
{
/*
* Set the initial queue state message...
if (value)
strlcpy(p->state_message, value, sizeof(p->state_message));
}
- else if (!strcasecmp(line, "StateTime"))
+ else if (!_cups_strcasecmp(line, "StateTime"))
{
/*
* Set the state time...
if (value)
p->state_time = atoi(value);
}
- else if (!strcasecmp(line, "Accepting"))
+ else if (!_cups_strcasecmp(line, "Accepting"))
{
/*
* Set the initial accepting state...
*/
if (value &&
- (!strcasecmp(value, "yes") ||
- !strcasecmp(value, "on") ||
- !strcasecmp(value, "true")))
+ (!_cups_strcasecmp(value, "yes") ||
+ !_cups_strcasecmp(value, "on") ||
+ !_cups_strcasecmp(value, "true")))
p->accepting = 1;
else if (value &&
- (!strcasecmp(value, "no") ||
- !strcasecmp(value, "off") ||
- !strcasecmp(value, "false")))
+ (!_cups_strcasecmp(value, "no") ||
+ !_cups_strcasecmp(value, "off") ||
+ !_cups_strcasecmp(value, "false")))
p->accepting = 0;
else
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.",
linenum);
}
- else if (!strcasecmp(line, "Shared"))
+ else if (!_cups_strcasecmp(line, "Shared"))
{
/*
* Set the initial shared state...
*/
if (value &&
- (!strcasecmp(value, "yes") ||
- !strcasecmp(value, "on") ||
- !strcasecmp(value, "true")))
+ (!_cups_strcasecmp(value, "yes") ||
+ !_cups_strcasecmp(value, "on") ||
+ !_cups_strcasecmp(value, "true")))
p->shared = 1;
else if (value &&
- (!strcasecmp(value, "no") ||
- !strcasecmp(value, "off") ||
- !strcasecmp(value, "false")))
+ (!_cups_strcasecmp(value, "no") ||
+ !_cups_strcasecmp(value, "off") ||
+ !_cups_strcasecmp(value, "false")))
p->shared = 0;
else
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.",
linenum);
}
- else if (!strcasecmp(line, "JobSheets"))
+ else if (!_cups_strcasecmp(line, "JobSheets"))
{
/*
* Set the initial job sheets...
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.", linenum);
}
- else if (!strcasecmp(line, "AllowUser"))
+ else if (!_cups_strcasecmp(line, "AllowUser"))
{
if (value)
{
p->deny_users = 0;
- cupsdAddPrinterUser(p, value);
+ cupsdAddString(&(p->users), value);
}
else
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.", linenum);
}
- else if (!strcasecmp(line, "DenyUser"))
+ else if (!_cups_strcasecmp(line, "DenyUser"))
{
if (value)
{
p->deny_users = 1;
- cupsdAddPrinterUser(p, value);
+ cupsdAddString(&(p->users), value);
}
else
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.", linenum);
}
- else if (!strcasecmp(line, "QuotaPeriod"))
+ else if (!_cups_strcasecmp(line, "QuotaPeriod"))
{
if (value)
p->quota_period = atoi(value);
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.", linenum);
}
- else if (!strcasecmp(line, "PageLimit"))
+ else if (!_cups_strcasecmp(line, "PageLimit"))
{
if (value)
p->page_limit = atoi(value);
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.", linenum);
}
- else if (!strcasecmp(line, "KLimit"))
+ else if (!_cups_strcasecmp(line, "KLimit"))
{
if (value)
p->k_limit = atoi(value);
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.", linenum);
}
- else if (!strcasecmp(line, "OpPolicy"))
+ else if (!_cups_strcasecmp(line, "OpPolicy"))
{
if (value)
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"Syntax error on line %d of classes.conf.", linenum);
}
- else if (!strcasecmp(line, "ErrorPolicy"))
+ else if (!_cups_strcasecmp(line, "ErrorPolicy"))
{
if (value)
{
cupsdSaveAllClasses(void)
{
cups_file_t *fp; /* classes.conf file */
- char temp[1024], /* Temporary string */
- backup[1024], /* printers.conf.O file */
- value[2048]; /* Value string */
+ char filename[1024], /* classes.conf filename */
+ temp[1024], /* Temporary string */
+ value[2048], /* Value string */
+ *name; /* Current user name */
cupsd_printer_t *pclass; /* Current printer class */
int i; /* Looping var */
time_t curtime; /* Current time */
* Create the classes.conf file...
*/
- snprintf(temp, sizeof(temp), "%s/classes.conf", ServerRoot);
- snprintf(backup, sizeof(backup), "%s/classes.conf.O", ServerRoot);
-
- if (rename(temp, backup))
- {
- if (errno != ENOENT)
- cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to backup classes.conf - %s",
- strerror(errno));
- }
+ snprintf(filename, sizeof(filename), "%s/classes.conf", ServerRoot);
- if ((fp = cupsFileOpen(temp, "w")) == NULL)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to save classes.conf - %s",
- strerror(errno));
-
- if (rename(backup, temp))
- cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to restore classes.conf - %s",
- strerror(errno));
+ if ((fp = cupsdCreateConfFile(filename, ConfigFilePerm)) == NULL)
return;
- }
- else
- cupsdLogMessage(CUPSD_LOG_INFO, "Saving classes.conf...");
-
- /*
- * Restrict access to the file...
- */
- fchown(cupsFileNumber(fp), RunUser, Group);
- fchmod(cupsFileNumber(fp), 0600);
+ cupsdLogMessage(CUPSD_LOG_INFO, "Saving classes.conf...");
/*
* Write a small header to the file...
*/
if ((pclass->type & CUPS_PRINTER_REMOTE) ||
- (pclass->type & CUPS_PRINTER_IMPLICIT) ||
!(pclass->type & CUPS_PRINTER_CLASS))
continue;
else
cupsFilePrintf(fp, "<Class %s>\n", pclass->name);
+ cupsFilePrintf(fp, "UUID %s\n", pclass->uuid);
+
if (pclass->num_auth_info_required > 0)
{
switch (pclass->num_auth_info_required)
cupsFilePrintf(fp, "PageLimit %d\n", pclass->page_limit);
cupsFilePrintf(fp, "KLimit %d\n", pclass->k_limit);
- for (i = 0; i < pclass->num_users; i ++)
- cupsFilePutConf(fp, pclass->deny_users ? "DenyUser" : "AllowUser",
- pclass->users[i]);
+ for (name = (char *)cupsArrayFirst(pclass->users);
+ name;
+ name = (char *)cupsArrayNext(pclass->users))
+ cupsFilePutConf(fp, pclass->deny_users ? "DenyUser" : "AllowUser", name);
if (pclass->op_policy)
cupsFilePutConf(fp, "OpPolicy", pclass->op_policy);
cupsFilePuts(fp, "</Class>\n");
}
- cupsFileClose(fp);
-}
-
-
-/*
- * 'cupsdUpdateImplicitClasses()' - Update the accepting state of implicit
- * classes.
- */
-
-void
-cupsdUpdateImplicitClasses(void)
-{
- int i; /* Looping var */
- cupsd_printer_t *pclass; /* Current class */
- int accepting; /* printer-is-accepting-jobs value */
-
-
- for (pclass = (cupsd_printer_t *)cupsArrayFirst(ImplicitPrinters);
- pclass;
- pclass = (cupsd_printer_t *)cupsArrayNext(ImplicitPrinters))
- {
- /*
- * Loop through the printers to come up with a composite state...
- */
-
- for (i = 0, accepting = 0; i < pclass->num_printers; i ++)
- if ((accepting = pclass->printers[i]->accepting) != 0)
- break;
-
- pclass->accepting = accepting;
- }
+ cupsdCloseCreatedConfFile(fp, filename);
}
/*
- * End of "$Id: classes.c 7724 2008-07-14 06:06:06Z mike $".
+ * End of "$Id$".
*/