8d0550116cab03e9392f0159532199236ff1fb5f
[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     /* Correction Bug 1579 */
80     if (!IsTheGoodShell())
81     {
82         if ( (!Set_Shell()) || (!IsTheGoodShell()))
83         {
84             cout << "Please modify ""ComSpec"" environment variable." << endl << "cmd.exe on W2K and more." << endl;
85         }
86     }
87 }
88 #endif
89
90 #ifdef _MSC_VER
91 /*--------------------------------------------------------------------------*/
92 bool IsTheGoodShell(void)
93 {
94     bool bOK=false;
95     char shellCmd[PATH_MAX];
96     char drive[_MAX_DRIVE];
97     char dir[_MAX_DIR];
98     char fname[_MAX_FNAME];
99     char ext[_MAX_EXT];
100
101     strcpy(shellCmd,"");
102     strcpy(fname,"");
103     GetEnvironmentVariable("ComSpec", shellCmd, PATH_MAX);
104     _splitpath(shellCmd,drive,dir,fname,ext);
105
106     if (_stricmp(fname,"cmd")==0) bOK=true;
107
108     return bOK;
109 }
110
111 /*--------------------------------------------------------------------------*/
112 bool Set_Shell(void)
113 {
114     bool bOK=false;
115     char env[_MAX_DRIVE+_MAX_DIR+_MAX_FNAME+_MAX_EXT+10];
116     char *WINDIRPATH=NULL;
117
118     WINDIRPATH=getenv ("SystemRoot");
119     sprintf(env,"ComSpec=%s\\system32\\cmd.exe",WINDIRPATH);
120
121     if (putenv (env))
122     {
123         bOK=false;
124     }
125     else
126     {
127         bOK=true;
128     }
129
130     if(WINDIRPATH)
131     {
132         delete[] WINDIRPATH;
133         WINDIRPATH = NULL;
134     }
135     return bOK;
136 }
137 #endif
138
139 /*--------------------------------------------------------------------------*/
140 bool AntislashToSlash(const char *pathwindows,char *pathunix)
141 {
142     return convertSlash(pathwindows,pathunix,false);
143 }
144 /*--------------------------------------------------------------------------*/
145 bool SlashToAntislash(const char *pathunix, char *pathwindows)
146 {
147     return convertSlash(pathunix, pathwindows, true);
148 }
149 /*--------------------------------------------------------------------------*/
150 bool convertSlash(const char *path_in,char *path_out,bool slashToAntislash)
151 {
152     bool bOK = false;
153     if ( (path_in) && (path_out) )
154     {
155         int i=0;
156         strcpy(path_out,path_in);
157         for (i=0;i<(int)strlen(path_out);i++)
158         {
159             if ( slashToAntislash )
160             {
161                 if (path_in[i] == UNIX_SEPATATOR)
162                 {
163                     path_out[i] = WINDOWS_SEPATATOR;
164                     bOK = true;
165                 }
166             }
167             else
168             {
169                 if (path_in[i] == WINDOWS_SEPATATOR)
170                 {
171                     path_out[i] = UNIX_SEPATATOR;
172                     bOK = true;
173                 }
174             }
175         }
176     }
177     else bOK = false;
178
179     return bOK;
180 }
181
182 /*--------------------------------------------------------------------------*/
183 char *getshortpathname(const char *longpathname,bool *convertok)
184 {
185     char *ShortName = NULL;
186
187     if (longpathname)
188     {
189 #ifdef _MSC_VER
190         /* first we try to call to know path length */
191         int length = GetShortPathName(longpathname, NULL, 0);
192
193         if (length <= 0 ) length = MAX_PATH_SHORT;
194
195         ShortName = new char[length];
196
197         if (ShortName)
198         {
199             /* second converts path */
200             if ( GetShortPathName(longpathname, ShortName, length) )
201             {
202                 *convertok = true;
203             }
204             else
205             {
206                 /* FAILED */
207                 strcpy(ShortName, longpathname);
208                 *convertok = false;
209             }
210         }
211         else
212         {
213             /* FAILED */
214             *convertok = false;
215         }
216 #else
217         /* Linux */
218         int length = (int)strlen(longpathname) + 1;
219         ShortName = new char[length];
220         if(ShortName) 
221         {
222             strcpy(ShortName, longpathname);
223         }
224
225         *convertok = false;
226 #endif
227     }
228     else
229     {
230         /* FAILED */
231         *convertok = false;
232     }
233     return ShortName;
234 }
235
236 bool isdir(const char * path)
237 {
238     bool bOK = false;
239 #ifndef _MSC_VER
240     struct stat buf;
241     if (path == NULL) return false;
242     if (stat(path, &buf) == 0 && S_ISDIR(buf.st_mode)) bOK=true;
243 #else
244     if (isDrive(path)) return true;
245     else
246     {
247         char *pathTmp = NULL;
248         pathTmp = new char[strlen(path) + 1];
249         if (pathTmp)
250         {
251             DWORD attr = 0;
252             strcpy(pathTmp,path);
253             if ( (pathTmp[strlen(pathTmp)-1]=='\\') || (pathTmp[strlen(pathTmp)-1]=='/') )
254             {
255                 pathTmp[strlen(pathTmp)-1]='\0';
256             }
257             attr = GetFileAttributes(pathTmp);
258             delete[] pathTmp;
259             pathTmp = NULL;
260             if (attr == INVALID_FILE_ATTRIBUTES) return false;
261             return ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) ? true : false;
262         }
263     }
264 #endif
265     return bOK;
266 }
267
268 bool createdirectory(const char *path)
269 {
270     bool bOK=false;
271 #ifndef _MSC_VER
272     if  (!isdir(path))
273     {
274         if (mkdir(path, DIRMODE) == 0) bOK=true;
275     }
276 #else
277     if (CreateDirectory(path,NULL)) bOK=true;
278 #endif
279     return bOK;
280 }
281
282 bool isDrive(const char *strname)
283 {
284 #ifdef _MSC_VER
285     if (strname)
286     {
287         if ( ((strlen(strname) == 2) || (strlen(strname) == 3)) && (strname[1]== ':') )
288         {
289             if (strlen(strname) == 3)
290             {
291                 if ( (strname[2]!= '\\') && (strname[2]!= '/') )
292                 {
293                     return false;
294                 }
295             }
296
297             if ( ( strname[0] >= 'A' && strname[0] <= 'Z' ) || ( strname[0] >= 'a' && strname[0] <= 'z' ) )
298             {
299                 return true;
300             }
301         }
302     }
303 #endif
304     return false;
305 }
306