Changeset 21302 for trunk/src/kernel32/environ.cpp
- Timestamp:
- Jun 18, 2009, 11:53:26 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/environ.cpp
r7858 r21302 25 25 #include <winnls.h> 26 26 #include <stdlib.h> 27 #include <stdio.h> 27 28 #include <string.h> 28 29 #include <heapstring.h> … … 38 39 39 40 41 //list of important OS/2 environment variables that must not be removed 42 //when creating a new process 43 static char *lpReservedEnvStrings[] = { 44 "HOSTNAME", 45 "TZ", 46 "USE_HOSTS_FIRST", 47 "MMBASE", 48 "USER_INI", 49 "SYSTEM_INI", 50 "DPATH", 51 "LANG", 52 "NCDEBUG", 53 "NLSPATH", 54 "TCPLANG", 55 "DLSINI", 56 "INIT_FILE_NAMES", 57 "INIT_FILE_RANGES", 58 "NWDBPATH", 59 "ETC", 60 "WP_OBJHANDLE", 61 "SOMIR", 62 "SOMDDIR", 63 "TMP", 64 "TEMP", 65 }; 66 67 //****************************************************************************** 68 //****************************************************************************** 69 void InitEnvironment() 70 { 71 CHAR szVar[512]; 72 static BOOL fInit = FALSE; 73 74 if(fInit) return; 75 76 //TEMP is a standard environment variable in Windows, but is not always 77 //present in OS/2, so make sure it is. 78 if(GetEnvironmentVariableA("TEMP", szVar, sizeof(szVar)) == 0) 79 { 80 if(GetEnvironmentVariableA("TMP", szVar, sizeof(szVar)) == 0) { 81 //then we just use the windows directory for garbage 82 GetWindowsDirectoryA(szVar, sizeof(szVar)); 83 } 84 SetEnvironmentVariableA("TEMP", szVar); 85 } 86 } 40 87 //****************************************************************************** 41 88 //****************************************************************************** 42 89 LPSTR WIN32API GetEnvironmentStringsA() 43 90 { 91 InitEnvironment(); 44 92 return (LPSTR) O32_GetEnvironmentStrings(); 45 93 } … … 52 100 LPWSTR wenvstrings; 53 101 int len, i; 102 103 InitEnvironment(); 54 104 55 105 if(envstrings == NULL) … … 64 114 } 65 115 len++; //terminating 0 66 wenvstrings = (LPWSTR)malloc(len*sizeof(WCHAR)); 67 for(i=0; 68 i<len; 69 i++) 116 wenvstrings = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); 117 for(i=0;i<len;i++) 70 118 { 71 119 wenvstrings[i] = envstrings[i]; … … 83 131 BOOL WIN32API FreeEnvironmentStringsW(LPWSTR envstrings) 84 132 { 85 free(envstrings);133 HeapFree(GetProcessHeap(), 0, envstrings); 86 134 return(TRUE); 87 135 } … … 283 331 } 284 332 //****************************************************************************** 285 //****************************************************************************** 333 // Create a new process environment block based on input from the application 334 // Make sure important OS/2 variables are added or else some services might 335 // fail in the child process. (gethostname relies on SET HOSTNAME) 336 //****************************************************************************** 337 char *CreateNewEnvironment(char *lpEnvironment) 338 { 339 char *tmpenvold = lpEnvironment; 340 char *tmpenvnew, *newenv; 341 int newsize = 0, len; 342 343 dprintf(("New environment:")); 344 while(*tmpenvold) { 345 dprintf(("%s", tmpenvold)); 346 len = strlen(tmpenvold); 347 newsize += len+1; 348 tmpenvold += len+1; 349 } 350 newsize++; //extra null terminator 351 352 for(int i=0;i<sizeof(lpReservedEnvStrings)/sizeof(char *);i++) { 353 if(!ENV_FindVariable(lpEnvironment, lpReservedEnvStrings[i], strlen(lpReservedEnvStrings[i]))) { 354 len = GetEnvironmentVariableA(lpReservedEnvStrings[i], NULL, 0); 355 if(len) { 356 newsize += strlen(lpReservedEnvStrings[i]) + 1 + len+1; //var = value \0 357 } 358 } 359 } 360 newsize++; //extra 0 terminator 361 362 newenv = (char *)malloc(newsize); 363 if(newenv == NULL) { 364 DebugInt3(); 365 return NULL; 366 } 367 memset(newenv, 0, newsize); 368 tmpenvold = (char *)lpEnvironment; 369 tmpenvnew = newenv; 370 while(*tmpenvold) { 371 strcat(tmpenvnew, tmpenvold); 372 len = strlen(tmpenvnew); 373 tmpenvnew += len+1; 374 tmpenvold += len+1; 375 } 376 for(i=0;i<sizeof(lpReservedEnvStrings)/sizeof(char *);i++) { 377 if(!ENV_FindVariable(lpEnvironment, lpReservedEnvStrings[i], strlen(lpReservedEnvStrings[i]))) { 378 len = GetEnvironmentVariableA(lpReservedEnvStrings[i], NULL, 0); 379 if(len) { 380 char *tmp = (char *)malloc(len+1); 381 len = GetEnvironmentVariableA(lpReservedEnvStrings[i], tmp, len+1); 382 if(len) { 383 sprintf(tmpenvnew, "%s=%s", lpReservedEnvStrings[i], tmp); 384 tmpenvnew += strlen(tmpenvnew) + 1; 385 } 386 free(tmp); 387 } 388 } 389 } 390 *tmpenvnew = 0; //final null terminator 391 392 #ifdef DEBUG 393 tmpenvnew = newenv; 394 dprintf(("Combined new environment:")); 395 while(*tmpenvnew) { 396 dprintf(("%s", tmpenvnew)); 397 len = strlen(tmpenvnew); 398 tmpenvnew += len+1; 399 } 400 #endif 401 return newenv; 402 } 403 //****************************************************************************** 404 //******************************************************************************
Note:
See TracChangeset
for help on using the changeset viewer.