[SHELL32] Fix Control_RunDLLW (#5400)
[reactos.git] / base / shell / cmd / path.c
1 /*
2 * PATH.C - path internal command.
3 *
4 *
5 * History:
6 *
7 * 17 Jul 1998 (John P Price)
8 * Separated commands into individual files.
9 *
10 * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
11 * added config.h include
12 *
13 * 09-Dec-1998 (Eric Kohl)
14 * Added help text ("/?").
15 *
16 * 18-Jan-1999 (Eric Kohl)
17 * Unicode ready!
18 *
19 * 18-Jan-1999 (Eric Kohl)
20 * Redirection safe!
21 *
22 * 24-Jan-1999 (Eric Kohl)
23 * Fixed Win32 environment handling.
24 *
25 * 30-Apr-2005 (Magnus Olsen <magnus@greatlord.com>)
26 * Remove all hardcoded strings in En.rc
27 */
28 #include "precomp.h"
29
30 #ifdef INCLUDE_CMD_PATH
31
32 /* Size of environment variable buffer */
33 #define ENV_BUFFER_SIZE 1024
34
35
36 INT cmd_path(LPTSTR param)
37 {
38 INT retval = 0;
39
40 if (!_tcsncmp(param, _T("/?"), 2))
41 {
42 ConOutResPaging(TRUE, STRING_PATH_HELP1);
43 return 0;
44 }
45
46 /* If param is empty, display the PATH environment variable */
47 if (!param || !*param)
48 {
49 DWORD dwBuffer;
50 LPTSTR pszBuffer;
51
52 pszBuffer = (LPTSTR)cmd_alloc(ENV_BUFFER_SIZE * sizeof(TCHAR));
53 if (!pszBuffer)
54 {
55 WARN("Cannot allocate memory for pszBuffer!\n");
56 error_out_of_memory();
57 retval = 1;
58 goto Quit;
59 }
60
61 dwBuffer = GetEnvironmentVariable(_T("PATH"), pszBuffer, ENV_BUFFER_SIZE);
62 if (dwBuffer == 0)
63 {
64 cmd_free(pszBuffer);
65 ConErrResPrintf(STRING_SET_ENV_ERROR, _T("PATH"));
66 retval = 0;
67 goto Quit;
68 }
69 else if (dwBuffer > ENV_BUFFER_SIZE)
70 {
71 LPTSTR pszOldBuffer = pszBuffer;
72 pszBuffer = (LPTSTR)cmd_realloc(pszBuffer, dwBuffer * sizeof (TCHAR));
73 if (!pszBuffer)
74 {
75 WARN("Cannot reallocate memory for pszBuffer!\n");
76 error_out_of_memory();
77 cmd_free(pszOldBuffer);
78 retval = 1;
79 goto Quit;
80 }
81 GetEnvironmentVariable(_T("PATH"), pszBuffer, dwBuffer);
82 }
83
84 ConOutPrintf(_T("PATH=%s\n"), pszBuffer);
85 cmd_free(pszBuffer);
86
87 retval = 0;
88 goto Quit;
89 }
90
91 /* Skip leading '=' */
92 if (*param == _T('='))
93 param++;
94
95 /* Set PATH environment variable */
96 if (!SetEnvironmentVariable(_T("PATH"), param))
97 {
98 retval = 1;
99 }
100
101 Quit:
102 if (BatType != CMD_TYPE)
103 {
104 if (retval != 0)
105 nErrorLevel = retval;
106 }
107 else
108 {
109 nErrorLevel = retval;
110 }
111
112 return retval;
113 }
114
115 #endif
116
117 /* EOF */