Avoid dependency on GLIBC_2.4 (__realpath_chk)
[scilab.git] / scilab / modules / core / src / c / tmpdir.c
index babb4e3..2026d16 100644 (file)
 #endif
 
 #if defined(__STDC__) || defined(_MSC_VER)
+#if defined(__linux__)
+#define __USE_FORTIFY_LEVEL 0 /* Avoid dependency on GLIBC_2.4 (__realpath_chk) */
+#endif
 #include <stdlib.h>
 #ifndef _MSC_VER
 #include <sys/types.h>
 #include <unistd.h>
 #endif
-#else 
+#else
 extern  char  *getenv();
 #endif
 
@@ -44,25 +47,25 @@ extern  char  *getenv();
 #include "removedir.h"
 #include "createdirectory.h"
 /*--------------------------------------------------------------------------*/
-static char tmp_dir[PATH_MAX+FILENAME_MAX+1];
+static char tmp_dir[PATH_MAX + FILENAME_MAX + 1];
 static int alreadyCreated = 0;
 /*--------------------------------------------------------------------------*/
 #ifdef _MSC_VER
 void createScilabTMPDIR(void)
 {
     wchar_t wcTmpDirDefault[PATH_MAX];
-    if (!GetTempPathW(PATH_MAX,wcTmpDirDefault))
+    if (!GetTempPathW(PATH_MAX, wcTmpDirDefault))
     {
-        MessageBox(NULL,_("Cannot find Windows temporary directory (1)."),_("Error"),MB_ICONERROR);
+        MessageBox(NULL, _("Cannot find Windows temporary directory (1)."), _("Error"), MB_ICONERROR);
         exit(1);
     }
     else
     {
-        wchar_t wctmp_dir[PATH_MAX+FILENAME_MAX+1];
+        wchar_t wctmp_dir[PATH_MAX + FILENAME_MAX + 1];
         static wchar_t bufenv[PATH_MAX + 16];
         char *TmpDir = NULL;
-        swprintf(wctmp_dir,PATH_MAX+FILENAME_MAX+1,L"%sSCI_TMP_%d_",wcTmpDirDefault,(int) _getpid());
-        if ( CreateDirectoryW(wctmp_dir,NULL) == FALSE)
+        swprintf(wctmp_dir, PATH_MAX + FILENAME_MAX + 1, L"%sSCI_TMP_%d_", wcTmpDirDefault, (int) _getpid());
+        if ( CreateDirectoryW(wctmp_dir, NULL) == FALSE)
         {
             DWORD attribs = GetFileAttributesW (wctmp_dir);
             if (attribs & FILE_ATTRIBUTE_DIRECTORY)
@@ -71,24 +74,24 @@ void createScilabTMPDIR(void)
             }
             else
             {
-                #ifdef _DEBUG
+#ifdef _DEBUG
                 {
                     char MsgErr[1024];
-                    wsprintf(MsgErr,_("Impossible to create : %s"),tmp_dir);
-                    MessageBox(NULL,MsgErr,_("Error"),MB_ICONERROR);
+                    wsprintf(MsgErr, _("Impossible to create : %s"), tmp_dir);
+                    MessageBox(NULL, MsgErr, _("Error"), MB_ICONERROR);
                     exit(1);
                 }
-                #else
+#else
                 {
-                    GetTempPathW(PATH_MAX,wcTmpDirDefault);
-                    wcscpy(wctmp_dir,wcTmpDirDefault);
-                    wctmp_dir[wcslen(wctmp_dir)-1]='\0'; /* Remove last \ */
+                    GetTempPathW(PATH_MAX, wcTmpDirDefault);
+                    wcscpy(wctmp_dir, wcTmpDirDefault);
+                    wctmp_dir[wcslen(wctmp_dir) - 1] = '\0'; /* Remove last \ */
                 }
-                #endif
+#endif
             }
         }
 
-        swprintf(bufenv,PATH_MAX + 16,L"TMPDIR=%s",wctmp_dir);
+        swprintf(bufenv, PATH_MAX + 16, L"TMPDIR=%s", wctmp_dir);
         _wputenv(bufenv);
 
         TmpDir = wide_string_to_UTF8(wctmp_dir);
@@ -114,21 +117,34 @@ void createScilabTMPDIR(void)
         static char bufenv[PATH_MAX + 16];
         alreadyCreated++;
         /* If the env variable TMPDIR is set, honor this preference */
-        if((tmpdir = getenv("TMPDIR")) != NULL && strlen(tmpdir) < (PATH_MAX))
+        if ((tmpdir = getenv("TMPDIR")) != NULL &&
+                strlen(tmpdir) < (PATH_MAX) && strstr(tmpdir, "SCI_TMP_") == NULL)
         {
+            /* TMPDIR does not contains SCI_TMP. Using TMPDIR */
             strcpy(tmp_dir, tmpdir);
         }
         else
         {
+            /* Two cases where we can be here:
+             *  - When TMPDIR is not set (all cases)
+             *  - If SCI_TMP_* is in the TMPDIR variable, switch to the default
+            */
             strcpy(tmp_dir, "/tmp");
         }
 
         /* XXXXXX will be randomized by mkdtemp */
-        sprintf(tmp_dir, "%s/SCI_TMP_%d_XXXXXX", tmp_dir, (int) getpid());
 
-        if(mkdtemp(tmp_dir) < 0)
+        char *tmp_dir_strdup[PATH_MAX];
+        char *res = realpath(tmp_dir, tmp_dir_strdup);
+        if (!res)
+        {
+            fprintf(stderr, _("Warning: Could not resolve the realpath of %s.\n"), tmp_dir);
+        }
+        sprintf(tmp_dir, "%s/SCI_TMP_%d_XXXXXX", tmp_dir_strdup, (int) getpid());
+
+        if (mkdtemp(tmp_dir) == NULL)
         {
-                fprintf(stderr,_("Error: Could not create %s: %s\n"), tmp_dir, strerror(errno));
+            fprintf(stderr, _("Error: Could not create %s: %s\n"), tmp_dir, strerror(errno));
         }
 
         sprintf(bufenv, "TMPDIR=%s", tmp_dir);