ReactOS 0.4.16-dev-1946-g52006dd
alias.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS NetSh
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Network Shell alias management functions
5 * COPYRIGHT: Copyright 2025 Eric Kohl <eric.kohl@reactos.org>
6 */
7
8/* INCLUDES *******************************************************************/
9
10#include "precomp.h"
11
12#define NDEBUG
13#include <debug.h>
14
15/* GLOBALS ********************************************************************/
16
17typedef struct _ALIAS_ENTRY
18{
21
25
28
29
30/* FUNCTIONS ******************************************************************/
31
32static
33VOID
35{
36 PALIAS_ENTRY pAliasEntry = NULL;
37
38 DPRINT1("ShowAliases()\n");
39
40 pAliasEntry = AliasListHead;
41 while (pAliasEntry)
42 {
43 ConPrintf(StdOut, L"%s : %s\n", pAliasEntry->pszAliasName, pAliasEntry->pszAlias);
44 pAliasEntry = pAliasEntry->pNext;
45 }
46}
47
48
49static
50VOID
53{
54 PALIAS_ENTRY pAliasEntry = NULL;
55
56 DPRINT1("ShowAlias(%S)\n", pszAliasName);
57
58 pAliasEntry = AliasListHead;
59 while (pAliasEntry)
60 {
61 if (wcscmp(pAliasEntry->pszAliasName, pszAliasName) == 0)
62 {
63 ConPrintf(StdOut, L"%s\n", pAliasEntry->pszAlias);
64 return;
65 }
66
67 pAliasEntry = pAliasEntry->pNext;
68 }
69
71}
72
73
74static
78{
79 PALIAS_ENTRY pAliasEntry = NULL;
80
81 pAliasEntry = AliasListHead;
82 while (pAliasEntry)
83 {
84 if (wcscmp(pAliasEntry->pszAliasName, pszAliasName) == 0)
85 return pAliasEntry;
86
87 pAliasEntry = pAliasEntry->pNext;
88 }
89
90 return NULL;
91}
92
93
94VOID
96{
99}
100
101
102VOID
104{
105 PALIAS_ENTRY pAliasEntry;
106
107 while (AliasListHead != NULL)
108 {
109 pAliasEntry = AliasListHead;
111
112 HeapFree(GetProcessHeap(), 0, pAliasEntry->pszAliasName);
113 HeapFree(GetProcessHeap(), 0, pAliasEntry->pszAlias);
114 HeapFree(GetProcessHeap(), 0, pAliasEntry);
115 }
116
118}
119
120
121DWORD
122WINAPI
124 LPCWSTR pwszMachine,
125 LPWSTR *argv,
130 BOOL *pbDone)
131{
132 PALIAS_ENTRY pAliasEntry = NULL;
134
135 DPRINT("AliasCommand(dwCurrentIndex %lu dwArgCount %lu)\n",
137
138 /* Show aliases */
139 if (dwArgCount - dwCurrentIndex == 0)
140 {
141 ShowAliases();
142 return ERROR_SUCCESS;
143 }
144
145 if (dwArgCount - dwCurrentIndex == 1)
146 {
148 return ERROR_SUCCESS;
149 }
150
151
152 /* TODO: Check builtin commands */
153
154
155 pAliasEntry = GetAliasEntry(argv[dwCurrentIndex]);
156 if (pAliasEntry)
157 {
159 DPRINT("Alias: %S\n", pszAlias);
160 if (pszAlias == NULL)
162
163 if (pAliasEntry->pszAlias)
164 HeapFree(GetProcessHeap(), 0, pAliasEntry->pszAlias);
165
166 pAliasEntry->pszAlias = pszAlias;
167 }
168 else
169 {
170 pAliasEntry = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ALIAS_ENTRY));
171 if (pAliasEntry == NULL)
173
174 pAliasEntry->pszAliasName = HeapAlloc(GetProcessHeap(), 0,
175 (wcslen(argv[dwCurrentIndex]) + 1) * sizeof(WCHAR));
176 if (pAliasEntry->pszAliasName == NULL)
177 {
178 HeapFree(GetProcessHeap(), 0, pAliasEntry);
180 }
181
182 wcscpy(pAliasEntry->pszAliasName, argv[dwCurrentIndex]);
183 DPRINT("AliasName: %S\n", pAliasEntry->pszAliasName);
184
186 DPRINT("Alias: %S\n", pAliasEntry->pszAlias);
187 if (pAliasEntry->pszAlias == NULL)
188 {
189 HeapFree(GetProcessHeap(), 0, pAliasEntry->pszAliasName);
190 HeapFree(GetProcessHeap(), 0, pAliasEntry);
192 }
193
194 if (AliasListHead == NULL)
195 {
196 AliasListHead = pAliasEntry;
197 AliasListTail = pAliasEntry;
198 }
199 else
200 {
201 pAliasEntry->pPrev = AliasListTail;
202 AliasListTail->pNext = pAliasEntry;
203 AliasListTail = pAliasEntry;
204 }
205 }
206
207 DPRINT("Done\n");
208
209 return ERROR_OKAY;
210}
211
212
213DWORD
214WINAPI
216 LPCWSTR pwszMachine,
217 LPWSTR *argv,
222 BOOL *pbDone)
223{
224 DPRINT("ShowAliasCommand()\n");
225
226 ShowAliases();
227
228 return ERROR_SUCCESS;
229}
230
231
232DWORD
233WINAPI
235 LPCWSTR pwszMachine,
236 LPWSTR *argv,
241 BOOL *pbDone)
242{
243 PALIAS_ENTRY pAliasEntry = NULL;
244
245 DPRINT("UnaliasCommand()\n");
246
247 if (dwArgCount - dwCurrentIndex != 1)
249
250 DPRINT("Alias %S\n", argv[dwCurrentIndex]);
251
252 pAliasEntry = AliasListHead;
253 while (pAliasEntry)
254 {
255 if (wcscmp(pAliasEntry->pszAliasName, argv[dwCurrentIndex]) == 0)
256 {
257 DPRINT("Alias found %S\n", argv[dwCurrentIndex]);
258
259 if (pAliasEntry->pNext != NULL)
260 pAliasEntry->pNext->pPrev = pAliasEntry->pPrev;
261 else
262 AliasListTail = pAliasEntry->pPrev;
263
264 if (pAliasEntry->pPrev != NULL)
265 pAliasEntry->pPrev->pNext = pAliasEntry->pNext;
266 else
267 AliasListHead = pAliasEntry->pNext;
268
269 HeapFree(GetProcessHeap(), 0, pAliasEntry->pszAliasName);
270 HeapFree(GetProcessHeap(), 0, pAliasEntry->pszAlias);
271 HeapFree(GetProcessHeap(), 0, pAliasEntry);
272
273 return ERROR_SUCCESS;
274 }
275
276 pAliasEntry = pAliasEntry->pNext;
277 }
278
280
281 return ERROR_SUCCESS;
282}
void ConPrintf(FILE *fp, LPCWSTR psz,...)
Definition: fc.c:20
#define StdOut
Definition: fc.c:14
void ConResPrintf(FILE *fp, UINT nID,...)
Definition: fc.c:33
struct _ALIAS_ENTRY * PALIAS_ENTRY
DWORD WINAPI ShowAliasCommand(LPCWSTR pwszMachine, LPWSTR *argv, DWORD dwCurrentIndex, DWORD dwArgCount, DWORD dwFlags, LPCVOID pvData, BOOL *pbDone)
Definition: alias.c:215
struct _ALIAS_ENTRY ALIAS_ENTRY
static PALIAS_ENTRY GetAliasEntry(PWSTR pszAliasName)
Definition: alias.c:76
PALIAS_ENTRY AliasListHead
Definition: alias.c:26
PALIAS_ENTRY AliasListTail
Definition: alias.c:27
static VOID ShowAliases(VOID)
Definition: alias.c:34
VOID DestroyAliases(VOID)
Definition: alias.c:103
VOID InitAliases(VOID)
Definition: alias.c:95
DWORD WINAPI UnaliasCommand(LPCWSTR pwszMachine, LPWSTR *argv, DWORD dwCurrentIndex, DWORD dwArgCount, DWORD dwFlags, LPCVOID pvData, BOOL *pbDone)
Definition: alias.c:234
static VOID ShowAlias(PWSTR pszAliasName)
Definition: alias.c:51
DWORD WINAPI AliasCommand(LPCWSTR pwszMachine, LPWSTR *argv, DWORD dwCurrentIndex, DWORD dwArgCount, DWORD dwFlags, LPCVOID pvData, BOOL *pbDone)
Definition: alias.c:123
#define IDS_ALIAS_NOT_FOUND
Definition: resource.h:17
#define DPRINT1
Definition: precomp.h:8
wcscpy
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
CONST void * LPCVOID
Definition: minwindef.h:164
#define argv
Definition: mplay32.c:18
LPWSTR MergeStrings(_In_ LPWSTR pszStringArray[], _In_ INT nCount)
Definition: netsh.c:53
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define ERROR_INVALID_SYNTAX
Definition: netsh.h:10
_In_ LPWSTR _In_ DWORD _In_ LPCVOID pvData
Definition: netsh.h:116
#define ERROR_OKAY
Definition: netsh.h:24
_In_ LPWSTR _In_ DWORD dwArgCount
Definition: netsh.h:115
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD _In_ LPCVOID _Out_ BOOL * pbDone
Definition: netsh.h:143
_In_ LPWSTR _In_ DWORD dwCurrentIndex
Definition: netsh.h:139
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define DPRINT
Definition: sndvol32.h:73
Definition: alias.c:18
PWSTR pszAliasName
Definition: alias.c:22
struct _ALIAS_ENTRY * pNext
Definition: alias.c:20
struct _ALIAS_ENTRY * pPrev
Definition: alias.c:19
PWSTR pszAlias
Definition: alias.c:23
uint16_t * PWSTR
Definition: typedefs.h:56
#define WINAPI
Definition: msvc.h:6
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184