2 * Unix SMB/CIFS implementation.
4 * Copyright (C) Guenther Deschner 2008
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.
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.
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/>.
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"
27 /****************************************************************
28 ****************************************************************/
30 WERROR NetFileClose_r(struct libnetapi_ctx *ctx,
31 struct NetFileClose *r)
35 struct cli_state *cli = NULL;
36 struct rpc_pipe_client *pipe_cli = NULL;
38 werr = libnetapi_open_pipe(ctx, r->in.server_name,
39 &ndr_table_srvsvc.syntax_id,
42 if (!W_ERROR_IS_OK(werr)) {
46 status = rpccli_srvsvc_NetFileClose(pipe_cli, ctx,
50 if (!NT_STATUS_IS_OK(status)) {
51 werr = ntstatus_to_werror(status);
63 /****************************************************************
64 ****************************************************************/
66 WERROR NetFileClose_l(struct libnetapi_ctx *ctx,
67 struct NetFileClose *r)
69 LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, NetFileClose);
72 /****************************************************************
73 ****************************************************************/
75 static NTSTATUS map_srvsvc_FileInfo_to_FILE_INFO_buffer(TALLOC_CTX *mem_ctx,
77 union srvsvc_NetFileInfo *info,
79 uint32_t *num_entries)
81 struct FILE_INFO_2 i2;
82 struct FILE_INFO_3 i3;
86 i2.fi2_id = info->info2->fid;
88 ADD_TO_ARRAY(mem_ctx, struct FILE_INFO_2, i2,
89 (struct FILE_INFO_2 **)buffer,
93 i3.fi3_id = info->info3->fid;
94 i3.fi3_permissions = info->info3->permissions;
95 i3.fi3_num_locks = info->info3->num_locks;
96 i3.fi3_pathname = talloc_strdup(mem_ctx, info->info3->path);
97 i3.fi3_username = talloc_strdup(mem_ctx, info->info3->user);
99 NT_STATUS_HAVE_NO_MEMORY(i3.fi3_pathname);
100 NT_STATUS_HAVE_NO_MEMORY(i3.fi3_username);
102 ADD_TO_ARRAY(mem_ctx, struct FILE_INFO_3, i3,
103 (struct FILE_INFO_3 **)buffer,
107 return NT_STATUS_INVALID_INFO_CLASS;
113 /****************************************************************
114 ****************************************************************/
116 WERROR NetFileGetInfo_r(struct libnetapi_ctx *ctx,
117 struct NetFileGetInfo *r)
121 struct cli_state *cli = NULL;
122 struct rpc_pipe_client *pipe_cli = NULL;
123 union srvsvc_NetFileInfo info;
124 uint32_t num_entries = 0;
126 if (!r->out.buffer) {
127 return WERR_INVALID_PARAM;
130 switch (r->in.level) {
135 return WERR_UNKNOWN_LEVEL;
138 werr = libnetapi_open_pipe(ctx, r->in.server_name,
139 &ndr_table_srvsvc.syntax_id,
142 if (!W_ERROR_IS_OK(werr)) {
146 status = rpccli_srvsvc_NetFileGetInfo(pipe_cli, ctx,
152 if (!W_ERROR_IS_OK(werr)) {
156 status = map_srvsvc_FileInfo_to_FILE_INFO_buffer(ctx,
161 if (!NT_STATUS_IS_OK(status)) {
162 werr = ntstatus_to_werror(status);
173 /****************************************************************
174 ****************************************************************/
176 WERROR NetFileGetInfo_l(struct libnetapi_ctx *ctx,
177 struct NetFileGetInfo *r)
179 LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, NetFileGetInfo);
182 /****************************************************************
183 ****************************************************************/
185 WERROR NetFileEnum_r(struct libnetapi_ctx *ctx,
186 struct NetFileEnum *r)
190 struct cli_state *cli = NULL;
191 struct rpc_pipe_client *pipe_cli = NULL;
192 struct srvsvc_NetFileInfoCtr info_ctr;
193 struct srvsvc_NetFileCtr2 ctr2;
194 struct srvsvc_NetFileCtr3 ctr3;
195 uint32_t num_entries = 0;
198 if (!r->out.buffer) {
199 return WERR_INVALID_PARAM;
202 switch (r->in.level) {
207 return WERR_UNKNOWN_LEVEL;
210 werr = libnetapi_open_pipe(ctx, r->in.server_name,
211 &ndr_table_srvsvc.syntax_id,
214 if (!W_ERROR_IS_OK(werr)) {
218 ZERO_STRUCT(info_ctr);
220 info_ctr.level = r->in.level;
221 switch (r->in.level) {
224 info_ctr.ctr.ctr2 = &ctr2;
228 info_ctr.ctr.ctr3 = &ctr3;
232 status = rpccli_srvsvc_NetFileEnum(pipe_cli, ctx,
238 r->out.total_entries,
239 r->out.resume_handle,
241 if (NT_STATUS_IS_ERR(status)) {
245 for (i=0; i < info_ctr.ctr.ctr2->count; i++) {
246 union srvsvc_NetFileInfo _i;
247 switch (r->in.level) {
249 _i.info2 = &info_ctr.ctr.ctr2->array[i];
252 _i.info3 = &info_ctr.ctr.ctr3->array[i];
256 status = map_srvsvc_FileInfo_to_FILE_INFO_buffer(ctx,
261 if (!NT_STATUS_IS_OK(status)) {
262 werr = ntstatus_to_werror(status);
267 if (r->out.entries_read) {
268 *r->out.entries_read = num_entries;
271 if (r->out.total_entries) {
272 *r->out.total_entries = num_entries;
283 /****************************************************************
284 ****************************************************************/
286 WERROR NetFileEnum_l(struct libnetapi_ctx *ctx,
287 struct NetFileEnum *r)
289 LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, NetFileEnum);