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