Beispiel #1
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;
}
Beispiel #2
0
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;
    }
}
Beispiel #3
0
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;
	}
}