+enum file_copy_error {
+ FILE_COPY_ERROR_OPEN_SRC = 1,
+ FILE_COPY_ERROR_OPEN_DST,
+ FILE_COPY_ERROR_READ,
+ FILE_COPY_ERROR_WRITE,
+ FILE_COPY_ERROR_ALLOC_BUFFER
+};
+
+#define HTML_PKG_TEMPLATE \
+"<html>\n\
+ <head>\n\
+ <link type=\"text/css\"\n\
+ rel=\"stylesheet\"\n\
+ href=\n\
+\"http://fonts.googleapis.com/css?family=Ubuntu:regular,bold&subset=Latin\">\n\
+ <link type=\"text/css\" href=\"css/ppastats.css\" rel=\"stylesheet\" />\n\
+ <link type=\"text/css\" href=\"css/jquery.jqplot.min.css\"\n\
+ rel=\"stylesheet\" />\n\
+ <script type=\"text/javascript\" src=\"js/jquery.min.js\"></script>\n\
+ <script type=\"text/javascript\"\n\
+ src=\"js/jquery.jqplot.min.js\"></script>\n\
+ <script type=\"text/javascript\"\n\
+ src=\"js/jqplot.dateAxisRenderer.min.js\"></script>\n\
+ <script type=\"text/javascript\" src=\"js/ppastats.js\"></script>\n\
+ <script>var data = %s;\n\
+ ppastats_pkg();\n\
+ </script>\n\
+ </head>\n\
+ <body>\n\
+ <h1><span id=\"pkg_name\">N/A</span></h1>\n\
+ <p><em>PPA</em>: \n\
+ <a href=\".\">\n\
+ <span id=\"ppa_owner\">N/A</span>/<span id=\"ppa_name\">N/A</span>\n\
+ </a></p>\n\
+ <div id=\"chart\"></div>\n\
+ <div id=\"versions\"><em>Versions:</em></div>\n\
+ </body>\n\
+</html>"
+
+#define HTML_VERSION_TEMPLATE \
+"<html>\n\
+ <head>\n\
+ <link type=\"text/css\"\n\
+ rel=\"stylesheet\"\n\
+ href=\n\
+\"http://fonts.googleapis.com/css?family=Ubuntu:regular,bold&subset=Latin\">\n\
+ <link type=\"text/css\" href=\"css/ppastats.css\" rel=\"stylesheet\" />\n\
+ <link type=\"text/css\" href=\"css/jquery.jqplot.min.css\"\n\
+ rel=\"stylesheet\" />\n\
+ <script type=\"text/javascript\" src=\"js/jquery.min.js\"></script>\n\
+ <script type=\"text/javascript\"\n\
+ src=\"js/jquery.jqplot.min.js\"></script>\n\
+ <script type=\"text/javascript\"\n\
+ src=\"js/jqplot.dateAxisRenderer.min.js\"></script>\n\
+ <script type=\"text/javascript\" src=\"js/ppastats.js\"></script>\n\
+ <script>var data = %s;\n\
+ ppastats_ver();\n\
+ </script>\n\
+ </head>\n\
+ <body>\n\
+ <h1><span id=\"pkg_name\">N/A</span></h1>\n\
+ <div id=\"version\"><em>Version:</em></div>\n\
+ <p><em>PPA</em>: \n\
+ <a href=\".\">\n\
+ <span id=\"ppa_owner\">N/A</span>/<span id=\"ppa_name\">N/A</span>\n\
+ </a></p>\n\
+ <div id=\"chart\"></div>\n\
+ </body>\n\
+</html>"
+
+#define FCOPY_BUF_SZ 4096
+static int file_copy(FILE * src, FILE * dst)
+{
+ int ret = 0;
+ char *buf = malloc(FCOPY_BUF_SZ);
+ int n;
+
+ if (!buf)
+ return FILE_COPY_ERROR_ALLOC_BUFFER;
+
+ while (!ret) {
+ n = fread(buf, 1, FCOPY_BUF_SZ, src);
+ if (n) {
+ if (fwrite(buf, 1, n, dst) != n)
+ ret = FILE_COPY_ERROR_WRITE;
+ } else {
+ if (!feof(src))
+ ret = FILE_COPY_ERROR_READ;
+ else
+ break;
+ }
+ }
+
+ free(buf);
+
+ return ret;
+}
+
+int
+fcopy(const char *src, const char *dst)
+{
+ FILE *fsrc, *fdst;
+ int ret = 0;
+
+ if (debug)
+ printf("DEBUG: copy: %s to %s\n", src, dst);
+
+ fsrc = fopen(src, "r");
+
+ if (fsrc) {
+ fdst = fopen(dst, "w+");
+
+ if (fdst) {
+ ret = file_copy(fsrc, fdst);
+ fclose(fdst);
+ } else {
+ ret = FILE_COPY_ERROR_OPEN_DST;
+ }
+
+ fclose(fsrc);
+ } else {
+ ret = FILE_COPY_ERROR_OPEN_SRC;
+ }
+
+ return ret;
+}