X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=scheduler%2Fsubscriptions.c;h=0908f3c0cedc76a6f9ac88f561a9f46e47e0a38d;hb=9bdea94b145114057c8016c3f182d758e576a9ff;hp=4412c33d7c9d054c4cfb3d44c5e1639272bab5ac;hpb=f0ab5bff8ab3f7b00619675b806b1f01294a3f6a;p=thirdparty%2Fcups.git diff --git a/scheduler/subscriptions.c b/scheduler/subscriptions.c index 4412c33d7..0908f3c0c 100644 --- a/scheduler/subscriptions.c +++ b/scheduler/subscriptions.c @@ -1,37 +1,10 @@ /* - * "$Id: subscriptions.c 7824 2008-08-01 21:11:55Z mike $" + * Subscription routines for the CUPS scheduler. * - * Subscription routines for the Common UNIX Printing System (CUPS) scheduler. + * Copyright 2007-2019 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. * - * Copyright 2007-2008 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. + * Licensed under Apache License v2.0. See the file "LICENSE" for more information. */ /* @@ -126,9 +99,7 @@ cupsdAddEvent( * Check if this subscription requires this event... */ - if ((sub->mask & event) != 0 && - (sub->dest == dest || !sub->dest) && - (sub->job == job || !sub->job)) + if ((sub->mask & event) != 0 && (sub->dest == dest || !sub->dest || sub->job == job)) { /* * Need this event, so create a new event record... @@ -146,7 +117,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 +131,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 +183,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) @@ -480,9 +455,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... */ @@ -503,13 +475,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); @@ -682,9 +648,14 @@ cupsdExpireSubscriptions( time_t curtime; /* Current time */ + if (cupsArrayCount(Subscriptions) == 0) + return; + curtime = time(NULL); update = 0; + cupsdLogMessage(CUPSD_LOG_INFO, "Expiring subscriptions..."); + for (sub = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions); sub; sub = (cupsd_subscription_t *)cupsArrayNext(Subscriptions)) @@ -744,14 +715,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... @@ -763,7 +728,7 @@ cupsdLoadAllSubscriptions(void) while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) { - if (!strcasecmp(line, "NextSubscriptionId") && value) + if (!_cups_strcasecmp(line, "NextSubscriptionId") && value) { /* * NextSubscriptionId NNN @@ -773,7 +738,7 @@ cupsdLoadAllSubscriptions(void) if (i >= NextSubscriptionId && i > 0) NextSubscriptionId = i; } - else if (!strcasecmp(line, " @@ -792,7 +757,7 @@ cupsdLoadAllSubscriptions(void) break; } } - else if (!strcasecmp(line, "")) + else if (!_cups_strcasecmp(line, "")) { if (!sub) { @@ -814,7 +779,7 @@ cupsdLoadAllSubscriptions(void) "Syntax error on line %d of subscriptions.conf.", linenum); } - else if (!strcasecmp(line, "Events")) + else if (!_cups_strcasecmp(line, "Events")) { /* * Events name @@ -855,7 +820,7 @@ cupsdLoadAllSubscriptions(void) value = valueptr; } } - else if (!strcasecmp(line, "Owner")) + else if (!_cups_strcasecmp(line, "Owner")) { /* * Owner @@ -871,7 +836,7 @@ cupsdLoadAllSubscriptions(void) break; } } - else if (!strcasecmp(line, "Recipient")) + else if (!_cups_strcasecmp(line, "Recipient")) { /* * Recipient uri @@ -887,7 +852,7 @@ cupsdLoadAllSubscriptions(void) break; } } - else if (!strcasecmp(line, "JobId")) + else if (!_cups_strcasecmp(line, "JobId")) { /* * JobId # @@ -911,7 +876,7 @@ cupsdLoadAllSubscriptions(void) break; } } - else if (!strcasecmp(line, "PrinterName")) + else if (!_cups_strcasecmp(line, "PrinterName")) { /* * PrinterName name @@ -935,7 +900,7 @@ cupsdLoadAllSubscriptions(void) break; } } - else if (!strcasecmp(line, "UserData")) + else if (!_cups_strcasecmp(line, "UserData")) { /* * UserData encoded-string @@ -956,9 +921,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'; @@ -977,7 +942,7 @@ cupsdLoadAllSubscriptions(void) break; } else - sub->user_data[i] = *valueptr++; + sub->user_data[i] = (unsigned char)*valueptr++; } if (*valueptr) @@ -997,7 +962,7 @@ cupsdLoadAllSubscriptions(void) break; } } - else if (!strcasecmp(line, "LeaseDuration")) + else if (!_cups_strcasecmp(line, "LeaseDuration")) { /* * LeaseDuration # @@ -1016,7 +981,7 @@ cupsdLoadAllSubscriptions(void) break; } } - else if (!strcasecmp(line, "Interval")) + else if (!_cups_strcasecmp(line, "Interval")) { /* * Interval # @@ -1032,7 +997,7 @@ cupsdLoadAllSubscriptions(void) break; } } - else if (!strcasecmp(line, "ExpirationTime")) + else if (!_cups_strcasecmp(line, "ExpirationTime")) { /* * ExpirationTime # @@ -1048,7 +1013,7 @@ cupsdLoadAllSubscriptions(void) break; } } - else if (!strcasecmp(line, "NextEventId")) + else if (!_cups_strcasecmp(line, "NextEventId")) { /* * NextEventId # @@ -1089,8 +1054,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 */ @@ -1103,36 +1068,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); + 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... @@ -1233,7 +1174,7 @@ cupsdSaveAllSubscriptions(void) cupsFilePuts(fp, "\n"); } - cupsFileClose(fp); + cupsdCloseCreatedConfFile(fp, filename); } @@ -1426,7 +1367,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) { @@ -1441,19 +1385,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 *)); } /* @@ -1463,8 +1403,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... @@ -1622,7 +1561,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! @@ -1672,8 +1611,3 @@ cupsd_update_notifier(void) break; } } - - -/* - * End of "$Id: subscriptions.c 7824 2008-08-01 21:11:55Z mike $". - */