| 640 | */ |
| 641 | |
| 642 | void |
| 643 | cupsdExpireSubscriptions( |
| 644 | cupsd_printer_t *dest, /* I - Printer, if any */ |
| 645 | cupsd_job_t *job) /* I - Job, if any */ |
| 646 | { |
| 647 | cupsd_subscription_t *sub; /* Current subscription */ |
| 648 | int update = 0; /* Update subscriptions.conf? */ |
| 649 | time_t curtime; /* Current time */ |
| 650 | |
| 651 | |
| 652 | _cupsRWLockWrite(&SubscriptionsLock); |
| 653 | |
| 654 | if (cupsArrayCount(Subscriptions) == 0) |
| 655 | goto done; |
| 656 | |
| 657 | curtime = time(NULL); |
| 658 | |
| 659 | cupsdLogMessage(CUPSD_LOG_DEBUG, "Expiring subscriptions..."); |
| 660 | |
| 661 | for (sub = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions); |
| 662 | sub; |
| 663 | sub = (cupsd_subscription_t *)cupsArrayNext(Subscriptions)) |
| 664 | { |
| 665 | if ((!sub->job && !dest && sub->expire && sub->expire <= curtime) || |
| 666 | (dest && sub->dest == dest) || |
| 667 | (job && sub->job == job)) |
| 668 | { |
| 669 | cupsdLogMessage(CUPSD_LOG_INFO, "Subscription %d has expired...", |
| 670 | sub->id); |
| 671 | |
| 672 | cupsdDeleteSubscription(sub, -1); |
| 673 | |
| 674 | update = 1; |
| 675 | } |
| 676 | } |
| 677 | |
| 678 | done: |
| 679 | |
| 680 | _cupsRWUnlock(&SubscriptionsLock); |
| 681 | |
| 682 | if (update) |
| 683 | cupsdMarkDirty(CUPSD_DIRTY_SUBSCRIPTIONS); |
| 684 | } |
| 685 | |
| 686 | |
| 687 | /* |
no test coverage detected