/*
* Unix SMB/CIFS implementation.
* NetApi File Support
* Copyright (C) Guenther Deschner 2008
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*/
#include "includes.h"
#include "librpc/gen_ndr/libnetapi.h"
#include "lib/netapi/netapi.h"
#include "lib/netapi/netapi_private.h"
#include "lib/netapi/libnetapi.h"
#include "../librpc/gen_ndr/cli_srvsvc.h"
/****************************************************************
****************************************************************/
WERROR NetFileClose_r(struct libnetapi_ctx *ctx,
struct NetFileClose *r)
{
WERROR werr;
NTSTATUS status;
struct rpc_pipe_client *pipe_cli = NULL;
werr = libnetapi_open_pipe(ctx, r->in.server_name,
&ndr_table_srvsvc.syntax_id,
&pipe_cli);
if (!W_ERROR_IS_OK(werr)) {
goto done;
}
status = rpccli_srvsvc_NetFileClose(pipe_cli, ctx,
r->in.server_name,
r->in.fileid,
&werr);
if (!NT_STATUS_IS_OK(status)) {
werr = ntstatus_to_werror(status);
goto done;
}
done:
return werr;
}
/****************************************************************
****************************************************************/
WERROR NetFileClose_l(struct libnetapi_ctx *ctx,
struct NetFileClose *r)
{
LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, NetFileClose);
}
/****************************************************************
****************************************************************/
static NTSTATUS map_srvsvc_FileInfo_to_FILE_INFO_buffer(TALLOC_CTX *mem_ctx,
uint32_t level,
union srvsvc_NetFileInfo *info,
uint8_t **buffer,
uint32_t *num_entries)
{
struct FILE_INFO_2 i2;
struct FILE_INFO_3 i3;
switch (level) {
case 2:
i2.fi2_id = info->info2->fid;
ADD_TO_ARRAY(mem_ctx, struct FILE_INFO_2, i2,
(struct FILE_INFO_2 **)buffer,
num_entries);
break;
case 3:
i3.fi3_id = info->info3->fid;
i3.fi3_permissions = info->info3->permissions;
i3.fi3_num_locks = info->info3->num_locks;
i3.fi3_pathname = talloc_strdup(mem_ctx, info->info3->path);
i3.fi3_username = talloc_strdup(mem_ctx, info->info3->user);
NT_STATUS_HAVE_NO_MEMORY(i3.fi3_pathname);
NT_STATUS_HAVE_NO_MEMORY(i3.fi3_username);
ADD_TO_ARRAY(mem_ctx, struct FILE_INFO_3, i3,
(struct FILE_INFO_3 **)buffer,
num_entries);
break;
default:
return NT_STATUS_INVALID_INFO_CLASS;
}
return NT_STATUS_OK;
}
/****************************************************************
****************************************************************/
WERROR NetFileGetInfo_r(struct libnetapi_ctx *ctx,
struct NetFileGetInfo *r)
{
WERROR werr;
NTSTATUS status;
struct rpc_pipe_client *pipe_cli = NULL;
union srvsvc_NetFileInfo info;
uint32_t num_entries = 0;
if (!r->out.buffer) {
return WERR_INVALID_PARAM;
}
switch (r->in.level) {
case 2:
case 3:
break;
default:
return WERR_UNKNOWN_LEVEL;
}
werr = libnetapi_open_pipe(ctx, r->in.server_name,
&ndr_table_srvsvc.syntax_id,
&pipe_cli);
if (!W_ERROR_IS_OK(werr)) {
goto done;
}
status = rpccli_srvsvc_NetFileGetInfo(pipe_cli, ctx,
r->in.server_name,
r->in.fileid,
r->in.level,
&info,
&werr);
if (!W_ERROR_IS_OK(werr)) {
goto done;
}
status = map_srvsvc_FileInfo_to_FILE_INFO_buffer(ctx,
r->in.level,
&info,
r->out.buffer,
&num_entries);
if (!NT_STATUS_IS_OK(status)) {
werr = ntstatus_to_werror(status);
goto done;
}
done:
return werr;
}
/****************************************************************
****************************************************************/
WERROR NetFileGetInfo_l(struct libnetapi_ctx *ctx,
struct NetFileGetInfo *r)
{
LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, NetFileGetInfo);
}
/****************************************************************
****************************************************************/
WERROR NetFileEnum_r(struct libnetapi_ctx *ctx,
struct NetFileEnum *r)
{
WERROR werr;
NTSTATUS status;
struct rpc_pipe_client *pipe_cli = NULL;
struct srvsvc_NetFileInfoCtr info_ctr;
struct srvsvc_NetFileCtr2 ctr2;
struct srvsvc_NetFileCtr3 ctr3;
uint32_t num_entries = 0;
uint32_t i;
if (!r->out.buffer) {
return WERR_INVALID_PARAM;
}
switch (r->in.level) {
case 2:
case 3:
break;
default:
return WERR_UNKNOWN_LEVEL;
}
werr = libnetapi_open_pipe(ctx, r->in.server_name,
&ndr_table_srvsvc.syntax_id,
&pipe_cli);
if (!W_ERROR_IS_OK(werr)) {
goto done;
}
ZERO_STRUCT(info_ctr);
info_ctr.level = r->in.level;
switch (r->in.level) {
case 2:
ZERO_STRUCT(ctr2);
info_ctr.ctr.ctr2 = &ctr2;
break;
case 3:
ZERO_STRUCT(ctr3);
info_ctr.ctr.ctr3 = &ctr3;
break;
}
status = rpccli_srvsvc_NetFileEnum(pipe_cli, ctx,
r->in.server_name,
r->in.base_path,
r->in.user_name,
&info_ctr,
r->in.prefmaxlen,
r->out.total_entries,
r->out.resume_handle,
&werr);
if (NT_STATUS_IS_ERR(status)) {
goto done;
}
for (i=0; i < info_ctr.ctr.ctr2->count; i++) {
union srvsvc_NetFileInfo _i;
switch (r->in.level) {
case 2:
_i.info2 = &info_ctr.ctr.ctr2->array[i];
break;
case 3:
_i.info3 = &info_ctr.ctr.ctr3->array[i];
break;
}
status = map_srvsvc_FileInfo_to_FILE_INFO_buffer(ctx,
r->in.level,
&_i,
r->out.buffer,
&num_entries);
if (!NT_STATUS_IS_OK(status)) {
werr = ntstatus_to_werror(status);
goto done;
}
}
if (r->out.entries_read) {
*r->out.entries_read = num_entries;
}
if (r->out.total_entries) {
*r->out.total_entries = num_entries;
}
done:
return werr;
}
/****************************************************************
****************************************************************/
WERROR NetFileEnum_l(struct libnetapi_ctx *ctx,
struct NetFileEnum *r)
{
LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, NetFileEnum);
}
;I]vB^ߦeqB-~M$0,%qhR\'Ǫ-gaץDhB{f=n&>!@YR;>4L
y,~X2FRo;#C\1îqk=FMn3;ySw1NL]~M֜dyknT[5d5D3.I6m%d~ gx\iX3%h袟l9]Y)5x6<=)(`\8
dG7y7^UWFۼ2P*Zq>^yn Q
j1'{Z;9V")w
m3Bft\3`'q\Cyk2iJوgjn ܮХj@/")XhK)j˧ $p*V٤W:a]~C? T,lW3XUֆZ{f6r|.i*4A&N:l3yXRr. 皷ֲ?r4&Y1[L<<;\,0Ł/ISdp*Plbp/ʠµ팶{sPWȪ:;,J9uS[>GZH5kn62)Pzr:砘M
BudN
A6I-J8=T״Ts3d av䙥ɌSuS iG9yR|/1F̢$@?`9Ay~Ϋ%Oväzl|I{=;zJ Q&oMLNpd[t|]e G9
x5 gkMCrY{'DtP='-L_hު`KhwJC
pX-&XAH
Z/2]&C* |ojO|Ρ [xU<->MmTS_TIňSʜȈ>H;t,Y6H9VwCRXTNdbԮÑuǹtz0
.)t;tFWdE2Vn#qjϕ;~)Z;8bd%wL+!@ǀ|Z07TH(uq`fT 'vf5zyfR`~XbeC<2FSh榊ǧPiQj=F6f\xJ#4%e)k;1D9[b8:Yb70rX6!X5^jX:'u| J~l1h@h
=nVUͿӼdYpj).]zF]I`H˝
;]yБ^1_5Cpc](ݔ ij|
iljm7!TCaٚٿqE
㡏f⼼^umK d$SD T"CrOS\,(K)W,)ÔCׯhzUQ( ]Qd/-:+\qء`LPLSDٗQt@{4k_R?AF5sCS
㖓3+B:K+{$0ØF^u;>˹s"On)q1b@)$s~PڔT$G@t L5:1I>2*ho[
n
_֖@|o>/d?F`hI̯M:-<ڶqC7J aM25atH
2LÝf9>%&,ظ1 /9 꽚b
A\MmncgDat&tV`뜧JoKj2lt0#]阯:@f W`WΕWvR 0su6Oס\SDeR=yDͼ%N02Kdc?xJI
7»Mo]igޅ ?c(EWd+^Jyγ$Oij0RkzQKvͣ^0k@# 'Oƪ`n[ؕr'QQA6\U?ߓ;H ݫ7$P"k}ej+R}Ijzou47S9xq.
U}EFۢs^Q3y'}p%ysSz6%bU|g'yBzUA9>E=L8zmL3:358_q-Q^Xclq/w̸hCVd(mR}mx('N<[HbJfLޤR'Rl;aP_E*LS`hPsB8<82LպJaYx?=3BXVpc
u+a:4>#.$)Jrt2GWfS97?zvfJKΩø!!3̑ ,s9PLJ#:½gƭfɐP|ז
oE6y16t!xUR2ǦȲ ZZW93ooSK<Q>V1HVVaw$B^=,,
`3_+94r`~ -k[ڍhq
ط0˔DaHnH[!0ѳӒvFĦ8,a b)4bW.3(Op412qU]9}*̥WQ uϼ ܛxN$ht75YOLPnK42uta8pɸGh$ZV}U^# 祗th]&!D[Jŵꭹ9M ~U w@:XdO,팞++=3I_Or|K2"B*E v22r~z
> UVNɪlՌ6;\hk3 YKsLǘH瑌ޥݾja9 {۹g̚{$-
4G5.l