fix linux startup after fcddafe
[scilab.git] / scilab / modules / windows_tools / src / cpp / scilab_windows / SetScilabEnvironmentVariables.cpp
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) INRIA - Allan CORNET
4 * Copyright (C) DIGITEO - 2010 - Allan CORNET
5 *
6  * Copyright (C) 2012 - 2016 - Scilab Enterprises
7  *
8  * This file is hereby licensed under the terms of the GNU GPL v2.0,
9  * pursuant to article 5.3.4 of the CeCILL v.2.1.
10  * This file was originally licensed under the terms of the CeCILL v2.1,
11  * and continues to be available under such terms.
12  * For more information, see the COPYING file which you should have received
13  * along with this program.
14 *
15 */
16
17 /*--------------------------------------------------------------------------*/
18 #include <windows.h>
19 #include <stdio.h>
20 extern "C"
21 {
22 #include "SetScilabEnvironmentVariables.h"
23 #include "PATH_MAX.h"
24 #include "sci_path.h"
25 #include "sci_malloc.h"
26 #include "getScilabDirectory.h"
27 #include "scilabDefaults.h"
28 #include "ConvertSlash.h"
29 #include "charEncoding.h"
30 #include "getshortpathname.h"
31 #include "stristr.h"
32 #include "strsubst.h"
33 #include "os_string.h"
34 }
35 /*--------------------------------------------------------------------------*/
36 static BOOL IsTheGoodShell(void);
37 static BOOL Set_Shell(void);
38 static BOOL Set_SCI_PATH(char *DefaultPath);
39 static BOOL Set_HOME_PATH(char *DefaultPath);
40 static BOOL AddScilabBinDirectoryToPATHEnvironnementVariable(char *DefaultPath);
41 static BOOL Set_SOME_ENVIRONMENTS_VARIABLES_FOR_SCILAB(void);
42 /*--------------------------------------------------------------------------*/
43 /**
44 * Set some environment variablesSCI, and some others
45 */
46 void SciEnvForWindows(void)
47 {
48     char *SCIPathName = getScilabDirectory(TRUE);
49
50     /* Correction Bug 1579 */
51     if (!IsTheGoodShell())
52     {
53         if ( (!Set_Shell()) || (!IsTheGoodShell()))
54         {
55             MessageBox(NULL,
56                        "Please modify ""ComSpec"" environment variable.\ncmd.exe on W2K and more.",
57                        "Warning", MB_ICONWARNING | MB_OK);
58         }
59     }
60
61     SetScilabEnvironmentVariables(SCIPathName);
62     if (SCIPathName)
63     {
64         FREE(SCIPathName);
65         SCIPathName = NULL;
66     }
67 }
68 /*--------------------------------------------------------------------------*/
69 /* set env variables (used when calling scilab from * other programs) */
70 void SetScilabEnvironmentVariables(char *DefaultSCIPATH)
71 {
72     if (DefaultSCIPATH)
73     {
74         Set_SCI_PATH(DefaultSCIPATH);
75         Set_HOME_PATH(DefaultSCIPATH);
76         Set_SOME_ENVIRONMENTS_VARIABLES_FOR_SCILAB();
77         AddScilabBinDirectoryToPATHEnvironnementVariable(DefaultSCIPATH);
78     }
79     else
80     {
81         /* Error */
82         exit(1);
83     }
84
85 }
86 /*--------------------------------------------------------------------------*/
87 BOOL Set_SCI_PATH(char *DefaultPath)
88 {
89     BOOL bOK = FALSE;
90     char *ShortPath = NULL;
91
92     /* to be sure that it's unix 8.3 format */
93     /* c:/progra~1/scilab-5.0 */
94     ShortPath = getshortpathname(DefaultPath, &bOK);
95     if (ShortPath)
96     {
97         char env[PATH_MAX + 1 + 10];
98         AntislashToSlash(ShortPath, ShortPath);
99
100         sprintf (env, "SCI=%s", ShortPath);
101         setSCI(ShortPath);
102
103         if (ShortPath)
104         {
105             FREE(ShortPath);
106             ShortPath = NULL;
107         }
108
109         if (_putenv (env))
110         {
111             bOK = FALSE;
112         }
113         else
114         {
115             bOK = TRUE;
116         }
117     }
118     return bOK;
119 }
120 /*--------------------------------------------------------------------------*/
121 BOOL Set_HOME_PATH(char *DefaultPath)
122 {
123     wchar_t *wHOME = _wgetenv(L"HOME");
124     if (wHOME == NULL)
125     {
126         wchar_t *wUserProfile = _wgetenv(L"USERPROFILE");
127         if (wUserProfile)
128         {
129             return SetEnvironmentVariableW(L"HOME", wUserProfile);
130         }
131         else
132         {
133             /* if USERPROFILE is not defined , we use default profile */
134             wchar_t *wAllUsersProfile = _wgetenv(L"ALLUSERSPROFILE");
135             if (wAllUsersProfile)
136             {
137                 return SetEnvironmentVariableW(L"HOME", wUserProfile);
138             }
139             else
140             {
141                 BOOL bRes = FALSE;
142                 wchar_t *wDefault = to_wide_string(DefaultPath);
143                 if (wDefault)
144                 {
145                     bRes = SetEnvironmentVariableW(L"HOME", wDefault);
146                     FREE(wDefault);
147                     wDefault = NULL;
148                 }
149                 return bRes;
150             }
151         }
152     }
153     return TRUE;
154 }
155 /*--------------------------------------------------------------------------*/
156 BOOL Set_SOME_ENVIRONMENTS_VARIABLES_FOR_SCILAB(void)
157 {
158     BOOL bOK = TRUE;
159
160 #ifdef _MSC_VER
161     _putenv ("COMPILER=VC++");
162 #endif
163
164     /* WIN32 variable Environment */
165 #ifdef _WIN32
166     _putenv ("WIN32=OK");
167 #endif
168
169     /* WIN64 variable Environment */
170 #ifdef _WIN64
171     _putenv ("WIN64=OK");
172 #endif
173
174     if ( GetSystemMetrics(SM_REMOTESESSION) )
175     {
176         _putenv ("SCILAB_MSTS_SESSION=OK");
177     }
178
179     return bOK;
180 }
181 /*--------------------------------------------------------------------------*/
182 BOOL IsTheGoodShell(void)
183 {
184     char shellCmd[PATH_MAX];
185     char drive[_MAX_DRIVE];
186     char dir[_MAX_DIR];
187     char fname[_MAX_FNAME];
188     char ext[_MAX_EXT];
189
190     strcpy(shellCmd, "");
191     strcpy(fname, "");
192     GetEnvironmentVariable("ComSpec", shellCmd, PATH_MAX);
193     os_splitpath(shellCmd, drive, dir, fname, ext);
194
195     if (_stricmp(fname, "cmd") == 0)
196     {
197         return TRUE;
198     }
199
200     return FALSE;
201 }
202 /*--------------------------------------------------------------------------*/
203 BOOL Set_Shell(void)
204 {
205     BOOL bOK = FALSE;
206     char env[_MAX_DRIVE + _MAX_DIR + _MAX_FNAME + _MAX_EXT + 10];
207     char *WINDIRPATH = NULL;
208
209     WINDIRPATH = getenv ("SystemRoot");
210     sprintf(env, "ComSpec=%s\\system32\\cmd.exe", WINDIRPATH);
211
212     if (_putenv (env))
213     {
214         bOK = FALSE;
215     }
216     else
217     {
218         bOK = TRUE;
219     }
220
221     if (WINDIRPATH)
222     {
223         FREE(WINDIRPATH);
224         WINDIRPATH = NULL;
225     }
226     return bOK;
227 }
228 /*--------------------------------------------------------------------------*/
229 static BOOL AddScilabBinDirectoryToPATHEnvironnementVariable(char *DefaultPath)
230 {
231 #define SCILAB_BIN_PATH "%s/bin"
232 #define NEW_PATH "PATH=%s;%s"
233
234     BOOL bOK = FALSE;
235     char *PATH = NULL;
236     char *env = NULL;
237     char scilabBinPath[MAX_PATH];
238     char *scilabBinPathConverted;
239
240     PATH = getenv("PATH");
241
242     env = (char*) MALLOC(sizeof(char) * (strlen(NEW_PATH) + strlen(PATH) +
243                                          strlen(DefaultPath) + 1));
244     if (env)
245     {
246         sprintf(scilabBinPath, SCILAB_BIN_PATH, DefaultPath);
247
248         scilabBinPathConverted = (char*) MALLOC(MAX_PATH * sizeof(char));
249 #ifdef _MSC_VER
250         scilabBinPathConverted = strsub(scilabBinPath, "/", "\\");
251 #else
252         scilabBinPathConverted = strdup(scilabBinPath);
253 #endif
254         if (stristr(PATH, scilabBinPathConverted) == 0)
255         {
256             sprintf(env, NEW_PATH, scilabBinPathConverted, PATH);
257             if (_putenv (env))
258             {
259                 bOK = FALSE;
260             }
261             else
262             {
263                 bOK = TRUE;
264             }
265             FREE(env);
266             env = NULL;
267         }
268
269         FREE(scilabBinPathConverted);
270     }
271     return bOK;
272 }
273 /*--------------------------------------------------------------------------*/