[NET] Fix some 'net help' and 'net user' issues.
[reactos.git] / base / applications / network / net / main.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS net command
4 * FILE: base/applications/network/net/main.c
5 * PURPOSE:
6 *
7 * PROGRAMMERS: Magnus Olsen (greatlord@reactos.org)
8 */
9
10 #include "net.h"
11
12 #define MAX_BUFFER_SIZE 4096
13
14 typedef struct _COMMAND
15 {
16 WCHAR *name;
17 INT (*func)(INT, WCHAR**);
18 // VOID (*help)(INT, WCHAR**);
19 } COMMAND, *PCOMMAND;
20
21 COMMAND cmds[] =
22 {
23 {L"accounts", cmdAccounts},
24 {L"computer", cmdComputer},
25 {L"config", cmdConfig},
26 {L"continue", cmdContinue},
27 {L"file", unimplemented},
28 {L"group", cmdGroup},
29 {L"help", cmdHelp},
30 {L"helpmsg", cmdHelpMsg},
31 {L"localgroup", cmdLocalGroup},
32 {L"name", unimplemented},
33 {L"pause", cmdPause},
34 {L"print", unimplemented},
35 {L"send", unimplemented},
36 {L"session", unimplemented},
37 {L"share", unimplemented},
38 {L"start", cmdStart},
39 {L"statistics", cmdStatistics},
40 {L"stop", cmdStop},
41 {L"time", unimplemented},
42 {L"use", cmdUse},
43 {L"user", cmdUser},
44 {L"view", unimplemented},
45 {NULL, NULL}
46 };
47
48 HMODULE hModuleNetMsg = NULL;
49
50
51 VOID
52 PrintPaddedResourceString(
53 UINT uID,
54 INT nPaddedLength)
55 {
56 INT nLength;
57
58 nLength = ConResPuts(StdOut, uID);
59 if (nLength < nPaddedLength)
60 PrintPadding(L' ', nPaddedLength - nLength);
61 }
62
63
64 VOID
65 PrintPadding(
66 WCHAR chr,
67 INT nPaddedLength)
68 {
69 INT i;
70 WCHAR szMsgBuffer[MAX_BUFFER_SIZE];
71
72 for (i = 0; i < nPaddedLength; i++)
73 szMsgBuffer[i] = chr;
74 szMsgBuffer[nPaddedLength] = UNICODE_NULL;
75
76 ConPuts(StdOut, szMsgBuffer);
77 }
78
79
80 VOID
81 PrintErrorMessage(
82 DWORD dwError)
83 {
84 WCHAR szErrorBuffer[16];
85 PWSTR pBuffer;
86 PWSTR pErrorInserts[2] = {NULL, NULL};
87
88 if (dwError >= MIN_LANMAN_MESSAGE_ID && dwError <= MAX_LANMAN_MESSAGE_ID)
89 {
90 FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE |
91 FORMAT_MESSAGE_IGNORE_INSERTS,
92 hModuleNetMsg,
93 dwError,
94 LANG_USER_DEFAULT,
95 (LPWSTR)&pBuffer,
96 0,
97 NULL);
98 if (pBuffer)
99 {
100 ConPrintf(StdErr, L"%s\n", pBuffer);
101 LocalFree(pBuffer);
102 pBuffer = NULL;
103 }
104 }
105 else
106 {
107 FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
108 FORMAT_MESSAGE_IGNORE_INSERTS,
109 NULL,
110 dwError,
111 LANG_USER_DEFAULT,
112 (LPWSTR)&pBuffer,
113 0,
114 NULL);
115 if (pBuffer)
116 {
117 ConPrintf(StdErr, L"%s\n", pBuffer);
118 LocalFree(pBuffer);
119 pBuffer = NULL;
120 }
121 }
122
123 if (dwError != ERROR_SUCCESS)
124 {
125 /* Format insert for the 3514 message */
126 swprintf(szErrorBuffer, L"%lu", dwError);
127 pErrorInserts[0] = szErrorBuffer;
128
129 /* Format and print the 3514 message */
130 FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE |
131 FORMAT_MESSAGE_ARGUMENT_ARRAY,
132 hModuleNetMsg,
133 3514,
134 LANG_USER_DEFAULT,
135 (LPWSTR)&pBuffer,
136 0,
137 (va_list *)pErrorInserts);
138 if (pBuffer)
139 {
140 ConPrintf(StdErr, L"%s\n", pBuffer);
141 LocalFree(pBuffer);
142 pBuffer = NULL;
143 }
144 }
145 }
146
147
148 VOID
149 PrintNetMessage(
150 DWORD dwMessage)
151 {
152 PWSTR pBuffer;
153
154 FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
155 FORMAT_MESSAGE_FROM_HMODULE |
156 FORMAT_MESSAGE_IGNORE_INSERTS,
157 GetModuleHandleW(NULL),
158 dwMessage,
159 LANG_USER_DEFAULT,
160 (LPWSTR)&pBuffer,
161 0,
162 NULL);
163 if (pBuffer)
164 {
165 ConPrintf(StdOut, L"%s\n", pBuffer);
166 LocalFree(pBuffer);
167 pBuffer = NULL;
168 }
169 }
170
171
172 VOID
173 ReadFromConsole(
174 LPWSTR lpInput,
175 DWORD dwLength,
176 BOOL bEcho)
177 {
178 DWORD dwOldMode;
179 DWORD dwRead = 0;
180 HANDLE hFile;
181 LPWSTR p;
182 PCHAR pBuf;
183
184 pBuf = HeapAlloc(GetProcessHeap(), 0, dwLength - 1);
185 ZeroMemory(lpInput, dwLength * sizeof(WCHAR));
186 hFile = GetStdHandle(STD_INPUT_HANDLE);
187 GetConsoleMode(hFile, &dwOldMode);
188
189 SetConsoleMode(hFile, ENABLE_LINE_INPUT | (bEcho ? ENABLE_ECHO_INPUT : 0));
190
191 ReadFile(hFile, (PVOID)pBuf, dwLength - 1, &dwRead, NULL);
192
193 MultiByteToWideChar(CP_OEMCP, 0, pBuf, dwRead, lpInput, dwLength - 1);
194 HeapFree(GetProcessHeap(), 0, pBuf);
195
196 for (p = lpInput; *p; p++)
197 {
198 if (*p == L'\x0d')
199 {
200 *p = L'\0';
201 break;
202 }
203 }
204
205 SetConsoleMode(hFile, dwOldMode);
206 }
207
208
209 int wmain(int argc, WCHAR **argv)
210 {
211 WCHAR szDllBuffer[MAX_PATH];
212 PCOMMAND cmdptr;
213 int nResult = 0;
214 BOOL bRun = FALSE;
215
216 /* Initialize the Console Standard Streams */
217 ConInitStdStreams();
218
219 /* Load netmsg.dll */
220 GetSystemDirectoryW(szDllBuffer, ARRAYSIZE(szDllBuffer));
221 wcscat(szDllBuffer, L"\\netmsg.dll");
222
223 hModuleNetMsg = LoadLibrary(szDllBuffer);
224 if (hModuleNetMsg == NULL)
225 {
226 ConPrintf(StdErr, L"Failed to load netmsg.dll\n");
227 return 1;
228 }
229
230 if (argc < 2)
231 {
232 nResult = 1;
233 goto done;
234 }
235
236 /* Scan the command table */
237 for (cmdptr = cmds; cmdptr->name; cmdptr++)
238 {
239 if (_wcsicmp(argv[1], cmdptr->name) == 0)
240 {
241 nResult = cmdptr->func(argc, argv);
242 bRun = TRUE;
243 break;
244 }
245 }
246
247 done:
248 if (bRun == FALSE)
249 {
250 ConResPuts(StdOut, IDS_GENERIC_SYNTAX);
251 PrintNetMessage(MSG_NET_SYNTAX);
252 }
253
254 if (hModuleNetMsg != NULL)
255 FreeLibrary(hModuleNetMsg);
256
257 return nResult;
258 }
259
260 INT unimplemented(INT argc, WCHAR **argv)
261 {
262 ConPuts(StdOut, L"This command is not implemented yet\n");
263 return 1;
264 }