VirtualBox

source: vbox/trunk/include/iprt/env.h@ 57820

Last change on this file since 57820 was 57820, checked in by vboxsync, 9 years ago

IPRT/process-win.cpp: User profile environment handling, take 2: Renamed RTPROC_FLAGS_OVERWRITE_WITH_PROFILE to RTPROC_MODIFY_DEFAULT_ENV and changed its semantics. See flag description for details.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 14.4 KB
Line 
1/** @file
2 * IPRT - Process Environment Strings.
3 */
4
5/*
6 * Copyright (C) 2006-2015 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___iprt_env_h
27#define ___iprt_env_h
28
29#include <iprt/cdefs.h>
30#include <iprt/types.h>
31
32RT_C_DECLS_BEGIN
33
34/** @defgroup grp_rt_env RTEnv - Process Environment Strings
35 * @ingroup grp_rt
36 * @{
37 */
38
39#ifdef IN_RING3
40
41/** Special handle that indicates the default process environment. */
42#define RTENV_DEFAULT ((RTENV)~(uintptr_t)0)
43
44/**
45 * Creates an empty environment block.
46 *
47 * @returns IPRT status code. Typical error is VERR_NO_MEMORY.
48 *
49 * @param pEnv Where to store the handle of the new environment block.
50 */
51RTDECL(int) RTEnvCreate(PRTENV pEnv);
52
53/**
54 * Creates an environment block and fill it with variables from the given
55 * environment array.
56 *
57 * @returns IPRT status code.
58 * @retval VWRN_ENV_NOT_FULLY_TRANSLATED may be returned when passing
59 * RTENV_DEFAULT and one or more of the environment variables have
60 * codeset incompatibilities. The problematic variables will be
61 * ignored and not included in the clone, thus the clone will have
62 * fewer variables.
63 * @retval VERR_NO_MEMORY
64 * @retval VERR_NO_STR_MEMORY
65 * @retval VERR_INVALID_HANDLE
66 *
67 * @param pEnv Where to store the handle of the new environment block.
68 * @param EnvToClone The environment to clone.
69 */
70RTDECL(int) RTEnvClone(PRTENV pEnv, RTENV EnvToClone);
71
72/**
73 * Destroys an environment block.
74 *
75 * @returns IPRT status code.
76 *
77 * @param Env Environment block handle.
78 * Both RTENV_DEFAULT and NIL_RTENV are silently ignored.
79 */
80RTDECL(int) RTEnvDestroy(RTENV Env);
81
82/**
83 * Resets the environment block to contain zero variables.
84 *
85 * @returns IPRT status code.
86 *
87 * @param hEnv Environment block handle. RTENV_DEFAULT is not supported.
88 */
89RTDECL(int) RTEnvReset(RTENV hEnv);
90
91/**
92 * Get the execve/spawnve/main envp.
93 *
94 * All returned strings are in the current process' codepage.
95 * This array is only valid until the next RTEnv call.
96 *
97 * @returns Pointer to the raw array of environment variables.
98 * @returns NULL if Env is NULL or invalid.
99 *
100 * @param Env Environment block handle.
101 * @todo This needs to change to return a copy of the env vars like
102 * RTEnvQueryUtf16Block does!
103 */
104RTDECL(char const * const *) RTEnvGetExecEnvP(RTENV Env);
105
106/**
107 * Get a sorted, UTF-16 environment block for CreateProcess.
108 *
109 * @returns IPRT status code.
110 *
111 * @param hEnv Environment block handle.
112 * @param ppwszzBlock Where to return the environment block. This must be
113 * freed by calling RTEnvFreeUtf16Block.
114 */
115RTDECL(int) RTEnvQueryUtf16Block(RTENV hEnv, PRTUTF16 *ppwszzBlock);
116
117/**
118 * Frees an environment block returned by RTEnvGetUtf16Block().
119 *
120 * @param pwszzBlock What RTEnvGetUtf16Block returned. NULL is ignored.
121 */
122RTDECL(void) RTEnvFreeUtf16Block(PRTUTF16 pwszzBlock);
123
124/**
125 * Get a sorted, UTF-8 environment block.
126 *
127 * The environment block is a sequence of putenv formatted ("NAME=VALUE" or
128 * "NAME") zero terminated strings ending with an empty string (i.e. last string
129 * has two zeros).
130 *
131 * @returns IPRT status code.
132 *
133 * @param hEnv Environment block handle.
134 * @param fSorted Whether to sort it, this will affect @a hEnv.
135 * @param ppszzBlock Where to return the environment block. This must be
136 * freed by calling RTEnvFreeUtf8Block.
137 * @param pcbBlock Where to return the size of the block. Optional.
138 */
139RTDECL(int) RTEnvQueryUtf8Block(RTENV hEnv, bool fSorted, char **ppszzBlock, size_t *pcbBlock);
140
141/**
142 * Frees an environment block returned by RTEnvGetUtf8Block().
143 *
144 * @param pszzBlock What RTEnvGetUtf8Block returned. NULL is ignored.
145 */
146RTDECL(void) RTEnvFreeUtf8Block(char *pszzBlock);
147
148/**
149 * Checks if an environment variable exists in the default environment block.
150 *
151 * @returns IPRT status code. Typical error is VERR_NO_MEMORY.
152 *
153 * @param pszVar The environment variable name.
154 * @remark WARNING! The current implementation does not perform the appropriate
155 * codeset conversion. We'll figure this out when it becomes necessary.
156 */
157RTDECL(bool) RTEnvExist(const char *pszVar);
158RTDECL(bool) RTEnvExistsBad(const char *pszVar);
159RTDECL(bool) RTEnvExistsUtf8(const char *pszVar);
160
161/**
162 * Checks if an environment variable exists in a specific environment block.
163 *
164 * @returns IPRT status code. Typical error is VERR_NO_MEMORY.
165 *
166 * @param Env The environment handle.
167 * @param pszVar The environment variable name.
168 */
169RTDECL(bool) RTEnvExistEx(RTENV Env, const char *pszVar);
170
171/**
172 * Gets an environment variable from the default environment block. (getenv).
173 *
174 * The caller is responsible for ensuring that nobody changes the environment
175 * while it's using the returned string pointer!
176 *
177 * @returns Pointer to read only string on success, NULL if the variable wasn't found.
178 *
179 * @param pszVar The environment variable name.
180 *
181 * @remark WARNING! The current implementation does not perform the appropriate
182 * codeset conversion. We'll figure this out when it becomes necessary.
183 */
184RTDECL(const char *) RTEnvGet(const char *pszVar);
185RTDECL(const char *) RTEnvGetBad(const char *pszVar);
186RTDECL(int) RTEnvGetUtf8(const char *pszVar, char *pszValue, size_t cbValue, size_t *pcchActual);
187
188/**
189 * Gets an environment variable in a specific environment block.
190 *
191 * @returns IPRT status code.
192 * @retval VERR_ENV_VAR_NOT_FOUND if the variable was not found.
193 * @retval VERR_ENV_VAR_UNSET if @a hEnv is an environment change record and
194 * the variable has been recorded as unset.
195 *
196 * @param hEnv The environment handle.
197 * @param pszVar The environment variable name.
198 * @param pszValue Where to put the buffer.
199 * @param cbValue The size of the value buffer.
200 * @param pcchActual Returns the actual value string length. Optional.
201 */
202RTDECL(int) RTEnvGetEx(RTENV hEnv, const char *pszVar, char *pszValue, size_t cbValue, size_t *pcchActual);
203
204/**
205 * Puts an variable=value string into the environment (putenv).
206 *
207 * @returns IPRT status code. Typical error is VERR_NO_MEMORY.
208 *
209 * @param pszVarEqualValue The variable '=' value string. If the value and '=' is
210 * omitted, the variable is removed from the environment.
211 *
212 * @remark Don't assume the value is copied.
213 * @remark WARNING! The current implementation does not perform the appropriate
214 * codeset conversion. We'll figure this out when it becomes necessary.
215 */
216RTDECL(int) RTEnvPut(const char *pszVarEqualValue);
217RTDECL(int) RTEnvPutBad(const char *pszVarEqualValue);
218RTDECL(int) RTEnvPutUtf8(const char *pszVarEqualValue);
219
220/**
221 * Puts a copy of the passed in 'variable=value' string into the environment block.
222 *
223 * @returns IPRT status code. Typical error is VERR_NO_MEMORY.
224 *
225 * @param Env Handle of the environment block.
226 * @param pszVarEqualValue The variable '=' value string. If the value and '=' is
227 * omitted, the variable is removed from the environment.
228 */
229RTDECL(int) RTEnvPutEx(RTENV Env, const char *pszVarEqualValue);
230
231/**
232 * Sets an environment variable (setenv(,,1)).
233 *
234 * @returns IPRT status code. Typical error is VERR_NO_MEMORY.
235 *
236 * @param pszVar The environment variable name.
237 * @param pszValue The environment variable value.
238 *
239 * @remark WARNING! The current implementation does not perform the appropriate
240 * codeset conversion. We'll figure this out when it becomes necessary.
241 */
242RTDECL(int) RTEnvSet(const char *pszVar, const char *pszValue);
243RTDECL(int) RTEnvSetBad(const char *pszVar, const char *pszValue);
244RTDECL(int) RTEnvSetUtf8(const char *pszVar, const char *pszValue);
245
246/**
247 * Sets an environment variable (setenv(,,1)).
248 *
249 * @returns IPRT status code. Typical error is VERR_NO_MEMORY.
250 *
251 * @param Env The environment handle.
252 * @param pszVar The environment variable name.
253 * @param pszValue The environment variable value.
254 */
255RTDECL(int) RTEnvSetEx(RTENV Env, const char *pszVar, const char *pszValue);
256
257/**
258 * Removes an environment variable from the default environment block.
259 *
260 * @returns IPRT status code.
261 * @returns VINF_ENV_VAR_NOT_FOUND if the variable was not found.
262 *
263 * @param pszVar The environment variable name.
264 *
265 * @remark WARNING! The current implementation does not perform the appropriate
266 * codeset conversion. We'll figure this out when it becomes necessary.
267 */
268RTDECL(int) RTEnvUnset(const char *pszVar);
269RTDECL(int) RTEnvUnsetBad(const char *pszVar);
270RTDECL(int) RTEnvUnsetUtf8(const char *pszVar);
271
272/**
273 * Removes an environment variable from the specified environment block.
274 *
275 * @returns IPRT status code.
276 * @returns VINF_ENV_VAR_NOT_FOUND if the variable was not found.
277 *
278 * @param Env The environment handle.
279 * @param pszVar The environment variable name.
280 */
281RTDECL(int) RTEnvUnsetEx(RTENV Env, const char *pszVar);
282
283/**
284 * Duplicates the value of a environment variable if it exists.
285 *
286 * @returns Pointer to a string containing the value, free it using RTStrFree.
287 * NULL if the variable was not found or we're out of memory.
288 *
289 * @param Env The environment handle.
290 * @param pszVar The environment variable name.
291 */
292RTDECL(char *) RTEnvDupEx(RTENV Env, const char *pszVar);
293
294/**
295 * Counts the variables in the environment.
296 *
297 * @returns Number of variables in the environment. UINT32_MAX on error.
298 * @param hEnv The environment handle.
299 * RTENV_DEFAULT is currently not accepted.
300 */
301RTDECL(uint32_t) RTEnvCountEx(RTENV hEnv);
302
303/**
304 * Queries an environment variable by it's index.
305 *
306 * This can be used together with RTEnvCount to enumerate the environment block.
307 *
308 * @returns IPRT status code.
309 * @retval VERR_ENV_VAR_NOT_FOUND if the index is out of bounds, output buffers
310 * untouched.
311 * @retval VERR_BUFFER_OVERFLOW if one of the buffers are too small. We'll
312 * fill it with as much we can in RTStrCopy fashion.
313 * @retval VINF_ENV_VAR_UNSET if @a hEnv is an environment change record and
314 * the variable at @a iVar is recorded as being unset.
315 *
316 * @param hEnv The environment handle.
317 * RTENV_DEFAULT is currently not accepted.
318 * @param iVar The variable index.
319 * @param pszVar Variable name buffer.
320 * @param cbVar The size of the variable name buffer.
321 * @param pszValue Value buffer.
322 * @param cbValue The size of the value buffer.
323 */
324RTDECL(int) RTEnvGetByIndexEx(RTENV hEnv, uint32_t iVar, char *pszVar, size_t cbVar, char *pszValue, size_t cbValue);
325
326/**
327 * Leaner and meaner version of RTEnvGetByIndexEx.
328 *
329 * This can be used together with RTEnvCount to enumerate the environment block.
330 *
331 * Use with caution as the returned pointer may change by the next call using
332 * the environment handle. Please only use this API in cases where there is no
333 * chance of races.
334 *
335 * @returns Pointer to the internal environment variable=value string on
336 * success. If @a hEnv is an environment change recordthe string may
337 * also be on the "variable" form, representing an unset operation. Do
338 * NOT change this string, it is read only!
339 *
340 * If the index is out of range on the environment handle is invalid,
341 * NULL is returned.
342 *
343 * @param hEnv The environment handle.
344 * RTENV_DEFAULT is currently not accepted.
345 * @param iVar The variable index.
346 */
347RTDECL(const char *) RTEnvGetByIndexRawEx(RTENV hEnv, uint32_t iVar);
348
349
350/**
351 * Creates an empty environment change record.
352 *
353 * This is a special environment for use with RTEnvApplyChanges and similar
354 * purposes. The
355 *
356 * @returns IPRT status code. Typical error is VERR_NO_MEMORY.
357 *
358 * @param phEnv Where to store the handle of the new environment block.
359 */
360RTDECL(int) RTEnvCreateChangeRecord(PRTENV phEnv);
361
362/**
363 * Checks if @a hEnv is an environment change record.
364 *
365 * @returns true if it is, false if it's not or if the handle is invalid.
366 * @param hEnv The environment handle.
367 * @sa RTEnvCreateChangeRecord.
368 */
369RTDECL(bool) RTEnvIsChangeRecord(RTENV hEnv);
370
371/**
372 * Applies changes from one environment onto another.
373 *
374 * If @a hEnvChanges is a normal environment, its content is just added to @a
375 * hEnvDst, where variables in the destination can only be overwritten. However
376 * if @a hEnvChanges is a change record environment, variables in the
377 * destination can also be removed.
378 *
379 * @returns IPRT status code. Typical error is VERR_NO_MEMORY.
380 * @param hEnvDst The destination environment.
381 * @param hEnvChanges Handle to the environment containig the changes to
382 * apply. As said, especially useful if it's a environment
383 * change record. RTENV_DEFAULT is not supported here.
384 */
385RTDECL(int) RTEnvApplyChanges(RTENV hEnvDst, RTENV hEnvChanges);
386
387/**
388 * Creates an environment block out of a handed-in Unicode block.
389 *
390 * @return IPRT status code.
391 * @param hEnv Handle of an existing RTENV block to store the
392 * result into.
393 * @param pcwszBlock Unicode block (array) of environment entries;
394 * in form of "FOO=BAR\0BAR=BAZ".
395 * @param fOverwriteExisting Whether to overwrite existing values of hEnv
396 * with the ones defined in pcwszBlock.
397
398 */
399RTDECL(int) RTEnvFromUtf16Block(RTENV hEnv, PCRTUTF16 pcwszBlock, bool fOverwriteExisting);
400
401#endif /* IN_RING3 */
402
403/** @} */
404
405RT_C_DECLS_END
406
407#endif
408
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette