]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - cups/tempfile.c
Greatly simplify the man page handling.
[thirdparty/cups.git] / cups / tempfile.c
index 97972bd829bcc65cc7c4279f491b3f85beceb23d..fb39802955292d6c3860a83633960b9b0fb059c4 100644 (file)
  */
 
 #include "cups-private.h"
+#include "debug-internal.h"
 #include <stdlib.h>
 #include <fcntl.h>
 #include <sys/stat.h>
-#if defined(WIN32) || defined(__EMX__)
+#if defined(_WIN32) || defined(__EMX__)
 #  include <io.h>
 #else
 #  include <unistd.h>
-#endif /* WIN32 || __EMX__ */
+#endif /* _WIN32 || __EMX__ */
 
 
 /*
@@ -37,24 +38,24 @@ cupsTempFd(char *filename,          /* I - Pointer to buffer */
   int          fd;                     /* File descriptor for temp file */
   int          tries;                  /* Number of tries */
   const char   *tmpdir;                /* TMPDIR environment var */
-#if defined(__APPLE__) || defined(WIN32)
+#if defined(__APPLE__) || defined(_WIN32)
   char         tmppath[1024];          /* Temporary directory */
-#endif /* __APPLE__ || WIN32 */
-#ifdef WIN32
+#endif /* __APPLE__ || _WIN32 */
+#ifdef _WIN32
   DWORD                curtime;                /* Current time */
 #else
   struct timeval curtime;              /* Current time */
-#endif /* WIN32 */
+#endif /* _WIN32 */
 
 
  /*
   * See if TMPDIR is defined...
   */
 
-#ifdef WIN32
+#ifdef _WIN32
   if ((tmpdir = getenv("TEMP")) == NULL)
   {
-    GetTempPath(sizeof(tmppath), tmppath);
+    GetTempPathA(sizeof(tmppath), tmppath);
     tmpdir = tmppath;
   }
 
@@ -62,15 +63,14 @@ cupsTempFd(char *filename,          /* I - Pointer to buffer */
  /*
   * On macOS and iOS, the TMPDIR environment variable is not always the best
   * location to place temporary files due to sandboxing.  Instead, the confstr
-  * function should be called when running as a normal process (not a child of
-  * cupsd) to get the proper per-user, per-process TMPDIR value.  We know
-  * whether the process is running as a child of cupsd by the presence of the
-  * "SOFTWARE" environment variable that cupsd sets.
+  * function should be called to get the proper per-user, per-process TMPDIR
+  * value.
   */
 
-  tmpdir = getenv("TMPDIR");
+  if ((tmpdir = getenv("TMPDIR")) != NULL && access(tmpdir, W_OK))
+    tmpdir = NULL;
 
-  if (!getenv("SOFTWARE") || !tmpdir)
+  if (!tmpdir)
   {
     if (confstr(_CS_DARWIN_USER_TEMP_DIR, tmppath, sizeof(tmppath)))
       tmpdir = tmppath;
@@ -88,7 +88,7 @@ cupsTempFd(char *filename,            /* I - Pointer to buffer */
 
   if ((tmpdir = getenv("TMPDIR")) == NULL)
     tmpdir = "/tmp";
-#endif /* WIN32 */
+#endif /* _WIN32 */
 
  /*
   * Make the temporary name using the specified directory...
@@ -98,7 +98,7 @@ cupsTempFd(char *filename,            /* I - Pointer to buffer */
 
   do
   {
-#ifdef WIN32
+#ifdef _WIN32
    /*
     * Get the current time of day...
     */
@@ -122,21 +122,21 @@ cupsTempFd(char *filename,                /* I - Pointer to buffer */
     */
 
     snprintf(filename, (size_t)len - 1, "%s/%05x%08x", tmpdir, (unsigned)getpid(), (unsigned)(curtime.tv_sec + curtime.tv_usec + tries));
-#endif /* WIN32 */
+#endif /* _WIN32 */
 
    /*
     * Open the file in "exclusive" mode, making sure that we don't
     * stomp on an existing file or someone's symlink crack...
     */
 
-#ifdef WIN32
+#ifdef _WIN32
     fd = open(filename, _O_CREAT | _O_RDWR | _O_TRUNC | _O_BINARY,
               _S_IREAD | _S_IWRITE);
 #elif defined(O_NOFOLLOW)
     fd = open(filename, O_RDWR | O_CREAT | O_EXCL | O_NOFOLLOW, 0600);
 #else
     fd = open(filename, O_RDWR | O_CREAT | O_EXCL, 0600);
-#endif /* WIN32 */
+#endif /* _WIN32 */
 
     if (fd < 0 && errno != EEXIST)
       break;