diff options
Diffstat (limited to 'Build/source/texk/xdvipdfmx/src/dpxfile.c')
-rw-r--r-- | Build/source/texk/xdvipdfmx/src/dpxfile.c | 154 |
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; |