Ignore:
Timestamp:
Jun 18, 2009, 11:53:26 AM (16 years ago)
Author:
ydario
Message:

Kernel32 updates.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/environ.cpp

    r7858 r21302  
    2525#include <winnls.h>
    2626#include <stdlib.h>
     27#include <stdio.h>
    2728#include <string.h>
    2829#include <heapstring.h>
     
    3839
    3940
     41//list of important OS/2 environment variables that must not be removed
     42//when creating a new process
     43static 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//******************************************************************************
     69void 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}
    4087//******************************************************************************
    4188//******************************************************************************
    4289LPSTR WIN32API GetEnvironmentStringsA()
    4390{
     91  InitEnvironment();
    4492  return (LPSTR) O32_GetEnvironmentStrings();
    4593}
     
    52100  LPWSTR wenvstrings;
    53101  int len, i;
     102
     103  InitEnvironment();
    54104
    55105  if(envstrings == NULL)
     
    64114  }
    65115  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++)
    70118  {
    71119     wenvstrings[i] = envstrings[i];
     
    83131BOOL WIN32API FreeEnvironmentStringsW(LPWSTR envstrings)
    84132{
    85   free(envstrings);
     133  HeapFree(GetProcessHeap(), 0, envstrings);
    86134  return(TRUE);
    87135}
     
    283331}
    284332//******************************************************************************
    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//******************************************************************************
     337char *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.