Index: notifier/rss.c =================================================================== --- notifier/rss.c (revision 7820) +++ notifier/rss.c (working copy) @@ -33,6 +33,7 @@ #include #include #include +#include /* @@ -109,6 +110,10 @@ cups_array_t *rss; /* RSS message array */ _cups_rss_t *msg; /* RSS message */ char baseurl[1024]; /* Base URL */ + fd_set input; /* Input set for select() */ + struct timeval timeout; /* Timeout for select() */ + int changed; /* Has the RSS data changed? */ + int exit_status; /* Exit status */ fprintf(stderr, "DEBUG: argc=%d\n", argc); @@ -229,6 +234,8 @@ load_rss(rss, filename); + changed = cupsArrayCount(rss) == 0; + /* * Localize for the user's chosen language... */ @@ -239,9 +246,60 @@ * Read events and update the RSS file until we are out of events. */ - for (;;) + for (exit_status = 0, event = NULL;;) { + if (changed) + { + /* + * Save the messages to the file again, uploading as needed... + */ + + if (save_rss(rss, newname, baseurl)) + { + if (http) + { + /* + * Upload the RSS file... + */ + + if ((status = cupsPutFile(http, resource, filename)) != HTTP_CREATED) + fprintf(stderr, "ERROR: Unable to PUT %s from %s on port %d: %d %s\n", + resource, host, port, status, httpStatus(status)); + } + else + { + /* + * Move the new RSS file over top the old one... + */ + + if (rename(newname, filename)) + fprintf(stderr, "ERROR: Unable to rename %s to %s: %s\n", + newname, filename, strerror(errno)); + } + + changed = 0; + } + } + /* + * Wait up to 30 seconds for an event... + */ + + timeout.tv_sec = 30; + timeout.tv_usec = 0; + + FD_ZERO(&input); + FD_SET(0, &input); + + if (select(1, &input, NULL, NULL, &timeout) < 0) + continue; + else if (!FD_ISSET(0, &input)) + { + fprintf(stderr, "DEBUG: %s is bored, exiting...\n", argv[1]); + break; + } + + /* * Read the next event... */ @@ -256,17 +314,8 @@ fputs("DEBUG: ippReadFile() returned IPP_ERROR!\n", stderr); if (state <= IPP_IDLE) - { - ippDelete(event); + break; - if (http) - unlink(filename); - - httpClose(http); - - return (0); - } - /* * Collect the info from the event... */ @@ -308,15 +357,8 @@ { fprintf(stderr, "ERROR: Unable to create message: %s\n", strerror(errno)); - - ippDelete(event); - - if (http) - unlink(filename); - - httpClose(http); - - return (1); + exit_status = 1; + break; } /* @@ -325,6 +367,8 @@ cupsArrayAdd(rss, msg); + changed = 1; + /* * Trim the array as needed... */ @@ -337,34 +381,6 @@ delete_message(msg); } - - /* - * Save the messages to the file again, uploading as needed... - */ - - if (save_rss(rss, newname, baseurl)) - { - if (http) - { - /* - * Upload the RSS file... - */ - - if ((status = cupsPutFile(http, resource, filename)) != HTTP_CREATED) - fprintf(stderr, "ERROR: Unable to PUT %s from %s on port %d: %d %s\n", - resource, host, port, status, httpStatus(status)); - } - else - { - /* - * Move the new RSS file over top the old one... - */ - - if (rename(newname, filename)) - fprintf(stderr, "ERROR: Unable to rename %s to %s: %s\n", - newname, filename, strerror(errno)); - } - } } if (subject) @@ -374,7 +390,22 @@ free(text); ippDelete(event); + event = NULL; } + + /* + * We only get here when idle or error... + */ + + ippDelete(event); + + if (http) + { + unlink(filename); + httpClose(http); + } + + return (exit_status); } Index: scheduler/subscriptions.c =================================================================== --- scheduler/subscriptions.c (revision 7820) +++ scheduler/subscriptions.c (working copy) @@ -389,6 +389,13 @@ cupsArrayAdd(Subscriptions, temp); + /* + * For RSS subscriptions, run the notifier immediately... + */ + + if (uri && !strncmp(uri, "rss:", 4)) + cupsd_start_notifier(temp); + return (temp); } Index: scheduler/subscriptions.h =================================================================== --- scheduler/subscriptions.h (revision 7820) +++ scheduler/subscriptions.h (working copy) @@ -3,7 +3,7 @@ * * Subscription definitions for the Common UNIX Printing System (CUPS) scheduler. * - * Copyright 2007 by Apple Inc. + * 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