Changeset 2463 for trunk/ash/var.c


Ignore:
Timestamp:
Nov 19, 2005, 4:58:38 PM (20 years ago)
Author:
bird
Message:

OS/2 changes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ash/var.c

    r2462 r2463  
    4747#include <paths.h>
    4848
     49#ifdef PC_OS2_LIBPATHS
     50#define INCL_BASE
     51#include <os2.h>
     52
     53#ifndef LIBPATHSTRICT
     54#define LIBPATHSTRICT 3
     55#endif
     56
     57extern APIRET
     58#ifdef APIENTRY
     59    APIENTRY
     60#endif
     61    DosQueryHeaderInfo(HMODULE hmod, ULONG ulIndex, PVOID pvBuffer, ULONG cbBuffer, ULONG ulSubFunction);
     62#define QHINF_EXEINFO       1 /* NE exeinfo. */
     63#define QHINF_READRSRCTBL   2 /* Reads from the resource table. */
     64#define QHINF_READFILE      3 /* Reads from the executable file. */
     65#define QHINF_LIBPATHLENGTH 4 /* Gets the libpath length. */
     66#define QHINF_LIBPATH       5 /* Gets the entire libpath. */
     67#define QHINF_FIXENTRY      6 /* NE only */
     68#define QHINF_STE           7 /* NE only */
     69#define QHINF_MAPSEL        8 /* NE only */
     70
     71#endif
     72
     73
    4974/*
    5075 * Shell variables.
     
    101126struct var vvers;
    102127struct var voptind;
     128
     129#ifdef PC_OS2_LIBPATHS
     130static struct var libpath_vars[4];
     131static const char *libpath_envs[4] = {"LIBPATH=", "BEGINLIBPATH=", "ENDLIBPATH=", "LIBPATHSTRICT="};
     132#endif
    103133
    104134const struct varinit varinit[] = {
     
    173203        struct var **vpp;
    174204
     205#ifdef PC_OS2_LIBPATHS
     206        char *psz = ckmalloc(2048);
     207        int rc;
     208        int i;
     209        for (i = 0; i < 4; i++)
     210        {
     211            libpath_vars[i].flags = VSTRFIXED | VOS2LIBPATH;
     212            libpath_vars[i].func = NULL;
     213
     214            if (i > 0)
     215                rc = DosQueryExtLIBPATH(psz, i);
     216            else
     217            {
     218                rc = DosQueryHeaderInfo(NULLHANDLE, 0, psz, 2048, QHINF_LIBPATH);
     219                libpath_vars[i].flags |= VREADONLY;
     220            }
     221            if (!rc && *psz)
     222            {
     223                int cch1 = strlen(libpath_envs[i]);
     224                int cch2 = strlen(psz) + 1;
     225                libpath_vars[i].text = ckmalloc(cch1 + cch2);
     226                memcpy(libpath_vars[i].text, libpath_envs[i], cch1);
     227                memcpy(libpath_vars[i].text + cch1, psz, cch2);
     228            }
     229            else
     230            {
     231                libpath_vars[i].flags |= VUNSET | VTEXTFIXED;
     232                libpath_vars[i].text = (char*)libpath_envs[i];
     233            }
     234            if (find_var(libpath_vars[i].text, &vpp, &libpath_vars[i].name_len) != NULL)
     235                    continue;
     236            libpath_vars[i].next = *vpp;
     237            *vpp = &libpath_vars[i];
     238        }
     239        free(psz);
     240#endif
     241
    175242        for (ip = varinit ; (vp = ip->var) != NULL ; ip++) {
    176243                if (find_var(ip->text, &vpp, &vp->name_len) != NULL)
     
    300367                vp->flags |= flags & ~VNOFUNC;
    301368                vp->text = s;
     369#ifdef PC_OS2_LIBPATHS
     370                if ((vp->flags & VOS2LIBPATH) && (vp->flags & VEXPORT))
     371                    vp->flags &= ~VEXPORT;
     372#endif
    302373
    303374                /*
     
    420491        }
    421492        *ep = NULL;
     493
     494#ifdef PC_OS2_LIBPATHS
     495        /*
     496         * Set the libpaths now as this is exec() time.
     497         */
     498        for (nenv = 0; nenv < 3; nenv++)
     499            DosSetExtLIBPATH(strchr(libpath_vars[nenv].text, '=') + 1, nenv);
     500#endif
     501
    422502        return env;
    423503}
Note: See TracChangeset for help on using the changeset viewer.