summaryrefslogtreecommitdiff
path: root/Build/source/texk/xdvipdfmx/src/dpxfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/xdvipdfmx/src/dpxfile.c')
-rw-r--r--Build/source/texk/xdvipdfmx/src/dpxfile.c154
1 files changed, 128 insertions, 26 deletions
diff --git a/Build/source/texk/xdvipdfmx/src/dpxfile.c b/Build/source/texk/xdvipdfmx/src/dpxfile.c
index 04c0027eb8c..56d2f899d64 100644
--- a/Build/source/texk/xdvipdfmx/src/dpxfile.c
+++ b/Build/source/texk/xdvipdfmx/src/dpxfile.c
@@ -26,6 +26,12 @@
#include "config.h"
#endif
+#ifdef _MSC_VER
+#include <kpathsea/dirent.h>
+#endif
+
+#include <time.h>
+
#include "system.h"
#include "error.h"
#include "mem.h"
@@ -34,6 +40,8 @@
#include "mfileio.h"
#include "dpxfile.h"
+#include "dpxcrypt.h"
+#define MAX_KEY_LEN 16
#include <kpathsea/lib.h>
#include <string.h>
@@ -53,6 +61,7 @@
#endif
static int verbose = 0;
+int keep_cache = false;
void
dpx_file_set_verbose (void)
@@ -640,6 +649,8 @@ is_absolute_path(const char *filename)
return 1;
if (filename[0] == '\\' && filename[1] == '\\')
return 1;
+ if (filename[0] == '/' && filename[1] == '/')
+ return 1;
#else
if (filename[0] == '/')
return 1;
@@ -653,7 +664,7 @@ dpx_find_type1_file (const char *filename)
char *fqpn = NULL;
if (is_absolute_path(filename))
- fqpn = strdup(filename);
+ fqpn = xstrdup(filename);
else
fqpn = kpse_find_file(filename, kpse_type1_format, 0);
if (fqpn && !qcheck_filetype(fqpn, DPX_RES_TYPE_T1FONT)) {
@@ -671,7 +682,7 @@ dpx_find_truetype_file (const char *filename)
char *fqpn = NULL;
if (is_absolute_path(filename))
- fqpn = strdup(filename);
+ fqpn = xstrdup(filename);
else
fqpn = kpse_find_file(filename, kpse_truetype_format, 0);
if (fqpn && !qcheck_filetype(fqpn, DPX_RES_TYPE_TTFONT)) {
@@ -692,7 +703,7 @@ dpx_find_opentype_file (const char *filename)
q = ensuresuffix(filename, ".otf");
#ifndef MIKTEX
if (is_absolute_path(q))
- fqpn = strdup(q);
+ fqpn = xstrdup(q);
else
fqpn = kpse_find_file(q, kpse_opentype_format, 0);
if (!fqpn) {
@@ -737,11 +748,37 @@ dpx_find_dfont_file (const char *filename)
return fqpn;
}
+static char *
+dpx_get_tmpdir (void)
+{
+# ifdef WIN32
+# define __TMPDIR "."
+# else /* WIN32 */
+# define __TMPDIR "/tmp"
+#endif /* WIN32 */
+ char *_tmpd;
+
+# ifdef HAVE_GETENV
+ _tmpd = getenv("TMPDIR");
+# ifdef WIN32
+ if (!_tmpd)
+ _tmpd = getenv("TMP");
+ if (!_tmpd)
+ _tmpd = getenv("TEMP");
+# endif /* WIN32 */
+ if (!_tmpd)
+ _tmpd = __TMPDIR;
+# else /* HAVE_GETENV */
+ _tmpd = __TMPDIR;
+# endif /* HAVE_GETENV */
+ return _tmpd;
+}
#ifdef HAVE_MKSTEMP
# include <stdlib.h>
#endif
+#if 0 /* Not used */
char *
dpx_create_temp_file (void)
{
@@ -753,18 +790,11 @@ dpx_create_temp_file (void)
miktex_create_temp_file_name(tmp); /* FIXME_FIXME */
}
#elif defined(HAVE_MKSTEMP)
-# define __TMPDIR "/tmp"
-# define TEMPLATE "/dvipdfmx.XXXXXX"
+# define TEMPLATE "/dvipdfmx.XXXXXXXX"
{
const char *_tmpd;
int _fd = -1;
-# ifdef HAVE_GETENV
- _tmpd = getenv("TMPDIR");
- if (!_tmpd)
- _tmpd = __TMPDIR;
-# else
- _tmpd = __TMPDIR;
-# endif /* HAVE_GETENV */
+ _tmpd = dpx_get_tmpdir();
tmp = NEW(strlen(_tmpd) + strlen(TEMPLATE) + 1, char);
strcpy(tmp, _tmpd);
strcat(tmp, TEMPLATE);
@@ -786,18 +816,8 @@ dpx_create_temp_file (void)
# define __TMPDIR "."
const char *_tmpd;
char *p;
-# ifdef HAVE_GETENV
- _tmpd = getenv ("TMPDIR");
- if (!_tmpd)
- _tmpd = getenv ("TMP");
- if (!_tmpd)
- _tmpd = getenv ("TEMP");
- if (!_tmpd)
- _tmpd = __TMPDIR;
-# else /* HAVE_GETENV */
- _tmpd = __TMPDIR;
-# endif /* HAVE_GETENV */
- tmp = _tempnam (_tmpd, "dpxtmp.");
+ _tmpd = dpx_get_tmpdir();
+ tmp = _tempnam (_tmpd, "dvipdfmx.");
for (p = tmp; *p; p++) {
if (IS_KANJI (p))
p++;
@@ -815,13 +835,95 @@ dpx_create_temp_file (void)
return tmp;
}
+#endif /* 0 */
+
+char *
+dpx_create_fix_temp_file (char *filename)
+{
+#define PREFIX "xdvipdfmx."
+ static char *dir = NULL;
+ static char *cwd = NULL;
+ char *ret, *s;
+ int i;
+ MD5_CONTEXT state;
+ unsigned char digest[MAX_KEY_LEN];
+#ifdef WIN32
+ char *p;
+#endif
+
+ if (!dir) {
+ dir = dpx_get_tmpdir();
+ cwd = xgetcwd();
+ }
+
+ MD5_init(&state);
+ MD5_write(&state, (unsigned char *)cwd, strlen(cwd));
+ MD5_write(&state, (unsigned char *)filename, strlen(filename));
+ MD5_final(digest, &state);
+
+ ret = NEW(strlen(dir)+1+strlen(PREFIX)+MAX_KEY_LEN*2 + 1, char);
+ sprintf(ret, "%s/%s", dir, PREFIX);
+ s = ret + strlen(ret);
+ for (i=0; i<MAX_KEY_LEN; i++) {
+ sprintf(s, "%02x", digest[i]);
+ s += 2;
+ }
+#ifdef WIN32
+ for (p = ret; *p; p++) {
+ if (IS_KANJI (p))
+ p++;
+ else if (*p == '\\')
+ *p = '/';
+ }
+#endif
+ /* printf("dpx_create_fix_temp_file: %s\n", ret); */
+ return ret;
+}
+
+int
+dpx_clear_cache_filter (const struct dirent *ent) {
+ int plen = strlen(PREFIX);
+ if (strlen(ent->d_name) != plen + MAX_KEY_LEN * 2) return 0;
+#ifdef WIN32
+ return strncasecmp(ent->d_name, PREFIX, plen) == 0;
+#else
+ return strncmp(ent->d_name, PREFIX, plen) == 0;
+#endif
+}
+
+void
+dpx_delete_old_cache (int life)
+{
+ const char *dir = dpx_get_tmpdir();
+ char *pathname = NEW(strlen(dir)+1+strlen(PREFIX)+MAX_KEY_LEN*2 + 1, char);
+ DIR *dp;
+ struct dirent *de;
+ time_t limit = time(NULL) - life * 60 * 60;
+
+ if (life >= 0) keep_cache = true;
+ if ((dp = opendir(dir)) != NULL) {
+ while((de = readdir(dp)) != NULL) {
+ if (dpx_clear_cache_filter(de)) {
+ struct stat sb;
+ sprintf(pathname, "%s/%s", dir, de->d_name);
+ stat(pathname, &sb);
+ if (sb.st_mtime < limit) {
+ remove(pathname);
+ /* printf("remove: %s\n", pathname); */
+ }
+ }
+ }
+ closedir(dp);
+ }
+ RELEASE(pathname);
+}
void
-dpx_delete_temp_file (char *tmp)
+dpx_delete_temp_file (char *tmp, int force)
{
if (!tmp)
return;
- remove (tmp);
+ if (force || !keep_cache) remove (tmp);
RELEASE(tmp);
return;