/* Write the actual file name at fname. */ static FILE * gp_open_scratch_file_generic(const gs_memory_t *mem, const char *prefix, char fname[gp_file_name_sizeof], const char *mode, bool b64) { /* The -8 is for XXXXXX plus a possible final / and -. */ int prefix_length = strlen(prefix); int len = gp_file_name_sizeof - prefix_length - 8; FILE *fp; if (gp_file_name_is_absolute(prefix, prefix_length)) *fname = 0; else if (gp_gettmpdir(fname, &len) != 0) strcpy(fname, "/tmp/"); else { if (strlen(fname) != 0 && fname[strlen(fname) - 1] != '/') strcat(fname, "/"); } if (strlen(fname) + prefix_length + 8 >= gp_file_name_sizeof) return 0; /* file name too long */ strcat(fname, prefix); /* Prevent trailing X's in path from being converted by mktemp. */ if (*fname != 0 && fname[strlen(fname) - 1] == 'X') strcat(fname, "-"); strcat(fname, "XXXXXX"); #ifdef HAVE_MKSTEMP { int file; char ofname[gp_file_name_sizeof]; /* save the old filename template in case mkstemp fails */ memcpy(ofname, fname, gp_file_name_sizeof); #ifdef HAVE_MKSTEMP64 if (b64) file = mkstemp64(fname); else file = mkstemp(fname); #else file = mkstemp(fname); #endif if (file < -1) { emprintf1(mem, "**** Could not open temporary file %s\n", ofname); return NULL; } #if defined(O_LARGEFILE) && defined(__hpux) if (b64) fcntl(file, F_SETFD, fcntl(file, F_GETFD) | O_LARGEFILE); #else /* Fixme : what to do with b64 and 32-bit mkstemp? Unimplemented. */ #endif fp = fdopen(file, mode); if (fp == NULL) close(file); } #else mktemp(fname); fp = (b64 ? gp_fopentemp : gp_fopentemp_64)(fname, mode); #endif if (fp == NULL) emprintf1(mem, "**** Could not open temporary file %s\n", fname); return fp; }
/* Write the actual file name at fname. */ FILE * gp_open_scratch_file(const char *prefix, char *fname, const char *mode) { UINT n; DWORD l; HANDLE hfile = INVALID_HANDLE_VALUE; int fd = -1; FILE *f = NULL; char sTempDir[_MAX_PATH]; char sTempFileName[_MAX_PATH]; memset(fname, 0, gp_file_name_sizeof); if (!gp_file_name_is_absolute(prefix, strlen(prefix))) { int plen = sizeof(sTempDir); if (gp_gettmpdir(sTempDir, &plen) != 0) l = GetTempPath(sizeof(sTempDir), sTempDir); else l = strlen(sTempDir); } else { strncpy(sTempDir, prefix, sizeof(sTempDir)); prefix = ""; l = strlen(sTempDir); } /* Fix the trailing terminator so GetTempFileName doesn't get confused */ if (sTempDir[l-1] == '/') sTempDir[l-1] = '\\'; /* What Windoze prefers */ if (l <= sizeof(sTempDir)) { n = GetTempFileName(sTempDir, prefix, 0, sTempFileName); if (n == 0) { /* If 'prefix' is not a directory, it is a path prefix. */ int l = strlen(sTempDir), i; for (i = l - 1; i > 0; i--) { uint slen = gs_file_name_check_separator(sTempDir + i, l, sTempDir + l); if (slen > 0) { sTempDir[i] = 0; i += slen; break; } } if (i > 0) n = GetTempFileName(sTempDir, sTempDir + i, 0, sTempFileName); } if (n != 0) { hfile = CreateFile(sTempFileName, GENERIC_READ | GENERIC_WRITE | DELETE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL /* | FILE_FLAG_DELETE_ON_CLOSE */, NULL); /* * Can't apply FILE_FLAG_DELETE_ON_CLOSE due to * the logics of clist_fclose. Also note that * gdev_prn_render_pages requires multiple temporary files * to exist simultaneousely, so that keeping all them opened * may exceed available CRTL file handles. */ } } if (hfile != INVALID_HANDLE_VALUE) { /* Associate a C file handle with an OS file handle. */ fd = _open_osfhandle((long)hfile, 0); if (fd == -1) CloseHandle(hfile); else { /* Associate a C file stream with C file handle. */ f = fdopen(fd, mode); if (f == NULL) _close(fd); } } if (f != NULL) { if ((strlen(sTempFileName) < gp_file_name_sizeof)) strncpy(fname, sTempFileName, gp_file_name_sizeof - 1); else { /* The file name is too long. */ fclose(f); f = NULL; } } if (f == NULL) eprintf1("**** Could not open temporary file '%s'\n", fname); return f; }