diff options
Diffstat (limited to 'Build/source/texk/dvipsk/search.c')
-rw-r--r-- | Build/source/texk/dvipsk/search.c | 358 |
1 files changed, 0 insertions, 358 deletions
diff --git a/Build/source/texk/dvipsk/search.c b/Build/source/texk/dvipsk/search.c deleted file mode 100644 index ca6b3cda6a6..00000000000 --- a/Build/source/texk/dvipsk/search.c +++ /dev/null @@ -1,358 +0,0 @@ -/* - * The search routine takes a directory list, separated by PATHSEP, and - * tries to open a file. Null directory components indicate current - * directory. In an environment variable, null directory components - * indicate substitution of the default path list at that point. - * This source file assumes KPATHSEA is defined. - */ -#include "dvips.h" /* The copyright notice in that file is included too! */ - -#ifndef KPATHSEA -"goodbye, search.c can only be compiled with -DKPATHSEA" -#endif - -#include "protos_add.h" /* external declarations */ - -#include <kpathsea/c-ctype.h> -#include <kpathsea/tex-file.h> -#include <kpathsea/tex-glyph.h> -#include <kpathsea/absolute.h> -#include <kpathsea/c-pathch.h> -#include <kpathsea/variable.h> - -#ifdef WIN32 -#undef fopen -#undef popen -#undef pclose -extern FILE *generic_fsyscp_fopen(const char *name, const char *mode); -#define fopen(file, fmode) generic_fsyscp_fopen(file, fmode) -#define popen(pcmd, pmode) fsyscp_popen(pcmd, pmode) -#define pclose(pstream) _pclose(pstream) - -#undef FATAL_PERROR -#if defined (KPSE_COMPAT_API) -#define FATAL_PERROR(str) do { \ - win32_fprintf (stderr, "%s: ", kpse_def->invocation_name); \ - win32_perror (str); exit (EXIT_FAILURE); } while (0) -#else -/* If there is no global variable available, just output the error */ -#define FATAL_PERROR(str) do { \ - win32_perror (str); exit (EXIT_FAILURE); } while (0) -#endif - -#endif - -#ifndef GUNZIP -#define GUNZIP "gzip -d" -#endif - -int to_close; /* use fclose or pclose? */ -char *realnameoffile; - -/* Return safely quoted version of NAME. That means using "..." on - Windows and '...' on Unix, with any occurrences of the quote char - quoted with a \. Result is always in new memory; NAME is unchanged. - This is a generic function; if we end up needing it in other - programs, we should move it to kpathsea. */ - -#ifdef WIN32 -#define QUOTE '"' -#else -#define QUOTE '\'' -#endif - -static char * -quote_name (const char *name) -{ - char *quoted = xmalloc (strlen (name) * 2 + 3); - char *q = quoted; - const char *p = name; - - *q++ = QUOTE; - while (*p) { - if (*p == QUOTE) - *q++ = QUOTE; - *q++ = *p++; - } - *q++ = QUOTE; - *q = 0; - - return quoted; -} - - -/* On Windows, return PROG with SELFAUTOLOC prepended, and / separators - changed to \. On Unix, return a copy of PROG. Result is always in - new memory. No safeness or other quoting is done on PROG. - - This is necessary because Windows likes to run programs out of the - current directory. So for security, we want to ensure that we are - invoking programs from our own binary directory, not via PATH. - - This is a generic function; if we end up needing it in other - programs, we should move it to kpathsea. */ - -#ifdef WIN32 -#include <kpathsea/concatn.h> -#endif - -static char * -selfautoloc_prog (const char *prog) -{ - char *ret; -#ifdef WIN32 - char *p, *q, *r; - /* Get value of SELFAUTOLOC, but \ works better for path separator. */ - char *selfautoloc = kpse_var_value ("SELFAUTOLOC"); - for (p = selfautoloc; *p; p++) { - if (*p == '/') - *p = '\\'; - } - q = xstrdup (prog); - r = q; - while (*r && *r != ' ' && *r != '\t') - r++; - if (*r == '\0') - ret = concatn ("\"", selfautoloc, "\\", q, "\"", NULL); - else { - *r = '\0'; - r++; - if (*r) - ret = concatn ("\"", selfautoloc, "\\", q, "\" ", r, NULL); - else - ret = concatn ("\"", selfautoloc, "\\", q, "\"", NULL); - } - free (q); - free (selfautoloc); - -#else /* not WIN32 */ - ret = xstrdup (prog); -#endif - - return ret; -} - - - -FILE * -search(kpse_file_format_type format, const char *file, const char *mode) -{ - FILE *ret; - string found_name; - - /* This change suggested by maj@cl.cam.ac.uk to disallow reading of - arbitrary files. Further modified by Y. Oiwa. */ -#ifndef SECURE - if (secure == 2) { -#endif - /* an absolute path is denied */ - if (kpse_absolute_p (file, false)) - return NULL; - - if (file[0] == '.' && file[1] == '.' && IS_DIR_SEP(file[2])) { - /* a relative path starting with ../ is denied */ - return NULL; - } else { - /* a relative path containing /../ is denied */ - const char *p; - - if (file[0] != '\0') { - for(p = file + 1; *p && ((p = strstr(p, "..")) != NULL); p += 2) { - /* p[2] is valid, because p points to string starting with ".." */ - /* p[-1] is valid, because p does not point the top of file */ - if ((p[2] == '\0' || IS_DIR_SEP(p[2])) && IS_DIR_SEP(p[-1])) { - return NULL; - } - } - } - } -#ifndef SECURE - } -#endif - /* Most file looked for through here must exist -- the exception is - VF's. Bitmap fonts go through pksearch. */ - found_name = kpse_find_file (file, format, - format != vfpath && format != ofmpath); - if (found_name) { - unsigned len = strlen (found_name); - if ((format == figpath || format == headerpath) - && ((len > 2 && FILESTRCASEEQ (found_name + len - 2, ".Z")) - || (len > 3 && FILESTRCASEEQ (found_name + len - 3, ".gz")))) { - /* automatically but safely decompress. */ - char *quoted_name = quote_name (found_name); - char *cmd; - char *prog = selfautoloc_prog (GUNZIP); - cmd = concat3 (prog, " -c ", quoted_name); - ret = popen (cmd, "r"); - if (dd(D_FILES)) { - fprintf_str(stderr, "popen(%s) %s\n", cmd, - ret == NULL ? "failed" : "succeeded"); - } - SET_BINARY(fileno(ret)); - to_close = USE_PCLOSE; - free (cmd); - free (quoted_name); - free (prog); - } else { - ret = fopen (found_name, mode); - to_close = USE_FCLOSE; - } - if (!ret) - FATAL_PERROR (found_name); - - /* Free result of previous search. */ - if (realnameoffile) - free (realnameoffile); - - /* Save in `name' and `realnameoffile' because other routines - access those globals. */ - realnameoffile = found_name; - strcpy(name, realnameoffile); - } else - ret = NULL; - - return ret; -} /* end search */ - - -FILE * -pksearch(const char *file, const char *mode, halfword dpi, - const char **name_ret, int *dpi_ret) -{ - FILE *ret; - kpse_glyph_file_type font_file; - string found_name = kpse_find_pk (file, dpi, &font_file); - - if (found_name) { - ret = fopen (found_name, mode); - if (!ret) - FATAL_PERROR (name); - - /* Free result of previous search. */ - if (realnameoffile) - free (realnameoffile); - /* Save in `name' and `realnameoffile' because other routines - access those globals. Sigh. */ - realnameoffile = found_name; - strcpy(name, realnameoffile); - *name_ret = font_file.name; - *dpi_ret = font_file.dpi; - } else - ret = NULL; - - return ret; -} /* end search */ - - -/* do we report file openings? */ - -#ifdef DEBUG -# ifdef fopen -# undef fopen -# endif -# ifdef VMCMS /* IBM: VM/CMS */ -# define fopen cmsfopen -# endif /* IBM: VM/CMS */ -FILE * -my_real_fopen(register const char *n, register const char *t) -{ - FILE *tf; - if (dd(D_FILES)) { - fprintf_str(stderr, "<%s(%s)> ", n, t); - tf = fopen(n, t); - if (tf == 0) - fprintf(stderr, "failed\n"); - else - fprintf(stderr, "succeeded\n"); - } else - tf = fopen(n, t); -#ifdef OS2 - if (tf == (FILE *)NULL) - tf = fat_fopen(n, t); /* try again with filename truncated to 8.3 */ -#endif - return tf; -} -#endif - -#ifdef OS2 -/* truncate filename at end of fname to FAT filesystem 8.3 limit */ -/* if truncated, return fopen() with new name */ -FILE * -fat_fopen(char *fname, char *t) -{ - char *np; /* pointer to name within path */ - char nbuf[13], *ns, *nd; - char n[MAXPATHLEN]; - int ni, ne; - FILE *tf; - strcpy(n, fname); - for (ns=n; *ns; ns++) { - if (*ns=='/') - *ns=DIRSEP; - } - np = strrchr(n,DIRSEP); - if (np==(char *)NULL) - np = n; - else - np++; - /* fail if it contains more than one '.' */ - ni = 0; - for (ns=np; *ns; ns++) { - if (*ns=='.') - ni++; - } - if (ni>1) - return (FILE *)NULL; - /* copy it to nbuf, truncating to 8.3 */ - ns = np; - nd = nbuf; - ni = 0; - while ((*ns!='.') && (*ns) && (ni<8)) { - *nd++ = *ns++; - ni++; - } - while ((*ns!='.') && (*ns)) { - ns++; - ni++; - } - ne = 0; - if (*ns=='.') { - *nd++ = *ns++; - while ((*ns!='.') && (*ns) && (ne<3)) { - *nd++ = *ns++; - ne++; - } - while (*ns) { - ns++; - ne++; - } - } - *nd++='\0'; - if ((ni>8) || (ne>3)) { - strcpy(np,nbuf); - /* now code copied from my_real_fopen() */ - if (dd(D_FILES)) { - fprintf_str(stderr, "<%s(%s)> ", n, t); - tf = fopen(n, t); - if (tf == 0) - fprintf(stderr, "failed\n"); - else - fprintf(stderr, "succeeded\n"); - } - else - tf = fopen(n, t); - return tf; - } - return (FILE *)NULL; -} -#endif - -int -close_file(FILE *f) -{ - switch(to_close) { -case USE_PCLOSE: return pclose(f); -case USE_FCLOSE: return fclose(f); -default: return -1; - } -} |