Ticket #225: env_ini.patch

File env_ini.patch, 3.4 KB (added by ydario, 5 years ago)

Read env from USER_INI

  • __initdll.c

     
    1717#include "libc-alias.h"
    1818#define INCL_DOS
    1919#define INCL_FSMACROS
     20#define INCL_WINSHELLDATA
    2021#include <os2emx.h>
    2122#define _osmajor __osminor
    2223#define _osminor __osminor
     
    7980static int initdllForkChild1(__LIBC_PFORKHANDLE pForkHandle, __LIBC_FORKOP enmOperation);
    8081static int initdllForkTLM(__LIBC_PFORKHANDLE pForkHandle, void *pvArg, size_t cbArg);
    8182
     83int __sys_init_environ_ini(char* appkey, ULONG ulSize) {
    8284
     85    PBYTE pData, pValue;
     86    PBYTE pKey;
     87    ULONG ulApp, ulValue;
     88
     89    // query enumeration data
     90    pData = malloc( ulSize);
     91    ulApp = PrfQueryProfileString( HINI_USERPROFILE, appkey, NULL, "", pData, ulSize);
     92    // size includes also 0-terminator
     93    if (ulApp == 0 || ulApp == 1) {
     94        free( pData);
     95        return 0;
     96    }
     97
     98    // data buffer is a null terminated array (double null at end)
     99    pKey = pData;
     100    while (*pKey) {
     101
     102        // query key value
     103        if (PrfQueryProfileSize( HINI_USERPROFILE, appkey, pKey, &ulValue) && ulValue) {
     104            pValue = malloc( ulValue);
     105            PrfQueryProfileString( HINI_USERPROFILE, appkey, pKey, "", pValue, ulValue);
     106            // if empty value, remove from environment
     107            if (*pValue == 0)
     108                unsetenv( pKey);
     109            else
     110                // add/overwrite to current environment
     111                setenv( pKey, pValue, 1);
     112            free( pValue);
     113        }
     114
     115        // get next variable
     116        while(*pKey)
     117            pKey++;
     118        pKey++;
     119    }
     120
     121    //done
     122    return 0;
     123}
     124
     125int _sys_init_environ_ini(void) {
     126    HAB        hab;
     127    ULONG    ulSize = 0L;
     128    APIRET    rc;
     129    PPIB        pib;
     130    CHAR      Buff[_MAX_PATH];
     131    CHAR      AppKey[_MAX_PATH+10];
     132    char        fname[_MAX_FNAME], ext[_MAX_EXT];
     133
     134    // enumerate LIBC global key
     135    if (PrfQueryProfileSize( HINI_USERPROFILE, "KLIBC", NULL, &ulSize) && ulSize) {
     136        rc = __sys_init_environ_ini( "KLIBC", ulSize);
     137    }
     138   
     139    // get executable fullpath
     140    rc = DosGetInfoBlocks( NULL, &pib);
     141    rc = DosQueryModuleName( pib->pib_hmte, sizeof(Buff), Buff);
     142    // extract path info
     143    _splitpath( Buff, NULL, NULL, fname, ext);
     144
     145    // enumerate LIBC process key
     146    strcpy( AppKey, "KLIBC_");
     147    strcat( AppKey, fname);
     148    strcat( AppKey, ext);
     149    if (PrfQueryProfileSize( HINI_USERPROFILE, AppKey, NULL, &ulSize) && ulSize) {
     150        rc = __sys_init_environ_ini( AppKey, ulSize);
     151    }
     152
     153    // enumerate LIBC process full path key
     154    strcpy( AppKey, "KLIBC_");
     155    strcat( AppKey, Buff);
     156    if (PrfQueryProfileSize( HINI_USERPROFILE, AppKey, NULL, &ulSize) && ulSize) {
     157        rc = __sys_init_environ_ini( AppKey, ulSize);
     158    }
     159
     160    // done
     161    return 0;
     162}
     163
     164
    83165/**
    84166 * Common init code for crt0 and dll0.
    85167 * This should perhaps be a part of _CRT_init.
     
    178260    }
    179261
    180262    /*
     263     * Setup environment using INI values
     264     */
     265    rc = _sys_init_environ_ini();
     266    if (rc)
     267    {
     268        LIBC_ASSERTM_FAILED("_sys_init_environ_ini() failed\n");
     269        return -1;
     270    }
     271
     272    /*
    181273     * Get the current process.
    182274     */
    183275    pSelf = __libc_spmSelf();