Changeset 55584 in vbox for trunk/src/VBox/Runtime/generic
- Timestamp:
- May 1, 2015 7:11:32 PM (10 years ago)
- svn:sync-xref-src-repo-rev:
- 99957
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/generic/env-generic.cpp
r55562 r55584 348 348 } 349 349 RT_EXPORT_SYMBOL(RTEnvClone); 350 351 352 RTDECL(int) RTEnvReset(RTENV hEnv) 353 { 354 PRTENVINTERNAL pIntEnv = hEnv; 355 AssertPtrReturn(pIntEnv, VERR_INVALID_HANDLE); 356 AssertReturn(pIntEnv->u32Magic == RTENV_MAGIC, VERR_INVALID_HANDLE); 357 358 RTENV_LOCK(pIntEnv); 359 360 size_t iVar = pIntEnv->cVars; 361 pIntEnv->cVars = 0; 362 while (iVar-- > 0) 363 { 364 RTMemFree(pIntEnv->papszEnv[iVar]); 365 pIntEnv->papszEnv[iVar] = NULL; 366 } 367 368 RTENV_UNLOCK(pIntEnv); 369 return VINF_SUCCESS; 370 } 371 RT_EXPORT_SYMBOL(RTEnvReset); 350 372 351 373 … … 885 907 return rc; 886 908 } 887 RT_EXPORT_SYMBOL(RTEnv GetExecEnvP);909 RT_EXPORT_SYMBOL(RTEnvQueryUtf16Block); 888 910 889 911 … … 893 915 } 894 916 RT_EXPORT_SYMBOL(RTEnvFreeUtf16Block); 917 918 919 RTDECL(int) RTEnvQueryUtf8Block(RTENV hEnv, bool fSorted, char **ppszzBlock, size_t *pcbBlock) 920 { 921 RTENV hClone = NIL_RTENV; 922 PRTENVINTERNAL pIntEnv; 923 int rc; 924 925 /* 926 * Validate / simplify input. 927 */ 928 if (hEnv == RTENV_DEFAULT) 929 { 930 rc = RTEnvClone(&hClone, RTENV_DEFAULT); 931 if (RT_FAILURE(rc)) 932 return rc; 933 pIntEnv = hClone; 934 } 935 else 936 { 937 pIntEnv = hEnv; 938 AssertPtrReturn(pIntEnv, VERR_INVALID_HANDLE); 939 AssertReturn(pIntEnv->u32Magic == RTENV_MAGIC, VERR_INVALID_HANDLE); 940 rc = VINF_SUCCESS; 941 } 942 943 RTENV_LOCK(pIntEnv); 944 945 /* 946 * Sort it, if requested. 947 */ 948 if (fSorted) 949 RTSortApvShell((void **)pIntEnv->papszEnv, pIntEnv->cVars, rtEnvSortCompare, pIntEnv); 950 951 /* 952 * Calculate the size. We add one extra terminator just to be on the safe side. 953 */ 954 size_t cbBlock = 2; 955 for (size_t iVar = 0; iVar < pIntEnv->cVars; iVar++) 956 cbBlock += strlen(pIntEnv->papszEnv[iVar]) + 1; 957 958 if (pcbBlock) 959 *pcbBlock = cbBlock - 1; 960 961 /* 962 * Allocate memory and copy out the variables. 963 */ 964 char *pszzBlock; 965 char *pszz = pszzBlock = (char *)RTMemAlloc(cbBlock); 966 if (pszz) 967 { 968 size_t cbLeft = cbBlock; 969 for (size_t iVar = 0; iVar < pIntEnv->cVars; iVar++) 970 { 971 size_t cb = strlen(pIntEnv->papszEnv[iVar]) + 1; 972 AssertBreakStmt(cb + 2 <= cbLeft, rc = VERR_INTERNAL_ERROR_3); 973 memcpy(pszz, pIntEnv->papszEnv[iVar], cb); 974 pszz += cb; 975 cbLeft -= cb; 976 } 977 if (RT_SUCCESS(rc)) 978 { 979 pszz[0] = '\0'; 980 pszz[1] = '\0'; /* The extra one. */ 981 } 982 else 983 { 984 RTMemFree(pszzBlock); 985 pszzBlock = NULL; 986 } 987 } 988 else 989 rc = VERR_NO_MEMORY; 990 991 RTENV_UNLOCK(pIntEnv); 992 993 if (hClone != NIL_RTENV) 994 RTEnvDestroy(hClone); 995 if (RT_SUCCESS(rc)) 996 *ppszzBlock = pszzBlock; 997 return rc; 998 } 999 RT_EXPORT_SYMBOL(RTEnvQueryUtf8Block); 1000 1001 1002 RTDECL(void) RTEnvFreeUtf8Block(char *pszzBlock) 1003 { 1004 RTMemFree(RTEnvQueryUtf8Block); 1005 } 1006 RT_EXPORT_SYMBOL(RTEnvFreeUtf8Block); 895 1007 896 1008
Note:
See TracChangeset
for help on using the changeset viewer.