1 /*
2  * COPYRIGHT:       See COPYING in the top level directory
3  * PROJECT:         ReactOS net command
4  * FILE:            base/applications/network/net/cmdConfig.c
5  * PROGRAMMERS:     Eric Kohl <eric.kohl@reactos.org>
6  */
7 
8 #include "net.h"
9 
10 static
11 INT
12 DisplayServerConfig(
13     PSERVER_INFO_102 ServerInfo)
14 {
15     PSERVER_TRANSPORT_INFO_0 TransportInfo = NULL;
16     DWORD dwRead, dwTotal, i;
17     INT nPaddedLength = 38;
18     NET_API_STATUS Status;
19 
20     Status = NetServerTransportEnum(NULL, 0, (PBYTE*)&TransportInfo,
21                                     MAX_PREFERRED_LENGTH,
22                                     &dwRead,
23                                     &dwTotal,
24                                     NULL);
25     if (Status != NERR_Success)
26         goto done;
27 
28     PrintPaddedResourceString(IDS_CONFIG_SERVER_NAME, nPaddedLength);
29     ConPrintf(StdOut, L"\\\\%s\n", ServerInfo->sv102_name);
30 
31     PrintPaddedResourceString(IDS_CONFIG_SERVER_COMMENT, nPaddedLength);
32     ConPrintf(StdOut, L"%s\n\n", ServerInfo->sv102_comment);
33 
34     PrintPaddedResourceString(IDS_CONFIG_SERVER_VERSION, nPaddedLength);
35     ConPrintf(StdOut, L"%lu.%lu\n",
36               ServerInfo->sv102_version_major,
37               ServerInfo->sv102_version_minor);
38 
39     ConResPuts(StdOut, IDS_CONFIG_SERVER_ACTIVE);
40     ConPuts(StdOut, L"\n");
41     for (i = 0; i < dwRead; i++)
42     {
43         ConPrintf(StdOut, L"      %s (%s)\n",
44                   &TransportInfo[i].svti0_transportname[8],
45                   TransportInfo[i].svti0_networkaddress);
46     }
47     ConPuts(StdOut, L"\n");
48 
49     PrintPaddedResourceString(IDS_CONFIG_SERVER_HIDDEN, nPaddedLength);
50     ConResPuts(StdOut, (ServerInfo->sv102_hidden == SV_HIDDEN) ? IDS_GENERIC_YES : IDS_GENERIC_NO);
51     ConPuts(StdOut, L"\n");
52 
53     PrintPaddedResourceString(IDS_CONFIG_SERVER_USERS, nPaddedLength);
54     ConPrintf(StdOut, L"%lu\n", ServerInfo->sv102_users);
55 
56     PrintPaddedResourceString(IDS_CONFIG_SERVER_FILES, nPaddedLength);
57     ConPuts(StdOut, L"...\n\n");
58 
59     PrintPaddedResourceString(IDS_CONFIG_SERVER_IDLE, nPaddedLength);
60     if (ServerInfo->sv102_disc == SV_NODISC)
61         ConResPuts(StdOut, IDS_GENERIC_UNLIMITED);
62     else
63         ConPrintf(StdOut, L"%lu\n", ServerInfo->sv102_disc);
64 
65 done:
66     if (TransportInfo != NULL)
67         NetApiBufferFree(TransportInfo);
68 
69     return 0;
70 }
71 
72 
73 static
74 INT
75 DisplayWorkstationConfig(VOID)
76 {
77     PWKSTA_INFO_100 WorkstationInfo = NULL;
78     PWKSTA_USER_INFO_1 UserInfo = NULL;
79     PWKSTA_TRANSPORT_INFO_0 TransportInfo = NULL;
80     DWORD dwRead = 0, dwTotal = 0, i;
81     INT nPaddedLength = 38;
82     NET_API_STATUS Status;
83 
84     Status = NetWkstaGetInfo(NULL, 100, (PBYTE*)&WorkstationInfo);
85     if (Status != NERR_Success)
86         goto done;
87 
88     Status = NetWkstaUserGetInfo(NULL, 1, (PBYTE*)&UserInfo);
89     if (Status != NERR_Success)
90         goto done;
91 
92     Status = NetWkstaTransportEnum(NULL,
93                                    0,
94                                    (PBYTE*)&TransportInfo,
95                                    MAX_PREFERRED_LENGTH,
96                                    &dwRead,
97                                    &dwTotal,
98                                    NULL);
99     if (Status != NERR_Success)
100         goto done;
101 
102     PrintPaddedResourceString(IDS_CONFIG_WORKSTATION_NAME, nPaddedLength);
103     ConPrintf(StdOut, L"\\\\%s\n", WorkstationInfo->wki100_computername);
104 
105     PrintPaddedResourceString(IDS_CONFIG_WORKSTATION_FULLNAME, nPaddedLength);
106     ConPuts(StdOut, L"...\n");
107 
108     PrintPaddedResourceString(IDS_CONFIG_WORKSTATION_USERNAME, nPaddedLength);
109     ConPrintf(StdOut, L"%s\n", UserInfo->wkui1_username);
110 
111     ConPuts(StdOut, L"\n");
112 
113     ConResPuts(StdOut, IDS_CONFIG_WORKSTATION_ACTIVE);
114     ConPuts(StdOut, L"\n");
115     for (i = 0; i < dwRead; i++)
116     {
117         ConPrintf(StdOut, L"      %s (%s)\n",
118                   &TransportInfo[i].wkti0_transport_name[8],
119                   TransportInfo[i].wkti0_transport_address);
120     }
121     ConPuts(StdOut, L"\n");
122 
123     PrintPaddedResourceString(IDS_CONFIG_WORKSTATION_VERSION, nPaddedLength);
124     ConPrintf(StdOut, L"%lu.%lu\n",
125               WorkstationInfo->wki100_ver_major,
126               WorkstationInfo->wki100_ver_minor);
127 
128     ConPuts(StdOut, L"\n");
129 
130     PrintPaddedResourceString(IDS_CONFIG_WORKSTATION_DOMAIN, nPaddedLength);
131     ConPrintf(StdOut, L"%s\n", WorkstationInfo->wki100_langroup);
132 
133     PrintPaddedResourceString(IDS_CONFIG_WORKSTATION_LOGON, nPaddedLength);
134     ConPrintf(StdOut, L"%s\n", UserInfo->wkui1_logon_domain);
135 
136 done:
137     if (TransportInfo != NULL)
138         NetApiBufferFree(TransportInfo);
139 
140     if (UserInfo != NULL)
141         NetApiBufferFree(UserInfo);
142 
143     if (WorkstationInfo != NULL)
144         NetApiBufferFree(WorkstationInfo);
145 
146     return 0;
147 }
148 
149 
150 INT
151 cmdConfig(
152     INT argc,
153     WCHAR **argv)
154 {
155     INT i, result = 0;
156     BOOL bServer = FALSE;
157     BOOL bWorkstation = FALSE;
158     PWSTR p, endptr;
159     BOOL bModify = FALSE;
160     LONG lValue;
161     PSERVER_INFO_102 ServerInfo = NULL;
162     NET_API_STATUS Status;
163 
164     for (i = 2; i < argc; i++)
165     {
166         if (_wcsicmp(argv[i], L"server") == 0)
167         {
168             if (bWorkstation == FALSE)
169                 bServer = TRUE;
170             continue;
171         }
172 
173         if (_wcsicmp(argv[i], L"workstation") == 0)
174         {
175             if (bServer == FALSE)
176                 bWorkstation = TRUE;
177             continue;
178         }
179 
180         if (_wcsicmp(argv[i], L"help") == 0)
181         {
182             /* Print short syntax help */
183             if (bServer == TRUE)
184             {
185                 ConResPuts(StdOut, IDS_GENERIC_SYNTAX);
186                 PrintNetMessage(MSG_CONFIG_SERVER_SYNTAX);
187             }
188             else
189             {
190                 ConResPuts(StdOut, IDS_GENERIC_SYNTAX);
191                 PrintNetMessage(MSG_CONFIG_SYNTAX);
192             }
193             return 0;
194         }
195 
196         if (_wcsicmp(argv[i], L"/help") == 0)
197         {
198             /* Print full help text*/
199             if (bServer == TRUE)
200             {
201                 ConResPuts(StdOut, IDS_GENERIC_SYNTAX);
202                 PrintNetMessage(MSG_CONFIG_SERVER_SYNTAX);
203                 PrintNetMessage(MSG_CONFIG_SERVER_HELP);
204                 ConResPuts(StdOut, IDS_GENERIC_PAGE);
205             }
206             else
207             {
208                 ConResPuts(StdOut, IDS_GENERIC_SYNTAX);
209                 PrintNetMessage(MSG_CONFIG_SYNTAX);
210                 PrintNetMessage(MSG_CONFIG_HELP);
211             }
212             return 0;
213         }
214     }
215 
216     if (bServer)
217     {
218         Status = NetServerGetInfo(NULL, 102, (PBYTE*)&ServerInfo);
219         if (Status != NERR_Success)
220             goto done;
221 
222         for (i = 2; i < argc; i++)
223         {
224             if (argv[i][0] != L'/')
225                 continue;
226 
227             if (_wcsnicmp(argv[i], L"/autodisconnect:", 16) == 0)
228             {
229                 p = &argv[i][16];
230                 lValue = wcstol(p, &endptr, 10);
231                 if (*endptr != 0)
232                 {
233                     ConResPrintf(StdErr, IDS_ERROR_INVALID_OPTION_VALUE, L"/AUTODISCONNECT");
234                     result = 1;
235                     goto done;
236                 }
237 
238                 if (lValue < -1 || lValue > 65535)
239                 {
240                     ConResPrintf(StdErr, IDS_ERROR_INVALID_OPTION_VALUE, L"/AUTODISCONNECT");
241                     result = 1;
242                     goto done;
243                 }
244 
245                 ServerInfo->sv102_disc = lValue;
246                 bModify = TRUE;
247             }
248             else if (_wcsnicmp(argv[i], L"/srvcomment:", 12) == 0)
249             {
250                 ServerInfo->sv102_comment = &argv[i][12];
251                 bModify = TRUE;
252             }
253             else if (_wcsnicmp(argv[i], L"/hidden:", 8) == 0)
254             {
255                 p = &argv[i][8];
256                 if (_wcsicmp(p, L"yes") != 0 && _wcsicmp(p, L"no") != 0)
257                 {
258                     ConResPrintf(StdErr, IDS_ERROR_INVALID_OPTION_VALUE, L"/HIDDEN");
259                     result = 1;
260                     goto done;
261                 }
262 
263                 ServerInfo->sv102_hidden = (_wcsicmp(p, L"yes") == 0) ? TRUE : FALSE;
264                 bModify = TRUE;
265             }
266             else
267             {
268                 ConResPuts(StdOut, IDS_GENERIC_SYNTAX);
269                 PrintNetMessage(MSG_CONFIG_SERVER_SYNTAX);
270                 result = 1;
271                 goto done;
272             }
273         }
274 
275         if (bModify)
276         {
277             Status = NetServerSetInfo(NULL, 102, (PBYTE)&ServerInfo, NULL);
278             if (Status != NERR_Success)
279                 result = 1;
280         }
281         else
282         {
283             result = DisplayServerConfig(ServerInfo);
284         }
285     }
286     else if (bWorkstation)
287     {
288         result = DisplayWorkstationConfig();
289     }
290     else
291     {
292         ConResPuts(StdOut, IDS_CONFIG_TEXT);
293     }
294 
295 done:
296     if (ServerInfo != NULL)
297         NetApiBufferFree(ServerInfo);
298 
299     if (result == 0)
300         PrintErrorMessage(ERROR_SUCCESS);
301 
302     return result;
303 }