xref: /reactos/base/applications/network/net/main.c (revision 74ec94e1)
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"pause",      cmdPause},
33     {L"session",    unimplemented},
34     {L"share",      cmdShare},
35     {L"start",      cmdStart},
36     {L"statistics", cmdStatistics},
37     {L"stop",       cmdStop},
38     {L"syntax",     cmdSyntax},
39     {L"time",       unimplemented},
40     {L"use",        cmdUse},
41     {L"user",       cmdUser},
42     {L"view",       unimplemented},
43     {NULL,          NULL}
44 };
45 
46 HMODULE hModuleNetMsg = NULL;
47 
48 
49 VOID
50 PrintPaddedResourceString(
51     UINT uID,
52     INT nPaddedLength)
53 {
54     INT nLength;
55 
56     nLength = ConResPuts(StdOut, uID);
57     if (nLength < nPaddedLength)
58         PrintPadding(L' ', nPaddedLength - nLength);
59 }
60 
61 
62 VOID
63 PrintPadding(
64     WCHAR chr,
65     INT nPaddedLength)
66 {
67     INT i;
68     WCHAR szMsgBuffer[MAX_BUFFER_SIZE];
69 
70     for (i = 0; i < nPaddedLength; i++)
71          szMsgBuffer[i] = chr;
72     szMsgBuffer[nPaddedLength] = UNICODE_NULL;
73 
74     ConPuts(StdOut, szMsgBuffer);
75 }
76 
77 
78 VOID
79 PrintMessageStringV(
80     DWORD dwMessage,
81     ...)
82 {
83     PWSTR pBuffer;
84     va_list args = NULL;
85 
86     va_start(args, dwMessage);
87 
88     FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE,
89                    hModuleNetMsg,
90                    dwMessage,
91                    LANG_USER_DEFAULT,
92                    (LPWSTR)&pBuffer,
93                    0,
94                    &args);
95     va_end(args);
96 
97     if (pBuffer)
98     {
99         ConPuts(StdOut, pBuffer);
100         LocalFree(pBuffer);
101         pBuffer = NULL;
102     }
103 }
104 
105 VOID
106 PrintMessageString(
107     DWORD dwMessage)
108 {
109     PWSTR pBuffer;
110 
111     FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE |
112                    FORMAT_MESSAGE_IGNORE_INSERTS,
113                    hModuleNetMsg,
114                    dwMessage,
115                    LANG_USER_DEFAULT,
116                    (LPWSTR)&pBuffer,
117                    0,
118                    NULL);
119     if (pBuffer)
120     {
121         ConPuts(StdOut, pBuffer);
122         LocalFree(pBuffer);
123         pBuffer = NULL;
124     }
125 }
126 
127 
128 VOID
129 PrintPaddedMessageString(
130     DWORD dwMessage,
131     INT nPaddedLength)
132 {
133     PWSTR pBuffer;
134     DWORD dwLength;
135 
136     dwLength = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE |
137                               FORMAT_MESSAGE_IGNORE_INSERTS,
138                               hModuleNetMsg,
139                               dwMessage,
140                               LANG_USER_DEFAULT,
141                               (LPWSTR)&pBuffer,
142                               0,
143                               NULL);
144     if (pBuffer)
145     {
146         ConPuts(StdOut, pBuffer);
147         LocalFree(pBuffer);
148         pBuffer = NULL;
149     }
150 
151     if (dwLength < (DWORD)nPaddedLength)
152         PrintPadding(L' ', (DWORD)nPaddedLength - dwLength);
153 }
154 
155 
156 VOID
157 PrintErrorMessage(
158     DWORD dwError)
159 {
160     WCHAR szErrorBuffer[16];
161     PWSTR pBuffer;
162     PWSTR pErrorInserts[2] = {NULL, NULL};
163 
164     if (dwError >= MIN_LANMAN_MESSAGE_ID && dwError <= MAX_LANMAN_MESSAGE_ID)
165     {
166         FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE |
167                        FORMAT_MESSAGE_IGNORE_INSERTS,
168                        hModuleNetMsg,
169                        dwError,
170                        LANG_USER_DEFAULT,
171                        (LPWSTR)&pBuffer,
172                        0,
173                        NULL);
174         if (pBuffer)
175         {
176             ConPrintf(StdErr, L"%s\n", pBuffer);
177             LocalFree(pBuffer);
178             pBuffer = NULL;
179         }
180     }
181     else
182     {
183         FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
184                        FORMAT_MESSAGE_IGNORE_INSERTS,
185                        NULL,
186                        dwError,
187                        LANG_USER_DEFAULT,
188                        (LPWSTR)&pBuffer,
189                        0,
190                        NULL);
191         if (pBuffer)
192         {
193             ConPrintf(StdErr, L"%s\n", pBuffer);
194             LocalFree(pBuffer);
195             pBuffer = NULL;
196         }
197     }
198 
199     if (dwError != ERROR_SUCCESS)
200     {
201         /* Format insert for the 3514 message */
202         swprintf(szErrorBuffer, L"%lu", dwError);
203         pErrorInserts[0] = szErrorBuffer;
204 
205         /* Format and print the 3514 message */
206         FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE |
207                        FORMAT_MESSAGE_ARGUMENT_ARRAY,
208                        hModuleNetMsg,
209                        3514,
210                        LANG_USER_DEFAULT,
211                        (LPWSTR)&pBuffer,
212                        0,
213                        (va_list *)pErrorInserts);
214         if (pBuffer)
215         {
216             ConPrintf(StdErr, L"%s\n", pBuffer);
217             LocalFree(pBuffer);
218             pBuffer = NULL;
219         }
220     }
221 }
222 
223 
224 VOID
225 PrintNetMessage(
226     DWORD dwMessage)
227 {
228     PWSTR pBuffer;
229 
230     FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
231                    FORMAT_MESSAGE_FROM_HMODULE |
232                    FORMAT_MESSAGE_IGNORE_INSERTS,
233                    GetModuleHandleW(NULL),
234                    dwMessage,
235                    LANG_USER_DEFAULT,
236                    (LPWSTR)&pBuffer,
237                    0,
238                    NULL);
239     if (pBuffer)
240     {
241         ConPuts(StdOut, pBuffer);
242         ConPuts(StdOut, L"\n");
243         LocalFree(pBuffer);
244         pBuffer = NULL;
245     }
246 }
247 
248 
249 VOID
250 ReadFromConsole(
251     LPWSTR lpInput,
252     DWORD dwLength,
253     BOOL bEcho)
254 {
255     DWORD dwOldMode;
256     DWORD dwRead = 0;
257     HANDLE hFile;
258     LPWSTR p;
259     PCHAR pBuf;
260 
261     pBuf = HeapAlloc(GetProcessHeap(), 0, dwLength - 1);
262     ZeroMemory(lpInput, dwLength * sizeof(WCHAR));
263     hFile = GetStdHandle(STD_INPUT_HANDLE);
264     GetConsoleMode(hFile, &dwOldMode);
265 
266     SetConsoleMode(hFile, ENABLE_LINE_INPUT | (bEcho ? ENABLE_ECHO_INPUT : 0));
267 
268     ReadFile(hFile, (PVOID)pBuf, dwLength - 1, &dwRead, NULL);
269 
270     MultiByteToWideChar(CP_OEMCP, 0, pBuf, dwRead, lpInput, dwLength - 1);
271     HeapFree(GetProcessHeap(), 0, pBuf);
272 
273     for (p = lpInput; *p; p++)
274     {
275         if (*p == L'\x0d')
276         {
277             *p = L'\0';
278             break;
279         }
280     }
281 
282     SetConsoleMode(hFile, dwOldMode);
283 }
284 
285 
286 int wmain(int argc, WCHAR **argv)
287 {
288     WCHAR szDllBuffer[MAX_PATH];
289     PCOMMAND cmdptr;
290     int nResult = 0;
291     BOOL bRun = FALSE;
292 
293     /* Initialize the Console Standard Streams */
294     ConInitStdStreams();
295 
296     /* Load netmsg.dll */
297     GetSystemDirectoryW(szDllBuffer, ARRAYSIZE(szDllBuffer));
298     wcscat(szDllBuffer, L"\\netmsg.dll");
299 
300     hModuleNetMsg = LoadLibrary(szDllBuffer);
301     if (hModuleNetMsg == NULL)
302     {
303         ConPrintf(StdErr, L"Failed to load netmsg.dll\n");
304         return 1;
305     }
306 
307     if (argc < 2)
308     {
309         nResult = 1;
310         goto done;
311     }
312 
313     /* Scan the command table */
314     for (cmdptr = cmds; cmdptr->name; cmdptr++)
315     {
316         if (_wcsicmp(argv[1], cmdptr->name) == 0)
317         {
318             nResult = cmdptr->func(argc, argv);
319             bRun = TRUE;
320             break;
321         }
322     }
323 
324 done:
325     if (bRun == FALSE)
326     {
327         PrintMessageString(4381);
328         ConPuts(StdOut, L"\n");
329         PrintNetMessage(MSG_NET_SYNTAX);
330     }
331 
332     if (hModuleNetMsg != NULL)
333         FreeLibrary(hModuleNetMsg);
334 
335     return nResult;
336 }
337 
338 INT unimplemented(INT argc, WCHAR **argv)
339 {
340     ConPuts(StdOut, L"This command is not implemented yet\n");
341     return 1;
342 }
343