Line data Source code
1 : /*
2 : * Unix SMB/CIFS implementation.
3 : * NetApi File Support
4 : * Copyright (C) Guenther Deschner 2008
5 : *
6 : * This program is free software; you can redistribute it and/or modify
7 : * it under the terms of the GNU General Public License as published by
8 : * the Free Software Foundation; either version 3 of the License, or
9 : * (at your option) any later version.
10 : *
11 : * This program is distributed in the hope that it will be useful,
12 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : * GNU General Public License for more details.
15 : *
16 : * You should have received a copy of the GNU General Public License
17 : * along with this program; if not, see <http://www.gnu.org/licenses/>.
18 : */
19 :
20 : #include "includes.h"
21 :
22 : #include "librpc/gen_ndr/libnetapi.h"
23 : #include "lib/netapi/netapi.h"
24 : #include "lib/netapi/netapi_private.h"
25 : #include "lib/netapi/libnetapi.h"
26 : #include "../librpc/gen_ndr/ndr_srvsvc_c.h"
27 :
28 : /****************************************************************
29 : ****************************************************************/
30 :
31 0 : WERROR NetFileClose_r(struct libnetapi_ctx *ctx,
32 : struct NetFileClose *r)
33 : {
34 0 : WERROR werr;
35 0 : NTSTATUS status;
36 0 : struct dcerpc_binding_handle *b;
37 :
38 0 : werr = libnetapi_get_binding_handle(ctx, r->in.server_name,
39 : &ndr_table_srvsvc,
40 : &b);
41 0 : if (!W_ERROR_IS_OK(werr)) {
42 0 : goto done;
43 : }
44 :
45 0 : status = dcerpc_srvsvc_NetFileClose(b, talloc_tos(),
46 : r->in.server_name,
47 : r->in.fileid,
48 : &werr);
49 0 : if (!NT_STATUS_IS_OK(status)) {
50 0 : werr = ntstatus_to_werror(status);
51 0 : goto done;
52 : }
53 :
54 0 : done:
55 0 : return werr;
56 : }
57 :
58 : /****************************************************************
59 : ****************************************************************/
60 :
61 0 : WERROR NetFileClose_l(struct libnetapi_ctx *ctx,
62 : struct NetFileClose *r)
63 : {
64 0 : LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, NetFileClose);
65 : }
66 :
67 : /****************************************************************
68 : ****************************************************************/
69 :
70 0 : static NTSTATUS map_srvsvc_FileInfo_to_FILE_INFO_buffer(TALLOC_CTX *mem_ctx,
71 : uint32_t level,
72 : union srvsvc_NetFileInfo *info,
73 : uint8_t **buffer,
74 : uint32_t *num_entries)
75 : {
76 0 : struct FILE_INFO_2 i2;
77 0 : struct FILE_INFO_3 i3;
78 :
79 0 : switch (level) {
80 0 : case 2:
81 0 : i2.fi2_id = info->info2->fid;
82 :
83 0 : ADD_TO_ARRAY(mem_ctx, struct FILE_INFO_2, i2,
84 : (struct FILE_INFO_2 **)buffer,
85 : num_entries);
86 0 : break;
87 0 : case 3:
88 0 : i3.fi3_id = info->info3->fid;
89 0 : i3.fi3_permissions = info->info3->permissions;
90 0 : i3.fi3_num_locks = info->info3->num_locks;
91 0 : i3.fi3_pathname = talloc_strdup(mem_ctx, info->info3->path);
92 0 : i3.fi3_username = talloc_strdup(mem_ctx, info->info3->user);
93 :
94 0 : NT_STATUS_HAVE_NO_MEMORY(i3.fi3_pathname);
95 0 : NT_STATUS_HAVE_NO_MEMORY(i3.fi3_username);
96 :
97 0 : ADD_TO_ARRAY(mem_ctx, struct FILE_INFO_3, i3,
98 : (struct FILE_INFO_3 **)buffer,
99 : num_entries);
100 0 : break;
101 0 : default:
102 0 : return NT_STATUS_INVALID_INFO_CLASS;
103 : }
104 :
105 0 : return NT_STATUS_OK;
106 : }
107 :
108 : /****************************************************************
109 : ****************************************************************/
110 :
111 0 : WERROR NetFileGetInfo_r(struct libnetapi_ctx *ctx,
112 : struct NetFileGetInfo *r)
113 : {
114 0 : WERROR werr;
115 0 : NTSTATUS status;
116 0 : union srvsvc_NetFileInfo info;
117 0 : uint32_t num_entries = 0;
118 0 : struct dcerpc_binding_handle *b;
119 :
120 0 : if (!r->out.buffer) {
121 0 : return WERR_INVALID_PARAMETER;
122 : }
123 :
124 0 : switch (r->in.level) {
125 0 : case 2:
126 : case 3:
127 0 : break;
128 0 : default:
129 0 : return WERR_INVALID_LEVEL;
130 : }
131 :
132 0 : werr = libnetapi_get_binding_handle(ctx, r->in.server_name,
133 : &ndr_table_srvsvc,
134 : &b);
135 0 : if (!W_ERROR_IS_OK(werr)) {
136 0 : goto done;
137 : }
138 :
139 0 : status = dcerpc_srvsvc_NetFileGetInfo(b, talloc_tos(),
140 : r->in.server_name,
141 : r->in.fileid,
142 : r->in.level,
143 : &info,
144 : &werr);
145 0 : if (!NT_STATUS_IS_OK(status)) {
146 0 : werr = ntstatus_to_werror(status);
147 0 : goto done;
148 : }
149 :
150 0 : if (!W_ERROR_IS_OK(werr)) {
151 0 : goto done;
152 : }
153 :
154 0 : status = map_srvsvc_FileInfo_to_FILE_INFO_buffer(ctx,
155 : r->in.level,
156 : &info,
157 : r->out.buffer,
158 : &num_entries);
159 0 : if (!NT_STATUS_IS_OK(status)) {
160 0 : werr = ntstatus_to_werror(status);
161 0 : goto done;
162 : }
163 0 : done:
164 0 : return werr;
165 : }
166 :
167 : /****************************************************************
168 : ****************************************************************/
169 :
170 0 : WERROR NetFileGetInfo_l(struct libnetapi_ctx *ctx,
171 : struct NetFileGetInfo *r)
172 : {
173 0 : LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, NetFileGetInfo);
174 : }
175 :
176 : /****************************************************************
177 : ****************************************************************/
178 :
179 0 : WERROR NetFileEnum_r(struct libnetapi_ctx *ctx,
180 : struct NetFileEnum *r)
181 : {
182 0 : WERROR werr;
183 0 : NTSTATUS status;
184 0 : struct srvsvc_NetFileInfoCtr info_ctr;
185 0 : struct srvsvc_NetFileCtr2 ctr2;
186 0 : struct srvsvc_NetFileCtr3 ctr3;
187 0 : uint32_t num_entries = 0;
188 0 : uint32_t i;
189 0 : struct dcerpc_binding_handle *b;
190 :
191 0 : if (!r->out.buffer) {
192 0 : return WERR_INVALID_PARAMETER;
193 : }
194 :
195 0 : switch (r->in.level) {
196 0 : case 2:
197 : case 3:
198 0 : break;
199 0 : default:
200 0 : return WERR_INVALID_LEVEL;
201 : }
202 :
203 0 : werr = libnetapi_get_binding_handle(ctx, r->in.server_name,
204 : &ndr_table_srvsvc,
205 : &b);
206 0 : if (!W_ERROR_IS_OK(werr)) {
207 0 : goto done;
208 : }
209 :
210 0 : ZERO_STRUCT(info_ctr);
211 :
212 0 : info_ctr.level = r->in.level;
213 0 : switch (r->in.level) {
214 0 : case 2:
215 0 : ZERO_STRUCT(ctr2);
216 0 : info_ctr.ctr.ctr2 = &ctr2;
217 0 : break;
218 0 : case 3:
219 0 : ZERO_STRUCT(ctr3);
220 0 : info_ctr.ctr.ctr3 = &ctr3;
221 0 : break;
222 : }
223 :
224 0 : status = dcerpc_srvsvc_NetFileEnum(b, talloc_tos(),
225 : r->in.server_name,
226 : r->in.base_path,
227 : r->in.user_name,
228 : &info_ctr,
229 : r->in.prefmaxlen,
230 : r->out.total_entries,
231 : r->out.resume_handle,
232 : &werr);
233 0 : if (!NT_STATUS_IS_OK(status)) {
234 0 : werr = ntstatus_to_werror(status);
235 0 : goto done;
236 : }
237 :
238 0 : if (!W_ERROR_IS_OK(werr) && !W_ERROR_EQUAL(werr, WERR_MORE_DATA)) {
239 0 : goto done;
240 : }
241 :
242 0 : for (i=0; i < info_ctr.ctr.ctr2->count; i++) {
243 0 : union srvsvc_NetFileInfo _i = {0};
244 0 : switch (r->in.level) {
245 0 : case 2:
246 0 : _i.info2 = &info_ctr.ctr.ctr2->array[i];
247 0 : break;
248 0 : case 3:
249 0 : _i.info3 = &info_ctr.ctr.ctr3->array[i];
250 0 : break;
251 : }
252 :
253 0 : status = map_srvsvc_FileInfo_to_FILE_INFO_buffer(ctx,
254 : r->in.level,
255 : &_i,
256 : r->out.buffer,
257 : &num_entries);
258 0 : if (!NT_STATUS_IS_OK(status)) {
259 0 : werr = ntstatus_to_werror(status);
260 0 : goto done;
261 : }
262 : }
263 :
264 0 : if (r->out.entries_read) {
265 0 : *r->out.entries_read = num_entries;
266 : }
267 :
268 0 : if (r->out.total_entries) {
269 0 : *r->out.total_entries = num_entries;
270 : }
271 :
272 0 : done:
273 0 : return werr;
274 : }
275 :
276 : /****************************************************************
277 : ****************************************************************/
278 :
279 0 : WERROR NetFileEnum_l(struct libnetapi_ctx *ctx,
280 : struct NetFileEnum *r)
281 : {
282 0 : LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, NetFileEnum);
283 : }
|