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