/*
- * "$Id: subscriptions.c 7824 2008-08-01 21:11:55Z mike $"
+ * "$Id: subscriptions.c 10996 2013-05-29 11:51:34Z msweet $"
*
- * Subscription routines for the Common UNIX Printing System (CUPS) scheduler.
+ * Subscription routines for the CUPS scheduler.
*
- * Copyright 2007-2009 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
temp->time = time(NULL);
temp->attrs = ippNew();
temp->job = job;
- temp->dest = dest;
+
+ if (dest)
+ temp->dest = dest;
+ else if (job)
+ temp->dest = dest = cupsdFindPrinter(job->dest);
/*
* Add common event notification attributes...
"notify-charset", NULL, "utf-8");
ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_LANGUAGE,
- "notify-natural-langugage", NULL, "en-US");
+ "notify-natural-language", NULL, "en-US");
ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER,
"notify-subscription-id", sub->id);
cupsd_subscription_t *sub, /* I - Subscription object */
int update) /* I - 1 = update subscriptions.conf */
{
- int i; /* Looping var */
-
-
/*
* Close the pipe to the notifier as needed...
*/
cupsdClearString(&(sub->owner));
cupsdClearString(&(sub->recipient));
- if (sub->events)
- {
- for (i = 0; i < sub->num_events; i ++)
- cupsd_delete_event(sub->events[i]);
-
- free(sub->events);
- }
+ cupsArrayDelete(sub->events);
free(sub);
*/
snprintf(line, sizeof(line), "%s/subscriptions.conf", ServerRoot);
- if ((fp = cupsFileOpen(line, "r")) == NULL)
- {
- if (errno != ENOENT)
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "LoadAllSubscriptions: Unable to open %s - %s", line,
- strerror(errno));
+ if ((fp = cupsdOpenConfFile(line)) == NULL)
return;
- }
/*
* Read all of the lines from the file...
while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum))
{
- if (!strcasecmp(line, "NextSubscriptionId") && value)
+ if (!_cups_strcasecmp(line, "NextSubscriptionId") && value)
{
/*
* NextSubscriptionId NNN
if (i >= NextSubscriptionId && i > 0)
NextSubscriptionId = i;
}
- else if (!strcasecmp(line, "<Subscription"))
+ else if (!_cups_strcasecmp(line, "<Subscription"))
{
/*
* <Subscription #>
break;
}
}
- else if (!strcasecmp(line, "</Subscription>"))
+ else if (!_cups_strcasecmp(line, "</Subscription>"))
{
if (!sub)
{
"Syntax error on line %d of subscriptions.conf.",
linenum);
}
- else if (!strcasecmp(line, "Events"))
+ else if (!_cups_strcasecmp(line, "Events"))
{
/*
* Events name
value = valueptr;
}
}
- else if (!strcasecmp(line, "Owner"))
+ else if (!_cups_strcasecmp(line, "Owner"))
{
/*
* Owner
break;
}
}
- else if (!strcasecmp(line, "Recipient"))
+ else if (!_cups_strcasecmp(line, "Recipient"))
{
/*
* Recipient uri
break;
}
}
- else if (!strcasecmp(line, "JobId"))
+ else if (!_cups_strcasecmp(line, "JobId"))
{
/*
* JobId #
break;
}
}
- else if (!strcasecmp(line, "PrinterName"))
+ else if (!_cups_strcasecmp(line, "PrinterName"))
{
/*
* PrinterName name
break;
}
}
- else if (!strcasecmp(line, "UserData"))
+ else if (!_cups_strcasecmp(line, "UserData"))
{
/*
* UserData encoded-string
break;
}
}
- else if (!strcasecmp(line, "LeaseDuration"))
+ else if (!_cups_strcasecmp(line, "LeaseDuration"))
{
/*
* LeaseDuration #
break;
}
}
- else if (!strcasecmp(line, "Interval"))
+ else if (!_cups_strcasecmp(line, "Interval"))
{
/*
* Interval #
break;
}
}
- else if (!strcasecmp(line, "ExpirationTime"))
+ else if (!_cups_strcasecmp(line, "ExpirationTime"))
{
/*
* ExpirationTime #
break;
}
}
- else if (!strcasecmp(line, "NextEventId"))
+ else if (!_cups_strcasecmp(line, "NextEventId"))
{
/*
* NextEventId #
{
int i; /* Looping var */
cups_file_t *fp; /* subscriptions.conf file */
- char temp[1024]; /* Temporary string */
- char backup[1024]; /* subscriptions.conf.O file */
+ char filename[1024], /* subscriptions.conf filename */
+ temp[1024]; /* Temporary string */
cupsd_subscription_t *sub; /* Current subscription */
time_t curtime; /* Current time */
struct tm *curdate; /* Current date */
* Create the subscriptions.conf file...
*/
- snprintf(temp, sizeof(temp), "%s/subscriptions.conf", ServerRoot);
- snprintf(backup, sizeof(backup), "%s/subscriptions.conf.O", ServerRoot);
+ snprintf(filename, sizeof(filename), "%s/subscriptions.conf", ServerRoot);
- if (rename(temp, backup))
- {
- if (errno != ENOENT)
- cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to backup subscriptions.conf - %s",
- strerror(errno));
- }
-
- if ((fp = cupsFileOpen(temp, "w")) == NULL)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to save subscriptions.conf - %s",
- strerror(errno));
-
- if (rename(backup, temp))
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to restore subscriptions.conf - %s",
- strerror(errno));
+ if ((fp = cupsdCreateConfFile(filename, ConfigFilePerm)) == NULL)
return;
- }
- else
- cupsdLogMessage(CUPSD_LOG_INFO, "Saving subscriptions.conf...");
-
- /*
- * Restrict access to the file...
- */
- fchown(cupsFileNumber(fp), getuid(), Group);
- fchmod(cupsFileNumber(fp), ConfigFilePerm);
+ cupsdLogMessage(CUPSD_LOG_INFO, "Saving subscriptions.conf...");
/*
* Write a small header to the file...
cupsFilePuts(fp, "</Subscription>\n");
}
- cupsFileClose(fp);
+ cupsdCloseCreatedConfFile(fp, filename);
}
if (!sub->events)
{
- sub->events = calloc(MaxEvents, sizeof(cupsd_event_t *));
+ sub->events = cupsArrayNew3((cups_array_func_t)NULL, NULL,
+ (cups_ahash_func_t)NULL, 0,
+ (cups_acopy_func_t)NULL,
+ (cups_afree_func_t)cupsd_delete_event);
if (!sub->events)
{
* Purge an old event as needed...
*/
- if (sub->num_events >= MaxEvents)
+ if (cupsArrayCount(sub->events) >= MaxEvents)
{
/*
* Purge the oldest event in the cache...
*/
- cupsd_delete_event(sub->events[0]);
+ cupsArrayRemove(sub->events, cupsArrayFirst(sub->events));
- sub->num_events --;
sub->first_event_id ++;
-
- memmove(sub->events, sub->events + 1,
- sub->num_events * sizeof(cupsd_event_t *));
}
/*
* event cache limit, we don't need to check for overflow here...
*/
- sub->events[sub->num_events] = event;
- sub->num_events ++;
+ cupsArrayAdd(sub->events, event);
/*
* Deliver the event...
*/
if (cupsdStartProcess(command, argv, envp, fds[0], -1, NotifierPipes[1],
- -1, -1, 0, DefaultProfile, 0, &pid) < 0)
+ -1, -1, 0, DefaultProfile, NULL, &pid) < 0)
{
/*
* Error - can't fork!
/*
- * End of "$Id: subscriptions.c 7824 2008-08-01 21:11:55Z mike $".
+ * End of "$Id: subscriptions.c 10996 2013-05-29 11:51:34Z msweet $".
*/