X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=scheduler%2Fsubscriptions.c;h=db6cfb1ffb22a58061525d1519a993e7d46967b4;hb=08f269f9b90c3dc4a2fdd2ba5656be6a6ac34534;hp=fa7fb4891cbe6379814f26250e629c11a552c4e5;hpb=b19ccc9e271691cc71a08e9968c58f464ebeade5;p=thirdparty%2Fcups.git diff --git a/scheduler/subscriptions.c b/scheduler/subscriptions.c index fa7fb4891..db6cfb1ff 100644 --- a/scheduler/subscriptions.c +++ b/scheduler/subscriptions.c @@ -1,37 +1,16 @@ /* - * "$Id: subscriptions.c 7824 2008-08-01 21:11:55Z mike $" + * "$Id$" * - * Subscription routines for the Common UNIX Printing System (CUPS) scheduler. + * Subscription routines for the CUPS scheduler. * - * Copyright 2007-2008 by Apple Inc. - * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * Copyright 2007-2014 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. * - * These coded instructions, statements, and computer programs are the - * 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: - * - * cupsdAddEvent() - Add an event to the global event cache. - * cupsdAddSubscription() - Add a new subscription object. - * cupsdDeleteAllSubscriptions() - Delete all subscriptions. - * cupsdDeleteSubscription() - Delete a subscription object. - * cupsdEventName() - Return a single event name. - * cupsdEventValue() - Return the event mask value for a name. - * cupsdExpireSubscriptions() - Expire old subscription objects. - * cupsdFindSubscription() - Find a subscription by ID. - * cupsdLoadAllSubscriptions() - Load all subscriptions from the .conf file. - * cupsdSaveAllSubscriptions() - Save all subscriptions to the .conf file. - * cupsdStopAllNotifiers() - Stop all notifier processes. - * cupsd_compare_subscriptions() - Compare two subscriptions. - * cupsd_delete_event() - Delete a single event... - * cupsd_send_dbus() - Send a DBUS notification... - * cupsd_send_notification() - Send a notification for the specified - * event. - * cupsd_start_notifier() - Start a notifier subprocess... - * cupsd_update_notifier() - Read messages from notifiers. + * These coded instructions, statements, and computer programs are the + * 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/". */ /* @@ -146,7 +125,11 @@ cupsdAddEvent( 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... @@ -156,7 +139,7 @@ cupsdAddEvent( "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); @@ -208,7 +191,7 @@ cupsdAddEvent( (const char * const *)dest->reasons); ippAddBoolean(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, - "printer-is-accepting-jobs", dest->accepting); + "printer-is-accepting-jobs", (char)dest->accepting); } if (job) @@ -341,8 +324,56 @@ cupsdAddSubscription( * Limit the number of subscriptions... */ - if (cupsArrayCount(Subscriptions) >= MaxSubscriptions) + if (MaxSubscriptions > 0 && cupsArrayCount(Subscriptions) >= MaxSubscriptions) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdAddSubscription: Reached MaxSubscriptions %d " + "(count=%d)", MaxSubscriptions, + cupsArrayCount(Subscriptions)); return (NULL); + } + + if (MaxSubscriptionsPerJob > 0 && job) + { + int count; /* Number of job subscriptions */ + + for (temp = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions), + count = 0; + temp; + temp = (cupsd_subscription_t *)cupsArrayNext(Subscriptions)) + if (temp->job == job) + count ++; + + if (count >= MaxSubscriptionsPerJob) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdAddSubscription: Reached MaxSubscriptionsPerJob %d " + "for job #%d (count=%d)", MaxSubscriptionsPerJob, + job->id, count); + return (NULL); + } + } + + if (MaxSubscriptionsPerPrinter > 0 && dest) + { + int count; /* Number of printer subscriptions */ + + for (temp = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions), + count = 0; + temp; + temp = (cupsd_subscription_t *)cupsArrayNext(Subscriptions)) + if (temp->dest == dest) + count ++; + + if (count >= MaxSubscriptionsPerPrinter) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdAddSubscription: Reached " + "MaxSubscriptionsPerPrinter %d for %s (count=%d)", + MaxSubscriptionsPerPrinter, dest->name, count); + return (NULL); + } + } /* * Allocate memory for this subscription... @@ -432,9 +463,6 @@ cupsdDeleteSubscription( 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... */ @@ -455,13 +483,7 @@ cupsdDeleteSubscription( 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); @@ -696,14 +718,8 @@ cupsdLoadAllSubscriptions(void) */ 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... @@ -715,7 +731,7 @@ cupsdLoadAllSubscriptions(void) while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) { - if (!strcasecmp(line, "NextSubscriptionId") && value) + if (!_cups_strcasecmp(line, "NextSubscriptionId") && value) { /* * NextSubscriptionId NNN @@ -725,7 +741,7 @@ cupsdLoadAllSubscriptions(void) if (i >= NextSubscriptionId && i > 0) NextSubscriptionId = i; } - else if (!strcasecmp(line, " @@ -744,7 +760,7 @@ cupsdLoadAllSubscriptions(void) break; } } - else if (!strcasecmp(line, "")) + else if (!_cups_strcasecmp(line, "")) { if (!sub) { @@ -765,9 +781,8 @@ cupsdLoadAllSubscriptions(void) cupsdLogMessage(CUPSD_LOG_ERROR, "Syntax error on line %d of subscriptions.conf.", linenum); - break; } - else if (!strcasecmp(line, "Events")) + else if (!_cups_strcasecmp(line, "Events")) { /* * Events name @@ -808,7 +823,7 @@ cupsdLoadAllSubscriptions(void) value = valueptr; } } - else if (!strcasecmp(line, "Owner")) + else if (!_cups_strcasecmp(line, "Owner")) { /* * Owner @@ -824,7 +839,7 @@ cupsdLoadAllSubscriptions(void) break; } } - else if (!strcasecmp(line, "Recipient")) + else if (!_cups_strcasecmp(line, "Recipient")) { /* * Recipient uri @@ -840,7 +855,7 @@ cupsdLoadAllSubscriptions(void) break; } } - else if (!strcasecmp(line, "JobId")) + else if (!_cups_strcasecmp(line, "JobId")) { /* * JobId # @@ -864,7 +879,7 @@ cupsdLoadAllSubscriptions(void) break; } } - else if (!strcasecmp(line, "PrinterName")) + else if (!_cups_strcasecmp(line, "PrinterName")) { /* * PrinterName name @@ -888,7 +903,7 @@ cupsdLoadAllSubscriptions(void) break; } } - else if (!strcasecmp(line, "UserData")) + else if (!_cups_strcasecmp(line, "UserData")) { /* * UserData encoded-string @@ -909,9 +924,9 @@ cupsdLoadAllSubscriptions(void) if (isxdigit(valueptr[0]) && isxdigit(valueptr[1])) { if (isdigit(valueptr[0])) - sub->user_data[i] = (valueptr[0] - '0') << 4; + sub->user_data[i] = (unsigned char)((valueptr[0] - '0') << 4); else - sub->user_data[i] = (tolower(valueptr[0]) - 'a' + 10) << 4; + sub->user_data[i] = (unsigned char)((tolower(valueptr[0]) - 'a' + 10) << 4); if (isdigit(valueptr[1])) sub->user_data[i] |= valueptr[1] - '0'; @@ -930,7 +945,7 @@ cupsdLoadAllSubscriptions(void) break; } else - sub->user_data[i] = *valueptr++; + sub->user_data[i] = (unsigned char)*valueptr++; } if (*valueptr) @@ -950,7 +965,7 @@ cupsdLoadAllSubscriptions(void) break; } } - else if (!strcasecmp(line, "LeaseDuration")) + else if (!_cups_strcasecmp(line, "LeaseDuration")) { /* * LeaseDuration # @@ -969,7 +984,7 @@ cupsdLoadAllSubscriptions(void) break; } } - else if (!strcasecmp(line, "Interval")) + else if (!_cups_strcasecmp(line, "Interval")) { /* * Interval # @@ -985,7 +1000,7 @@ cupsdLoadAllSubscriptions(void) break; } } - else if (!strcasecmp(line, "ExpirationTime")) + else if (!_cups_strcasecmp(line, "ExpirationTime")) { /* * ExpirationTime # @@ -1001,7 +1016,7 @@ cupsdLoadAllSubscriptions(void) break; } } - else if (!strcasecmp(line, "NextEventId")) + else if (!_cups_strcasecmp(line, "NextEventId")) { /* * NextEventId # @@ -1042,8 +1057,8 @@ cupsdSaveAllSubscriptions(void) { 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 */ @@ -1056,36 +1071,12 @@ cupsdSaveAllSubscriptions(void) * Create the subscriptions.conf file... */ - snprintf(temp, sizeof(temp), "%s/subscriptions.conf", ServerRoot); - snprintf(backup, sizeof(backup), "%s/subscriptions.conf.O", 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)); + snprintf(filename, sizeof(filename), "%s/subscriptions.conf", ServerRoot); - 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... @@ -1186,7 +1177,7 @@ cupsdSaveAllSubscriptions(void) cupsFilePuts(fp, "\n"); } - cupsFileClose(fp); + cupsdCloseCreatedConfFile(fp, filename); } @@ -1379,7 +1370,10 @@ cupsd_send_notification( 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) { @@ -1394,19 +1388,15 @@ cupsd_send_notification( * 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 *)); } /* @@ -1416,8 +1406,7 @@ cupsd_send_notification( * 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... @@ -1575,7 +1564,7 @@ cupsd_start_notifier( */ if (cupsdStartProcess(command, argv, envp, fds[0], -1, NotifierPipes[1], - -1, -1, 0, DefaultProfile, &pid) < 0) + -1, -1, 0, DefaultProfile, NULL, &pid) < 0) { /* * Error - can't fork! @@ -1617,11 +1606,16 @@ cupsd_update_notifier(void) while (cupsdStatBufUpdate(NotifierStatusBuffer, &loglevel, message, sizeof(message))) + { + if (loglevel == CUPSD_LOG_INFO) + cupsdLogMessage(CUPSD_LOG_INFO, "%s", message); + if (!strchr(NotifierStatusBuffer->buffer, '\n')) break; + } } /* - * End of "$Id: subscriptions.c 7824 2008-08-01 21:11:55Z mike $". + * End of "$Id$". */