a534aac2733cafeaca66f4cc6d285a95d1041ba0
[scilab.git] / scilab / modules / core / src / c / tmpdir.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) INRIA
4  * Copyright (C) DIGITEO - 2009 - Allan CORNET
5  * Copyright (C) DIGITEO - 2010 - Sylvestre LEDRU
6  *
7  * This file must be used under the terms of the CeCILL.
8  * This source file is licensed as described in the file COPYING, which
9  * you should have received as part of this distribution. The terms
10  * are also available at
11  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
12  *
13  */
14 #include <stdio.h>
15 #include <string.h>
16
17 #ifdef _MSC_VER
18 #include <windows.h>
19 #include <process.h>
20 #endif
21
22 #if defined(__STDC__) || defined(_MSC_VER)
23 #include <stdlib.h>
24 #ifndef _MSC_VER
25 #include <sys/types.h>
26 #include <unistd.h>
27 #endif
28 #else
29 extern  char  *getenv();
30 #endif
31
32 #include <errno.h>
33
34 #ifdef _MSC_VER
35 #include <process.h>
36 #include "strdup_windows.h"
37 #endif
38 #include "MALLOC.h" /* MALLOC */
39 #include "tmpdir.h"
40 #include "localization.h"
41 #include "charEncoding.h"
42 #include "MALLOC.h"
43 #include "PATH_MAX.h"
44 #include "removedir.h"
45 #include "createdirectory.h"
46 /*--------------------------------------------------------------------------*/
47 static char tmp_dir[PATH_MAX + FILENAME_MAX + 1];
48 static int alreadyCreated = 0;
49 /*--------------------------------------------------------------------------*/
50 #ifdef _MSC_VER
51 void createScilabTMPDIR(void)
52 {
53     wchar_t wcTmpDirDefault[PATH_MAX];
54     if (!GetTempPathW(PATH_MAX, wcTmpDirDefault))
55     {
56         MessageBox(NULL, _("Cannot find Windows temporary directory (1)."), _("Error"), MB_ICONERROR);
57         exit(1);
58     }
59     else
60     {
61         wchar_t wctmp_dir[PATH_MAX + FILENAME_MAX + 1];
62         static wchar_t bufenv[PATH_MAX + 16];
63         char *TmpDir = NULL;
64         swprintf(wctmp_dir, PATH_MAX + FILENAME_MAX + 1, L"%sSCI_TMP_%d_", wcTmpDirDefault, (int) _getpid());
65         if ( CreateDirectoryW(wctmp_dir, NULL) == FALSE)
66         {
67             DWORD attribs = GetFileAttributesW (wctmp_dir);
68             if (attribs & FILE_ATTRIBUTE_DIRECTORY)
69             {
70                 /* Repertoire existant */
71             }
72             else
73             {
74 #ifdef _DEBUG
75                 {
76                     char MsgErr[1024];
77                     wsprintf(MsgErr, _("Impossible to create : %s"), tmp_dir);
78                     MessageBox(NULL, MsgErr, _("Error"), MB_ICONERROR);
79                     exit(1);
80                 }
81 #else
82                 {
83                     GetTempPathW(PATH_MAX, wcTmpDirDefault);
84                     wcscpy(wctmp_dir, wcTmpDirDefault);
85                     wctmp_dir[wcslen(wctmp_dir) - 1] = '\0'; /* Remove last \ */
86                 }
87 #endif
88             }
89         }
90
91         swprintf(bufenv, PATH_MAX + 16, L"TMPDIR=%s", wctmp_dir);
92         _wputenv(bufenv);
93
94         TmpDir = wide_string_to_UTF8(wctmp_dir);
95         if (TmpDir)
96         {
97             strcpy(tmp_dir, TmpDir);
98             FREE(TmpDir);
99         }
100         else
101         {
102             strcpy(tmp_dir, "");
103         }
104     }
105 }
106 #else
107
108 void createScilabTMPDIR(void)
109 {
110     char *tmpdir;
111
112     if ( alreadyCreated == 0 )
113     {
114         static char bufenv[PATH_MAX + 16];
115         alreadyCreated++;
116         /* If the env variable TMPDIR is set, honor this preference */
117         if ((tmpdir = getenv("TMPDIR")) != NULL &&
118                 strlen(tmpdir) < (PATH_MAX) && strstr(tmpdir, "SCI_TMP_") == NULL)
119         {
120             /* TMPDIR does not contains SCI_TMP. Using TMPDIR */
121             strcpy(tmp_dir, tmpdir);
122         }
123         else
124         {
125             /* Two cases where we can be here:
126              *  - When TMPDIR is not set (all cases)
127              *  - If SCI_TMP_* is in the TMPDIR variable, switch to the default
128             */
129             strcpy(tmp_dir, "/tmp");
130         }
131
132         /* XXXXXX will be randomized by mkdtemp */
133
134         char *tmp_dir_strdup[PATH_MAX];
135         char *res = realpath(tmp_dir, tmp_dir_strdup);
136         if (!res)
137         {
138             fprintf(stderr, _("Warning: Could not resolve the realpath of %s.\n"), tmp_dir);
139         }
140         sprintf(tmp_dir, "%s/SCI_TMP_%d_XXXXXX", tmp_dir_strdup, (int) getpid());
141
142         if (mkdtemp(tmp_dir) == NULL)
143         {
144             fprintf(stderr, _("Error: Could not create %s: %s\n"), tmp_dir, strerror(errno));
145         }
146
147         sprintf(bufenv, "TMPDIR=%s", tmp_dir);
148         putenv(bufenv);
149     }
150 }
151 #endif
152 /*--------------------------------------------------------------------------*/
153 /**
154 * creates a tmp dir for a scilab session
155 * and fixes the TMPDIR env variable
156 */
157 void C2F(settmpdir)(void)
158 {
159     createScilabTMPDIR();
160 }
161 /*--------------------------------------------------------------------------*/
162 char *getTMPDIR(void)
163 {
164     return strdup(tmp_dir);
165 }
166 /*--------------------------------------------------------------------------*/
167 /**
168 * remove TMPDIR directory
169 */
170 void C2F(tmpdirc)(void)
171 {
172     removedir(tmp_dir);
173 }
174 /*--------------------------------------------------------------------------*/
175 wchar_t *getTMPDIRW(void)
176 {
177     return to_wide_string(tmp_dir);
178 }
179 /*--------------------------------------------------------------------------*/