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