예제 #1
0
파일: os2.c 프로젝트: montao/openshell
static void
init_extlibpath(void)
{
	const char *vars[] = {
		"BEGINLIBPATH",
		"ENDLIBPATH",
		"LIBPATHSTRICT",
		NULL
	};
	char val[512];
	int flag;

	for (flag = 0; vars[flag]; flag++) {
		DosQueryExtLIBPATH(val, flag + 1);
		if (val[0])
			setenv(vars[flag], val, 1);
	}
}
예제 #2
0
파일: var.c 프로젝트: dezelin/kBuild
void
initvar(shinstance *psh)
{
    const struct varinit *ip;
    struct var *vp;
    struct var **vpp;
#ifdef PC_OS2_LIBPATHS
    char *psz = ckmalloc(psh, 2048);
    int rc;
    int i;

    for (i = 0; i < 4; i++)
    {
        psh->libpath_vars[i].flags = VSTRFIXED | VOS2LIBPATH;
        psh->libpath_vars[i].func = NULL;

        if (i > 0)
        {
            psz[0] = psz[1] = psz[2] = psz[3] = '\0';
            rc = DosQueryExtLIBPATH(psz, i);
        }
        else
        {
            rc = DosQueryHeaderInfo(NULLHANDLE, 0, psz, 2048, QHINF_LIBPATH);
            psh->libpath_vars[i].flags |= VREADONLY;
        }
        if (!rc && *psz)
        {
            int cch1 = strlen(libpath_envs[i]);
            int cch2 = strlen(psz) + 1;
            psh->libpath_vars[i].text = ckmalloc(psh, cch1 + cch2);
            memcpy(psh->libpath_vars[i].text, libpath_envs[i], cch1);
            memcpy(psh->libpath_vars[i].text + cch1, psz, cch2);
        }
        else
        {
            psh->libpath_vars[i].flags |= VUNSET | VTEXTFIXED;
            psh->libpath_vars[i].text = (char*)libpath_envs[i];
        }
        if (find_var(psh, psh->libpath_vars[i].text, &vpp, &psh->libpath_vars[i].name_len) != NULL)
            continue;
        psh->libpath_vars[i].next = *vpp;
        *vpp = &psh->libpath_vars[i];
    }
    ckfree(psh, psz);
#endif

    for (ip = varinit; ip->text; ip++) {
        vp = (struct var *)((char *)psh + ip->var_off);
        if (find_var(psh, ip->text, &vpp, &vp->name_len) != NULL)
            continue;
        vp->next = *vpp;
        *vpp = vp;
        vp->text = sh_strdup(psh, ip->text);
        vp->flags = ip->flags;
        vp->func = ip->func;
    }
    /*
     * PS1 depends on uid
     */
    if (find_var(psh, "PS1", &vpp, &psh->vps1.name_len) == NULL) {
        psh->vps1.next = *vpp;
        *vpp = &psh->vps1;
#ifdef KBUILD_VERSION_MAJOR
        psh->vps1.text = sh_strdup(psh, sh_geteuid(psh) ? "PS1=kash$ " : "PS1=kash# ");
#else
        psh->vps1.text = sh_strdup(psh, sh_geteuid(psh) ? "PS1=$ " : "PS1=# ");
#endif
        psh->vps1.flags = VSTRFIXED|VTEXTFIXED;
    }
}
예제 #3
0
/**
 * Initializes the find paths.
 *
 * @returns 0 on success, non-zero on failure.
 */
int kldrDyldFindInit(void)
{
    KSIZE   cch;
    int     rc;
    char    szTmp[sizeof(kLdrDyldDefSuffix)];

    /*
     * The kLdr search parameters.
     */
    rc = kHlpGetEnv("KLDR_LIBRARY_PATH", kLdrDyldLibraryPath, sizeof(kLdrDyldLibraryPath));
    rc = kHlpGetEnv("KLDR_DEF_PREFIX", szTmp, sizeof(szTmp));
    if (!rc)
        kHlpMemCopy(kLdrDyldDefPrefix, szTmp, sizeof(szTmp));
    rc = kHlpGetEnv("KLDR_DEF_SUFFIX", szTmp, sizeof(szTmp));
    if (!rc)
        kHlpMemCopy(kLdrDyldDefSuffix, szTmp, sizeof(szTmp));

    /*
     * The OS/2 search parameters.
     */
#if K_OS == K_OS_OS2
    rc = DosQueryHeaderInfo(NULLHANDLE, 0, kLdrDyldOS2Libpath, sizeof(kLdrDyldOS2Libpath), QHINF_LIBPATH);
    if (rc)
        return rc;
    rc = DosQueryExtLIBPATH((PSZ)kLdrDyldOS2LibpathStrict, LIBPATHSTRICT);
    if (rc)
        kLdrDyldOS2LibpathStrict[0] = '\0';
    rc = DosQueryExtLIBPATH((PSZ)kLdrDyldOS2BeginLibpath, BEGIN_LIBPATH);
    if (rc)
        kLdrDyldOS2BeginLibpath[0] = '\0';
    rc = DosQueryExtLIBPATH((PSZ)kLdrDyldOS2EndLibpath, END_LIBPATH);
    if (rc)
        kLdrDyldOS2EndLibpath[0] = '\0';

#else
    kHlpGetEnv("KLDR_OS2_LIBPATH", kLdrDyldOS2Libpath, sizeof(kLdrDyldOS2Libpath));
    kHlpGetEnv("KLDR_OS2_LIBPATHSTRICT", kLdrDyldOS2LibpathStrict, sizeof(kLdrDyldOS2LibpathStrict));
    if (    kLdrDyldOS2LibpathStrict[0] == 'T'
        ||  kLdrDyldOS2LibpathStrict[0] == 't')
        kLdrDyldOS2LibpathStrict[0] = 'T';
    else
        kLdrDyldOS2LibpathStrict[0] = '\0';
    kLdrDyldOS2LibpathStrict[1] = '\0';
    kHlpGetEnv("KLDR_OS2_BEGINLIBPATH", kLdrDyldOS2BeginLibpath, sizeof(kLdrDyldOS2BeginLibpath));
    kHlpGetEnv("KLDR_OS2_ENDLIBPATH", kLdrDyldOS2EndLibpath, sizeof(kLdrDyldOS2EndLibpath));
#endif

    /*
     * The windows search parameters.
     */
#if K_OS == K_OS_WINDOWS
    cch = GetSystemDirectory(kLdrDyldWindowsSystemDir, sizeof(kLdrDyldWindowsSystemDir));
    if (cch >= sizeof(kLdrDyldWindowsSystemDir))
        return (rc = GetLastError()) ? rc : -1;
    cch = GetWindowsDirectory(kLdrDyldWindowsDir, sizeof(kLdrDyldWindowsDir));
    if (cch >= sizeof(kLdrDyldWindowsDir))
        return (rc = GetLastError()) ? rc : -1;
    kHlpGetEnv("PATH", kLdrDyldWindowsPath, sizeof(kLdrDyldWindowsPath));
#else
    kHlpGetEnv("KLDR_WINDOWS_SYSTEM_DIR", kLdrDyldWindowsSystemDir, sizeof(kLdrDyldWindowsSystemDir));
    kHlpGetEnv("KLDR_WINDOWS_DIR", kLdrDyldWindowsDir, sizeof(kLdrDyldWindowsDir));
    rc = kHlpGetEnv("KLDR_WINDOWS_PATH", kLdrDyldWindowsPath, sizeof(kLdrDyldWindowsPath));
    if (rc)
        kHlpGetEnv("PATH", kLdrDyldWindowsPath, sizeof(kLdrDyldWindowsPath));
#endif

    /*
     * The Unix search parameters.
     */
    rc = kHlpGetEnv("KLDR_UNIX_LIBRARY_PATH", kLdrDyldUnixLibraryPath, sizeof(kLdrDyldUnixLibraryPath));
    if (rc)
        kHlpGetEnv("LD_LIBRARY_PATH", kLdrDyldUnixLibraryPath, sizeof(kLdrDyldUnixLibraryPath));

    (void)cch;
    return 0;
}
예제 #4
0
파일: env.c 프로젝트: ErisBlastar/osfree
// retrieve an environment or alias list entry
char * get_list( char *varname, PCH pchList )
{
    char *arg;
    int wildflag;
    PCH pchEnv;
    PCH pchStart;
    static char szLibPath[512];

    if ( pchList == 0L )
        pchList = glpEnvironment;
    // special case for BeginLIBPATH and EndLIBPATH
    if ( pchList == glpEnvironment ) {

        szLibPath[0] = '\0';
        if ( stricmp( varname, BEGINLIBPATH ) == 0 ) {
            if ((DosQueryExtLIBPATH( szLibPath, BEGIN_LIBPATH ) == NO_ERROR ) && ( szLibPath[0] != '\0' ))
                return szLibPath;
            return 0L;
        }

        if ( stricmp( varname, ENDLIBPATH ) == 0 ) {
            if ((DosQueryExtLIBPATH( szLibPath, END_LIBPATH ) == NO_ERROR ) && ( szLibPath[0] != '\0' ))
            return szLibPath;
            return 0L;
        }
    }

    for ( pchEnv = pchList; *pchEnv; ) {

        // aliases allow "wher*eis" ; so collapse the '*', and
        //   only match to the length of the varname
        arg = varname;
        wildflag = 0;
        pchStart = pchEnv;

        do {

            if (( pchList == glpAliasList ) && ( *pchEnv == '*' )) {
                pchEnv++;
                wildflag++;

                // allow entry of "ab*cd=def"
                if ( *arg == '*' )
                    arg++;
            }

            if ((( *arg == '\0' ) || ( *arg == '=' )) && ((( *pchEnv == '=' ) && ( pchEnv != pchStart )) || ( wildflag ))) {

                for ( ; ( *pchEnv ); pchEnv++ ) {
                    if ( *pchEnv == '=' )
                        return ++pchEnv;
                }
                return NULL;
            }

        } while ( _ctoupper( *pchEnv++ ) == _ctoupper( *arg++ ));

        while ( *pchEnv++ != '\0' )
            ;
    }

    return 0L;
}
예제 #5
0
파일: var.c 프로젝트: dezelin/kBuild
void
initvar(void)
{
	const struct varinit *ip;
	struct var *vp;
	struct var **vpp;

#ifdef PC_OS2_LIBPATHS
        char *psz = ckmalloc(2048);
        int rc;
        int i;
        for (i = 0; i < 4; i++)
        {
            libpath_vars[i].flags = VSTRFIXED | VOS2LIBPATH;
            libpath_vars[i].func = NULL;

            if (i > 0)
            {
                psz[0] = psz[1] = psz[2] = psz[3] = '\0'; 
                rc = DosQueryExtLIBPATH(psz, i);
            }
            else
            {
                rc = DosQueryHeaderInfo(NULLHANDLE, 0, psz, 2048, QHINF_LIBPATH);
                libpath_vars[i].flags |= VREADONLY;
            }
            if (!rc && *psz)
            {
                int cch1 = strlen(libpath_envs[i]);
                int cch2 = strlen(psz) + 1;
                libpath_vars[i].text = ckmalloc(cch1 + cch2);
                memcpy(libpath_vars[i].text, libpath_envs[i], cch1);
                memcpy(libpath_vars[i].text + cch1, psz, cch2);
            }
            else
            {
                libpath_vars[i].flags |= VUNSET | VTEXTFIXED;
                libpath_vars[i].text = (char*)libpath_envs[i];
            }
            if (find_var(libpath_vars[i].text, &vpp, &libpath_vars[i].name_len) != NULL)
                    continue;
            libpath_vars[i].next = *vpp;
            *vpp = &libpath_vars[i];
        }
        free(psz);
#endif

	for (ip = varinit ; (vp = ip->var) != NULL ; ip++) {
		if (find_var(ip->text, &vpp, &vp->name_len) != NULL)
			continue;
		vp->next = *vpp;
		*vpp = vp;
		vp->text = strdup(ip->text);
		vp->flags = ip->flags;
		vp->func = ip->func;
	}
	/*
	 * PS1 depends on uid
	 */
	if (find_var("PS1", &vpp, &vps1.name_len) == NULL) {
		vps1.next = *vpp;
		*vpp = &vps1;
		vps1.text = strdup(geteuid() ? "PS1=$ " : "PS1=# ");
		vps1.flags = VSTRFIXED|VTEXTFIXED;
	}
}