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