]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - notifier/rss.c
Remove all of the Subversion keywords from various source files.
[thirdparty/cups.git] / notifier / rss.c
index 03f1199bbabd615d24dfd394e291bf90a01e2da9..be765d68ef249d03bfb0789924a21d9401318ce9 100644 (file)
@@ -1,27 +1,14 @@
 /*
- * "$Id: rss.c 6649 2007-07-11 21:46:42Z mike $"
+ * RSS notifier for CUPS.
  *
- *   RSS notifier for the Common UNIX Printing System (CUPS).
+ * Copyright 2007-2015 by Apple Inc.
+ * Copyright 2007 by Easy Software Products.
  *
- *   Copyright 2007 by Apple Inc.
- *   Copyright 2007 by Easy Software Products.
- *
- *   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:
- *
- *   main()           - Main entry for the test notifier.
- *   compare_rss()    - Compare two messages.
- *   delete_message() - Free all memory used by a message.
- *   load_rss()       - Load an existing RSS feed file.
- *   new_message()    - Create a new RSS message.
- *   password_cb()    - Return the cached password.
- *   save_rss()       - Save messages to a RSS file.
- *   xml_escape()     - Copy a string, escaping &, <, and > as needed.
+ * 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/".
  */
 
 /*
  */
 
 #include <cups/cups.h>
+#include <sys/stat.h>
 #include <cups/language.h>
-#include <cups/string.h>
+#include <cups/string-private.h>
 #include <cups/array.h>
-#include <errno.h>
+#include <sys/select.h>
+#include <cups/ipp-private.h>  /* TODO: Update so we don't need this */
 
 
 /*
@@ -109,6 +98,10 @@ main(int  argc,                             /* I - Number of command-line arguments */
   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 +222,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
   load_rss(rss, filename);
 
+  changed = cupsArrayCount(rss) == 0;
+
  /*
   * Localize for the user's chosen language...
   */
@@ -239,8 +234,59 @@ main(int  argc,                            /* I - Number of command-line arguments */
   * 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,16 +302,7 @@ main(int  argc,                            /* I - Number of command-line arguments */
       fputs("DEBUG: ippReadFile() returned IPP_ERROR!\n", stderr);
 
     if (state <= IPP_IDLE)
-    {
-      ippDelete(event);
-
-      if (http)
-        unlink(filename);
-
-      httpClose(http);
-
-      return (0);
-    }
+      break;
 
    /*
     * Collect the info from the event...
@@ -308,15 +345,8 @@ main(int  argc,                            /* I - Number of command-line arguments */
       {
         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 +355,8 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
       cupsArrayAdd(rss, msg);
 
+      changed = 1;
+
      /*
       * Trim the array as needed...
       */
@@ -337,34 +369,6 @@ main(int  argc,                            /* I - Number of command-line arguments */
 
        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 +378,22 @@ main(int  argc,                            /* I - Number of command-line arguments */
       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);
 }
 
 
@@ -523,6 +542,15 @@ load_rss(cups_array_t *rss,                /* I - RSS messages */
       sequence_number = atoi(start + 6);
   }
 
+  if (subject)
+    free(subject);
+
+  if (text)
+    free(text);
+
+  if (link_url)
+    free(link_url);
+
   fclose(fp);
 }
 
@@ -589,6 +617,8 @@ save_rss(cups_array_t *rss,         /* I - RSS messages */
     return (0);
   }
 
+  fchmod(fileno(fp), 0644);
+
   fputs("<?xml version=\"1.0\"?>\n", fp);
   fputs("<rss version=\"2.0\">\n", fp);
   fputs("  <channel>\n", fp);
@@ -609,15 +639,21 @@ save_rss(cups_array_t *rss,               /* I - RSS messages */
        msg;
        msg = (_cups_rss_t *)cupsArrayPrev(rss))
   {
+    char *subject = xml_escape(msg->subject);
+    char *text = xml_escape(msg->text);
+
     fputs("    <item>\n", fp);
-    fprintf(fp, "      <title>%s</title>\n", msg->subject);
-    fprintf(fp, "      <description>%s</description>\n", msg->text);
+    fprintf(fp, "      <title>%s</title>\n", subject);
+    fprintf(fp, "      <description>%s</description>\n", text);
     if (msg->link_url)
       fprintf(fp, "      <link>%s</link>\n", msg->link_url);
     fprintf(fp, "      <pubDate>%s</pubDate>\n",
             httpGetDateString2(msg->event_time, date, sizeof(date)));
     fprintf(fp, "      <guid>%d</guid>\n", msg->sequence_number);
     fputs("    </item>\n", fp);
+
+    free(subject);
+    free(text);
   }
 
   fputs(" </channel>\n", fp);
@@ -694,8 +730,3 @@ xml_escape(const char *s)           /* I - String to escape */
 
   return (e);
 }
-
-
-/*
- * End of "$Id: rss.c 6649 2007-07-11 21:46:42Z mike $".
- */