33e82a5fba2605cbf4a830fb609cddf7ae505923
[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     return bOK;
156 }
157
158 static BOOL AddScilabBinDirectoryToPATHEnvironnementVariable(char *DefaultPath)
159 {
160 #define PATH_FORMAT "PATH=%s/bin;%s"
161
162     BOOL bOK = FALSE;
163     char *PATH = NULL;
164     char *env = NULL;
165
166     PATH = getenv("PATH");
167
168     env = (char*) MALLOC(sizeof(char) * (strlen(PATH_FORMAT) + strlen(PATH) +
169                                          strlen(DefaultPath) + 1));
170     if (env)
171     {
172         sprintf(env, PATH_FORMAT, DefaultPath, PATH);
173         if (_putenv (env))
174         {
175             bOK = FALSE;
176         }
177         else
178         {
179             bOK = TRUE;
180         }
181         FREE(env);
182         env = NULL;
183     }
184     return bOK;
185 }
186
187 void Set_SOME_ENVIRONMENTS_VARIABLES_FOR_SCILAB(void)
188 {
189 #ifdef _MSC_VER
190     _putenv ("COMPILER=VC++");
191 #endif
192
193     /* WIN32 variable Environment */
194 #ifdef _WIN32
195     _putenv ("WIN32=OK");
196 #endif
197
198     /* WIN64 variable Environment */
199 #ifdef _WIN64
200     _putenv ("WIN64=OK");
201 #endif
202
203     if ( GetSystemMetrics(SM_REMOTESESSION) )
204     {
205         _putenv ("SCILAB_MSTS_SESSION=OK");
206     }
207 }
208
209 void SetScilabEnvironmentVariables(char *DefaultSCIPATH)
210 {
211     if (DefaultSCIPATH)
212     {
213         Set_SOME_ENVIRONMENTS_VARIABLES_FOR_SCILAB();
214         AddScilabBinDirectoryToPATHEnvironnementVariable(DefaultSCIPATH);
215     }
216     else
217     {
218         /* Error */
219         exit(1);
220     }
221
222 }
223 #endif
224
225 /*--------------------------------------------------------------------------*/
226 bool AntislashToSlash(const char *pathwindows, char *pathunix)
227 {
228     return convertSlash(pathwindows, pathunix, false);
229 }
230 /*--------------------------------------------------------------------------*/
231 bool SlashToAntislash(const char *pathunix, char *pathwindows)
232 {
233     return convertSlash(pathunix, pathwindows, true);
234 }
235 /*--------------------------------------------------------------------------*/
236 bool convertSlash(const char *path_in, char *path_out, bool slashToAntislash)
237 {
238     bool bOK = false;
239     if ( (path_in) && (path_out) )
240     {
241         int i = 0;
242         strcpy(path_out, path_in);
243         for (i = 0; i < (int)strlen(path_out); i++)
244         {
245             if ( slashToAntislash )
246             {
247                 if (path_in[i] == UNIX_SEPATATOR)
248                 {
249                     path_out[i] = WINDOWS_SEPATATOR;
250                     bOK = true;
251                 }
252             }
253             else
254             {
255                 if (path_in[i] == WINDOWS_SEPATATOR)
256                 {
257                     path_out[i] = UNIX_SEPATATOR;
258                     bOK = true;
259                 }
260             }
261         }
262     }
263     else
264     {
265         bOK = false;
266     }
267
268     return bOK;
269 }
270
271 /*--------------------------------------------------------------------------*/
272 bool isdir(const char * path)
273 {
274     bool bOK = false;
275 #ifndef _MSC_VER
276     struct stat buf;
277     if (path == NULL)
278     {
279         return false;
280     }
281     if (stat(path, &buf) == 0 && S_ISDIR(buf.st_mode))
282     {
283         bOK = true;
284     }
285 #else
286     if (isDrive(path))
287     {
288         return true;
289     }
290     else
291     {
292         char *pathTmp = NULL;
293         pathTmp = new char[strlen(path) + 1];
294         if (pathTmp)
295         {
296             DWORD attr = 0;
297             strcpy(pathTmp, path);
298             if ( (pathTmp[strlen(pathTmp) - 1] == '\\') || (pathTmp[strlen(pathTmp) - 1] == '/') )
299             {
300                 pathTmp[strlen(pathTmp) - 1] = '\0';
301             }
302             attr = GetFileAttributesA(pathTmp);
303             delete[] pathTmp;
304             pathTmp = NULL;
305             if (attr == INVALID_FILE_ATTRIBUTES)
306             {
307                 return false;
308             }
309             return ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) ? true : false;
310         }
311     }
312 #endif
313     return bOK;
314 }
315
316 bool createdirectory(const char *path)
317 {
318     bool bOK = false;
319 #ifndef _MSC_VER
320     if  (!isdir(path))
321     {
322         if (mkdir(path, DIRMODE) == 0)
323         {
324             bOK = true;
325         }
326     }
327 #else
328     if (CreateDirectoryA(path, NULL))
329     {
330         bOK = true;
331     }
332 #endif
333     return bOK;
334 }
335
336 bool isDrive(const char *strname)
337 {
338     // avoid warning -Werror=unused-parameter
339     (void)strname;
340 #ifdef _MSC_VER
341     if (strname)
342     {
343         if ( ((strlen(strname) == 2) || (strlen(strname) == 3)) && (strname[1] == ':') )
344         {
345             if (strlen(strname) == 3)
346             {
347                 if ( (strname[2] != '\\') && (strname[2] != '/') )
348                 {
349                     return false;
350                 }
351             }
352
353             if ( ( strname[0] >= 'A' && strname[0] <= 'Z' ) || ( strname[0] >= 'a' && strname[0] <= 'z' ) )
354             {
355                 return true;
356             }
357         }
358     }
359 #endif
360     return false;
361 }
362