916464cfd0213e74a7d8f419cd33efac88996f8b
[scilab.git] / scilab / modules / ast / src / cpp / system_env / setenvvar.cpp
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 *  Copyright (C) 2008-2008 - 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 #ifdef _MSC_VER
17 #ifndef MAX_PATH_SHORT
18 #define MAX_PATH_SHORT 260
19 #endif
20 //Only for windows
21 #pragma warning(disable : 4996) //It's not beautifull but that works !
22 #endif
23
24 #include <iostream>
25
26 #ifdef _MSC_VER
27 #define NOMINMAX
28 #include "windows.h"
29 #define putenv _putenv
30
31 #else
32
33 #include <stdlib.h>
34 #include <string.h>
35 #include <sys/stat.h>
36
37 #define  DIRMODE        0777
38
39 #endif
40
41 #include "context.hxx"
42 #include "configvariable.hxx"
43
44 extern "C"
45 {
46 #include "setenvvar.h"
47 #include "sci_home.h"
48 #include "home.h"
49 #include "sci_path.h"
50 #include "sci_tmpdir.h"
51 #include "sci_malloc.h"
52 #include "getshortpathname.h"
53 }
54
55
56
57 /*--------------------------------------------------------------------------*/
58 /**
59 * Les variables d'environnements SCI, and some others
60 * sont définies directement dans scilab
61 * scilex peut donc etre executé seul
62 */
63
64 /*--------------------------------------------------------------------------*/
65 /**
66 * Define SCI and some others Environments variables
67 */
68 void SetScilabEnvironment(void)
69 {
70 #ifdef _MSC_VER
71     //windows check
72     SciEnvForWindows();
73 #endif
74
75     SetScilabVariables();
76 }
77
78 void SetScilabVariables(void)
79 {
80     //create SCI
81     defineSCI();
82     //create SCIHOME
83     defineSCIHOME();
84     //create TMPDIR
85     defineTMPDIR();
86     //create home
87     defineHOME();
88 }
89
90 #ifdef _MSC_VER
91 void SciEnvForWindows(void)
92 {
93     char *SCIPathName = computeSCI();
94     /* Correction Bug 1579 */
95     if (!IsTheGoodShell())
96     {
97         if ( (!Set_Shell()) || (!IsTheGoodShell()))
98         {
99             std::cout << "Please modify ""ComSpec"" environment variable." << std::endl << "cmd.exe on W2K and more." << std::endl;
100         }
101     }
102
103     SetScilabEnvironmentVariables(SCIPathName);
104     if (SCIPathName)
105     {
106         FREE(SCIPathName);
107         SCIPathName = NULL;
108     }
109 }
110 #endif
111
112 #ifdef _MSC_VER
113 /*--------------------------------------------------------------------------*/
114 bool IsTheGoodShell(void)
115 {
116     bool bOK = false;
117     char shellCmd[PATH_MAX];
118     char drive[_MAX_DRIVE];
119     char dir[_MAX_DIR];
120     char fname[_MAX_FNAME];
121     char ext[_MAX_EXT];
122
123     strcpy(shellCmd, "");
124     strcpy(fname, "");
125     GetEnvironmentVariableA("ComSpec", shellCmd, PATH_MAX);
126     os_splitpath(shellCmd, drive, dir, fname, ext);
127
128     if (_stricmp(fname, "cmd") == 0)
129     {
130         bOK = true;
131     }
132
133     return bOK;
134 }
135
136 /*--------------------------------------------------------------------------*/
137 bool Set_Shell(void)
138 {
139     bool bOK = false;
140     char env[_MAX_DRIVE + _MAX_DIR + _MAX_FNAME + _MAX_EXT + 10];
141     char *WINDIRPATH = NULL;
142
143     WINDIRPATH = getenv ("SystemRoot");
144     sprintf(env, "ComSpec=%s\\system32\\cmd.exe", WINDIRPATH);
145
146     if (putenv (env))
147     {
148         bOK = false;
149     }
150     else
151     {
152         bOK = true;
153     }
154
155     if (WINDIRPATH)
156     {
157         delete[] WINDIRPATH;
158         WINDIRPATH = NULL;
159     }
160     return bOK;
161 }
162
163 static BOOL AddScilabBinDirectoryToPATHEnvironnementVariable(char *DefaultPath)
164 {
165 #define PATH_FORMAT "PATH=%s/bin;%s"
166
167     BOOL bOK = FALSE;
168     char *PATH = NULL;
169     char *env = NULL;
170
171     PATH = getenv("PATH");
172
173     env = (char*) MALLOC(sizeof(char) * (strlen(PATH_FORMAT) + strlen(PATH) +
174                                          strlen(DefaultPath) + 1));
175     if (env)
176     {
177         sprintf(env, PATH_FORMAT, DefaultPath, PATH);
178         if (_putenv (env))
179         {
180             bOK = FALSE;
181         }
182         else
183         {
184             bOK = TRUE;
185         }
186         FREE(env);
187         env = NULL;
188     }
189     return bOK;
190 }
191
192 void Set_SOME_ENVIRONMENTS_VARIABLES_FOR_SCILAB(void)
193 {
194 #ifdef _MSC_VER
195     _putenv ("COMPILER=VC++");
196 #endif
197
198     /* WIN32 variable Environment */
199 #ifdef _WIN32
200     _putenv ("WIN32=OK");
201 #endif
202
203     /* WIN64 variable Environment */
204 #ifdef _WIN64
205     _putenv ("WIN64=OK");
206 #endif
207
208     if ( GetSystemMetrics(SM_REMOTESESSION) )
209     {
210         _putenv ("SCILAB_MSTS_SESSION=OK");
211     }
212 }
213
214 void SetScilabEnvironmentVariables(char *DefaultSCIPATH)
215 {
216     if (DefaultSCIPATH)
217     {
218         Set_SOME_ENVIRONMENTS_VARIABLES_FOR_SCILAB();
219         AddScilabBinDirectoryToPATHEnvironnementVariable(DefaultSCIPATH);
220     }
221     else
222     {
223         /* Error */
224         exit(1);
225     }
226
227 }
228 #endif
229
230 /*--------------------------------------------------------------------------*/
231 bool AntislashToSlash(const char *pathwindows, char *pathunix)
232 {
233     return convertSlash(pathwindows, pathunix, false);
234 }
235 /*--------------------------------------------------------------------------*/
236 bool SlashToAntislash(const char *pathunix, char *pathwindows)
237 {
238     return convertSlash(pathunix, pathwindows, true);
239 }
240 /*--------------------------------------------------------------------------*/
241 bool convertSlash(const char *path_in, char *path_out, bool slashToAntislash)
242 {
243     bool bOK = false;
244     if ( (path_in) && (path_out) )
245     {
246         int i = 0;
247         strcpy(path_out, path_in);
248         for (i = 0; i < (int)strlen(path_out); i++)
249         {
250             if ( slashToAntislash )
251             {
252                 if (path_in[i] == UNIX_SEPATATOR)
253                 {
254                     path_out[i] = WINDOWS_SEPATATOR;
255                     bOK = true;
256                 }
257             }
258             else
259             {
260                 if (path_in[i] == WINDOWS_SEPATATOR)
261                 {
262                     path_out[i] = UNIX_SEPATATOR;
263                     bOK = true;
264                 }
265             }
266         }
267     }
268     else
269     {
270         bOK = false;
271     }
272
273     return bOK;
274 }
275
276 /*--------------------------------------------------------------------------*/
277 bool isdir(const char * path)
278 {
279     bool bOK = false;
280 #ifndef _MSC_VER
281     struct stat buf;
282     if (path == NULL)
283     {
284         return false;
285     }
286     if (stat(path, &buf) == 0 && S_ISDIR(buf.st_mode))
287     {
288         bOK = true;
289     }
290 #else
291     if (isDrive(path))
292     {
293         return true;
294     }
295     else
296     {
297         char *pathTmp = NULL;
298         pathTmp = new char[strlen(path) + 1];
299         if (pathTmp)
300         {
301             DWORD attr = 0;
302             strcpy(pathTmp, path);
303             if ( (pathTmp[strlen(pathTmp) - 1] == '\\') || (pathTmp[strlen(pathTmp) - 1] == '/') )
304             {
305                 pathTmp[strlen(pathTmp) - 1] = '\0';
306             }
307             attr = GetFileAttributesA(pathTmp);
308             delete[] pathTmp;
309             pathTmp = NULL;
310             if (attr == INVALID_FILE_ATTRIBUTES)
311             {
312                 return false;
313             }
314             return ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) ? true : false;
315         }
316     }
317 #endif
318     return bOK;
319 }
320
321 bool createdirectory(const char *path)
322 {
323     bool bOK = false;
324 #ifndef _MSC_VER
325     if  (!isdir(path))
326     {
327         if (mkdir(path, DIRMODE) == 0)
328         {
329             bOK = true;
330         }
331     }
332 #else
333     if (CreateDirectoryA(path, NULL))
334     {
335         bOK = true;
336     }
337 #endif
338     return bOK;
339 }
340
341 bool isDrive(const char *strname)
342 {
343     // avoid warning -Werror=unused-parameter
344     (void)strname;
345 #ifdef _MSC_VER
346     if (strname)
347     {
348         if ( ((strlen(strname) == 2) || (strlen(strname) == 3)) && (strname[1] == ':') )
349         {
350             if (strlen(strname) == 3)
351             {
352                 if ( (strname[2] != '\\') && (strname[2] != '/') )
353                 {
354                     return false;
355                 }
356             }
357
358             if ( ( strname[0] >= 'A' && strname[0] <= 'Z' ) || ( strname[0] >= 'a' && strname[0] <= 'z' ) )
359             {
360                 return true;
361             }
362         }
363     }
364 #endif
365     return false;
366 }
367