8e79e8df5e2d6d194e7fee429123ac68937cb371
[scilab.git] / scilab / modules / ast / src / cpp / system_env / sci_tmpdir.cpp
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 *  Copyright (C) 2010 - DIGITEO - Antoine ELIAS
4 *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13 *
14 */
15
16 #include "configvariable.hxx"
17 #include "string.hxx"
18 #include "context.hxx"
19 #include "parser.hxx"
20
21 extern "C"
22 {
23 #include "sci_malloc.h"
24 #ifdef _MSC_VER
25 #include <process.h>
26 #else
27 #include <sys/types.h> /* getpid */
28 #include <unistd.h> /* getpid */
29 #endif
30 #include "sci_tmpdir.h"
31 #include "os_string.h"
32 #include "charEncoding.h"
33 #include "PATH_MAX.h"
34 #include "setenvc.h"
35 #include "getenvc.h"
36 #include "localization.h"
37 #include <errno.h>
38 #include "removedir.h"
39 #include "setenvvar.h"
40 #include "getshortpathname.h"
41 }
42
43 char* getTMPDIR(void)
44 {
45     return wide_string_to_UTF8(ConfigVariable::getTMPDIR().c_str());
46 }
47 /*--------------------------------------------------------------------------*/
48 wchar_t* getTMPDIRW(void)
49 {
50     return os_wcsdup(ConfigVariable::getTMPDIR().c_str());
51 }
52
53 /*--------------------------------------------------------------------------*/
54 void setTMPDIRW(const wchar_t* _sci_tmpdir)
55 {
56     //add SCI value in context as variable
57     types::String *pS = new types::String(_sci_tmpdir);
58     symbol::Context::getInstance()->put(symbol::Symbol(L"TMPDIR"), pS);
59
60     //add SCI value ConfigVariable
61     std::wstring sci_tmpdir(_sci_tmpdir);
62     ConfigVariable::setTMPDIR(sci_tmpdir);
63 }
64 /*--------------------------------------------------------------------------*/
65 void setTMPDIR(const char* _sci_tmpdir)
66 {
67     wchar_t* pstTemp = to_wide_string(_sci_tmpdir);
68     setTMPDIRW(pstTemp);
69     FREE(pstTemp);
70 }
71 /*--------------------------------------------------------------------------*/
72 void putenvTMPDIRW(const wchar_t* _sci_tmpdir)
73 {
74     char* pstTemp = wide_string_to_UTF8(_sci_tmpdir);
75     putenvTMPDIR(pstTemp);
76     FREE(pstTemp);
77     return;
78 }
79 /*--------------------------------------------------------------------------*/
80 void putenvTMPDIR(const char *_sci_tmpdir)
81 {
82     char *ShortPath = NULL;
83     char *CopyOfDefaultPath = NULL;
84
85     /* to be sure that it's unix 8.3 format */
86     /* c:/progra~1/scilab-5.0 */
87     BOOL bConvertOK = FALSE;
88     ShortPath = getshortpathname(_sci_tmpdir, &bConvertOK);
89     //GetShortPathName(_sci_path,ShortPath,PATH_MAX);
90
91     CopyOfDefaultPath = new char[strlen(_sci_tmpdir) + 1];
92     AntislashToSlash(ShortPath, CopyOfDefaultPath);
93
94     setenvc("TMPDIR", ShortPath);
95
96     delete[] CopyOfDefaultPath;
97     FREE(ShortPath);
98 }
99
100 /*--------------------------------------------------------------------------*/
101 wchar_t* getenvTMPDIRW()
102 {
103     char *SciTemp = getenvTMPDIR();
104     wchar_t* pstTemp = to_wide_string(SciTemp);
105     delete[] SciTemp;
106     return pstTemp;
107 }
108 /*--------------------------------------------------------------------------*/
109 char* getenvTMPDIR()
110 {
111     int ierr, iflag = 0;
112     int lbuf = PATH_MAX;
113     char *SciPath = new char[PATH_MAX];
114
115     if (SciPath)
116     {
117         getenvc(&ierr, "TMPDIR", SciPath, &lbuf, &iflag);
118
119         if (ierr == 1)
120         {
121             return NULL;
122         }
123     }
124
125     return SciPath;
126 }
127 /*--------------------------------------------------------------------------*/
128 wchar_t* computeTMPDIRW(void)
129 {
130     char* pstTemp = computeTMPDIR();
131     wchar_t* pstReturn = to_wide_string(pstTemp);
132     FREE(pstTemp);
133     return pstReturn;
134 }
135 /*--------------------------------------------------------------------------*/
136 //windows : find main DLL and extract path
137 //linux and macos : scilab script fill SCI env variable
138 char* computeTMPDIR()
139 {
140 #ifdef _MSC_VER
141     wchar_t wcTmpDirDefault[PATH_MAX];
142
143     if (!GetTempPathW(PATH_MAX, wcTmpDirDefault))
144     {
145         MessageBoxA(NULL, _("Cannot find Windows temporary directory (1)."), _("Error"), MB_ICONERROR);
146         exit(1);
147     }
148     else
149     {
150         wchar_t wctmp_dir[PATH_MAX + FILENAME_MAX + 1];
151         static wchar_t bufenv[PATH_MAX + 16];
152         char *TmpDir = NULL;
153         os_swprintf(wctmp_dir, PATH_MAX + FILENAME_MAX + 1, L"%lsSCI_TMP_%d_", wcTmpDirDefault, _getpid());
154         if (CreateDirectoryW(wctmp_dir, NULL) == FALSE)
155         {
156             DWORD attribs = GetFileAttributesW(wctmp_dir);
157             if (attribs & FILE_ATTRIBUTE_DIRECTORY)
158             {
159                 /* Repertoire existant */
160             }
161             else
162             {
163 #ifdef _DEBUG
164                 {
165                     char MsgErr[1024];
166                     wsprintfA(MsgErr, _("Impossible to create : %s"), wctmp_dir);
167                     MessageBoxA(NULL, MsgErr, _("Error"), MB_ICONERROR);
168                     exit(1);
169                 }
170 #else
171                 {
172                     GetTempPathW(PATH_MAX, wcTmpDirDefault);
173                     wcscpy(wctmp_dir, wcTmpDirDefault);
174                     wctmp_dir[wcslen(wctmp_dir) - 1] = '\0'; /* Remove last \ */
175                 }
176 #endif
177             }
178         }
179
180         os_swprintf(bufenv, PATH_MAX + 16, L"TMPDIR=%ls", wctmp_dir);
181         _wputenv(bufenv);
182
183         TmpDir = wide_string_to_UTF8(wctmp_dir);
184         if (TmpDir)
185         {
186             return TmpDir;
187         }
188         else
189         {
190             return NULL;
191         }
192     }
193     return NULL;
194 #else
195     char *tmpdir;
196
197     char* env_dir = (char*)MALLOC(sizeof(char) * (PATH_MAX + 16));
198     /* If the env variable TMPDIR is set, honor this preference */
199     tmpdir = getenv("TMPDIR");
200     if (tmpdir != NULL && strlen(tmpdir) < (PATH_MAX) && strstr(tmpdir, "SCI_TMP_") == NULL)
201     {
202         strcpy(env_dir, tmpdir);
203     }
204     else
205     {
206         strcpy(env_dir, "/tmp");
207     }
208
209     /* XXXXXX will be randomized by mkdtemp */
210     char *env_dir_strdup = os_strdup(env_dir); /* Copy to avoid to have the same buffer as input and output for sprintf */
211     sprintf(env_dir, "%s/SCI_TMP_%d_XXXXXX", env_dir_strdup, (int)getpid());
212     free(env_dir_strdup);
213
214     if (mkdtemp(env_dir) == NULL)
215     {
216         fprintf(stderr, _("Error: Could not create %s: %s\n"), env_dir, strerror(errno));
217     }
218
219     setenvc("TMPDIR", env_dir);
220     return env_dir;
221 #endif
222 }
223 /*--------------------------------------------------------------------------*/
224 void defineTMPDIR()
225 {
226     wchar_t* sci_tmpdir = computeTMPDIRW();
227     setTMPDIRW(sci_tmpdir);
228     putenvTMPDIRW(sci_tmpdir);
229     FREE(sci_tmpdir);
230 }
231
232 void clearTMPDIR()
233 {
234     char * tmpdir = getTMPDIR();
235     Parser parser;
236     parser.releaseTmpFile();
237     removedir(tmpdir);
238     FREE(tmpdir);
239 }
240