[NET] Implement adding and deleting of network shares.
[reactos.git] / base / applications / network / net / cmdShare.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS net command
4 * FILE: base/applications/network/net/cmdShare.c
5 * PROGRAMMERS: Eric Kohl <eric.kohl@reactos.org>
6 */
7
8 #include "net.h"
9
10
11 NET_API_STATUS
12 EnumerateShares(VOID)
13 {
14 PSHARE_INFO_2 pBuffer = NULL;
15 DWORD dwRead = 0, dwTotal = 0;
16 DWORD ResumeHandle = 0, i;
17 NET_API_STATUS Status;
18
19 ConPuts(StdOut, L"\n");
20 PrintMessageString(4730);
21 ConPuts(StdOut, L"\n");
22 PrintPadding(L'-', 79);
23 ConPuts(StdOut, L"\n");
24
25 do
26 {
27 Status = NetShareEnum(NULL,
28 2,
29 (LPBYTE*)&pBuffer,
30 MAX_PREFERRED_LENGTH,
31 &dwRead,
32 &dwTotal,
33 &ResumeHandle);
34 if ((Status != NERR_Success) && (Status != ERROR_MORE_DATA))
35 return Status;
36
37 for (i = 0; i < dwRead; i++)
38 {
39 ConPrintf(StdOut, L"%-12s %-31s %s\n", pBuffer[i].shi2_netname, pBuffer[i].shi2_path, pBuffer[i].shi2_remark);
40 }
41
42 NetApiBufferFree(pBuffer);
43 pBuffer = NULL;
44 }
45 while (Status == ERROR_MORE_DATA);
46
47 return NERR_Success;
48 }
49
50
51 NET_API_STATUS
52 DisplayShare(
53 PWSTR pShareName)
54 {
55 PSHARE_INFO_2 pBuffer = NULL;
56 INT nPaddedLength = 22;
57 NET_API_STATUS Status;
58
59 Status = NetShareGetInfo(NULL,
60 pShareName,
61 2,
62 (LPBYTE*)&pBuffer);
63 if (Status != NERR_Success)
64 return Status;
65
66 PrintPaddedMessageString(4731, nPaddedLength);
67 ConPrintf(StdOut, L"%s\n", pBuffer->shi2_netname);
68
69 PrintPaddedMessageString(4339, nPaddedLength);
70 ConPrintf(StdOut, L"%s\n", pBuffer->shi2_path);
71
72 PrintPaddedMessageString(4334, nPaddedLength);
73 ConPrintf(StdOut, L"%s\n", pBuffer->shi2_remark);
74
75 PrintPaddedMessageString(4735, nPaddedLength);
76 if (pBuffer->shi2_max_uses == (DWORD)-1)
77 PrintMessageString(4736);
78 else
79 ConPrintf(StdOut, L"%lu", pBuffer->shi2_max_uses);
80 ConPrintf(StdOut, L"\n");
81
82 PrintPaddedMessageString(4737, nPaddedLength);
83 if (pBuffer->shi2_current_uses > 0)
84 ConPrintf(StdOut, L"%lu", pBuffer->shi2_current_uses);
85 ConPrintf(StdOut, L"\n");
86
87 NetApiBufferFree(pBuffer);
88
89 return NERR_Success;
90 }
91
92
93 INT
94 cmdShare(
95 INT argc,
96 WCHAR **argv)
97 {
98 SHARE_INFO_2 ShareInfo;
99 PWSTR pszShareName = NULL;
100 PWSTR pszSharePath = NULL;
101 PWSTR ptr;
102 BOOL bDelete = FALSE;
103 INT len;
104 INT i, result = 0;
105 NET_API_STATUS Status;
106
107 i = 2;
108 if (argc > 2 && argv[i][0] != L'/')
109 {
110 ptr = wcschr(argv[i], L'=');
111 if (ptr != NULL)
112 {
113 if (ptr[1] != UNICODE_NULL)
114 {
115 len = wcslen(&ptr[i]);
116 pszSharePath = HeapAlloc(GetProcessHeap(),
117 HEAP_ZERO_MEMORY,
118 (len + 1) * sizeof(WCHAR));
119 if (pszSharePath == NULL)
120 {
121 // FIXME: Proper error code!
122 return 1;
123 }
124
125 wcscpy(pszSharePath, &ptr[1]);
126 }
127
128 len = ((INT_PTR)ptr - (INT_PTR)argv[i]) / sizeof(WCHAR);
129 pszShareName = HeapAlloc(GetProcessHeap(),
130 HEAP_ZERO_MEMORY,
131 (len + 1) * sizeof(WCHAR));
132 if (pszShareName == NULL)
133 {
134 // FIXME: Proper error code!
135 return 1;
136 }
137
138 wcsncpy(pszShareName, argv[i], len);
139 }
140 else
141 {
142 len = wcslen(argv[i]);
143 pszShareName = HeapAlloc(GetProcessHeap(),
144 HEAP_ZERO_MEMORY,
145 (len + 1) * sizeof(WCHAR));
146 if (pszShareName == NULL)
147 {
148 // FIXME: Proper error code!
149 return 1;
150 }
151
152 wcscpy(pszShareName, argv[i]);
153 }
154
155 i++;
156 }
157
158 for (; i < argc; i++)
159 {
160 if (_wcsicmp(argv[i], L"/help") == 0)
161 {
162 /* Print full help text*/
163 PrintMessageString(4381);
164 ConPuts(StdOut, L"\n");
165 PrintNetMessage(MSG_SHARE_SYNTAX);
166 PrintNetMessage(MSG_SHARE_HELP);
167 return 0;
168 }
169 else if (_wcsicmp(argv[i], L"/delete") == 0)
170 {
171 bDelete = TRUE;
172 }
173 }
174
175 printf("pszShareName: '%S'\n", pszShareName);
176 printf("pszSharePath: '%S'\n", pszSharePath);
177
178 if (pszShareName == NULL && pszSharePath == NULL)
179 {
180 Status = EnumerateShares();
181 ConPrintf(StdOut, L"Status: %lu\n", Status);
182 }
183 else if (pszShareName != NULL && pszSharePath == NULL)
184 {
185 if (bDelete == TRUE)
186 {
187 Status = NetShareDel(NULL,
188 pszShareName,
189 0);
190 }
191 else
192 {
193 Status = DisplayShare(pszShareName);
194 }
195
196 ConPrintf(StdOut, L"Status: %lu\n", Status);
197 }
198 else if (pszShareName != NULL && pszSharePath != NULL)
199 {
200 ZeroMemory(&ShareInfo, sizeof(SHARE_INFO_2));
201 ShareInfo.shi2_netname = pszShareName;
202 ShareInfo.shi2_path = pszSharePath;
203
204 Status = NetShareAdd(NULL,
205 2,
206 (LPBYTE)&ShareInfo,
207 NULL);
208
209 ConPrintf(StdOut, L"Status: %lu\n", Status);
210 }
211
212 if (pszSharePath != NULL)
213 HeapFree(GetProcessHeap(), 0, pszSharePath);
214
215 if (pszShareName != NULL)
216 HeapFree(GetProcessHeap(), 0, pszShareName);
217
218 return result;
219 }
220
221 /* EOF */