[NET]
[reactos.git] / reactos / base / applications / network / net / cmdUse.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS net command
4 * FILE: base/applications/network/net/cmdUse.c
5 * PURPOSE:
6 *
7 * PROGRAMMERS: Pierre Schweitzer
8 */
9
10 #include "net.h"
11
12 static
13 DWORD
14 EnumerateConnections(LPCWSTR Local)
15 {
16 DWORD dRet;
17 HANDLE hEnum;
18 LPNETRESOURCE lpRes;
19 DWORD dSize = 0x1000;
20 DWORD dCount = -1;
21 LPNETRESOURCE lpCur;
22
23 printf("%S\t\t\t%S\t\t\t\t%S\n", L"Local", L"Remote", L"Provider");
24
25 dRet = WNetOpenEnum(RESOURCE_CONNECTED, RESOURCETYPE_DISK, 0, NULL, &hEnum);
26 if (dRet != WN_SUCCESS)
27 {
28 return 1;
29 }
30
31 lpRes = HeapAlloc(GetProcessHeap(), 0, dSize);
32 if (!lpRes)
33 {
34 WNetCloseEnum(hEnum);
35 return 1;
36 }
37
38 do
39 {
40 dSize = 0x1000;
41 dCount = -1;
42
43 memset(lpRes, 0, dSize);
44 dRet = WNetEnumResource(hEnum, &dCount, lpRes, &dSize);
45 if (dRet == WN_SUCCESS || dRet == WN_MORE_DATA)
46 {
47 lpCur = lpRes;
48 for (; dCount; dCount--)
49 {
50 if (!Local || wcsicmp(lpCur->lpLocalName, Local) == 0)
51 {
52 printf("%S\t\t\t%S\t\t%S\n", lpCur->lpLocalName, lpCur->lpRemoteName, lpCur->lpProvider);
53 }
54
55 lpCur++;
56 }
57 }
58 } while (dRet != WN_NO_MORE_ENTRIES);
59
60 HeapFree(GetProcessHeap(), 0, lpRes);
61 WNetCloseEnum(hEnum);
62
63 return 0;
64 }
65
66 INT
67 cmdUse(
68 INT argc,
69 WCHAR **argv)
70 {
71 DWORD Status, Len;
72
73 if (argc == 2)
74 {
75 Status = EnumerateConnections(NULL);
76 printf("Status: %lu\n", Status);
77 return 0;
78 }
79 else if (argc == 3)
80 {
81 Len = wcslen(argv[2]);
82 if (Len != 2)
83 {
84 PrintResourceString(IDS_ERROR_INVALID_OPTION_VALUE, L"DeviceName");
85 return 1;
86 }
87
88 if (!iswalpha(argv[2][0]) || argv[2][1] != L':')
89 {
90 PrintResourceString(IDS_ERROR_INVALID_OPTION_VALUE, L"DeviceName");
91 return 1;
92 }
93
94 Status = EnumerateConnections(argv[2]);
95 printf("Status: %lu\n", Status);
96 return 0;
97 }
98
99 Len = wcslen(argv[2]);
100 if (Len != 1 && Len != 2)
101 {
102 PrintResourceString(IDS_ERROR_INVALID_OPTION_VALUE, L"DeviceName");
103 printf("Len: %lu\n", Len);
104 return 1;
105 }
106
107 if (Len == 2 && argv[2][1] != L':')
108 {
109 PrintResourceString(IDS_ERROR_INVALID_OPTION_VALUE, L"DeviceName");
110 return 1;
111 }
112
113 if (argv[2][0] != L'*' && !iswalpha(argv[2][0]))
114 {
115 PrintResourceString(IDS_ERROR_INVALID_OPTION_VALUE, L"DeviceName");
116 return 1;
117 }
118
119 if (wcsicmp(argv[3], L"/DELETE") == 0)
120 {
121 if (argv[2][0] == L'*')
122 {
123 PrintResourceString(IDS_ERROR_INVALID_OPTION_VALUE, L"DeviceName");
124 return 1;
125 }
126
127 return WNetCancelConnection(argv[2], FALSE);
128 }
129 else
130 {
131 BOOL Persist = FALSE;
132 NETRESOURCE lpNet;
133
134 Len = wcslen(argv[3]);
135 if (Len < 4)
136 {
137 PrintResourceString(IDS_ERROR_INVALID_OPTION_VALUE, L"Name");
138 return 1;
139 }
140
141 if (argv[3][0] != L'\\' || argv[3][1] != L'\\')
142 {
143 PrintResourceString(IDS_ERROR_INVALID_OPTION_VALUE, L"Name");
144 return 1;
145 }
146
147 if (argc > 4)
148 {
149 LPWSTR Cpy;
150 Len = wcslen(argv[4]);
151 if (Len > 12)
152 {
153 Cpy = HeapAlloc(GetProcessHeap(), 0, (Len + 1) * sizeof(WCHAR));
154 if (Cpy)
155 {
156 INT i;
157 for (i = 0; i < Len; ++i)
158 Cpy[i] = towupper(argv[4][i]);
159
160 if (wcsstr(Cpy, L"/PERSISTENT:") == Cpy)
161 {
162 LPWSTR Arg = Cpy + 12;
163 if (Len == 14 && Arg[0] == 'N' && Arg[1] == 'O')
164 {
165 Persist = FALSE;
166 }
167 else if (Len == 15 && Arg[0] == 'Y' && Arg[1] == 'E' && Arg[2] == 'S')
168 {
169 Persist = TRUE;
170 }
171 else
172 {
173 HeapFree(GetProcessHeap(), 0, Cpy);
174 PrintResourceString(IDS_ERROR_INVALID_OPTION_VALUE, L"Persistent");
175 return 1;
176 }
177 }
178 HeapFree(GetProcessHeap(), 0, Cpy);
179 }
180 }
181
182 }
183
184 lpNet.dwType = RESOURCETYPE_DISK;
185 lpNet.lpLocalName = (argv[2][0] != L'*') ? argv[2] : NULL;
186 lpNet.lpRemoteName = argv[3];
187 lpNet.lpProvider = NULL;
188
189 return WNetAddConnection2(&lpNet, NULL, NULL, CONNECT_REDIRECT | (Persist ? CONNECT_UPDATE_PROFILE : 0));
190 }
191 }