*/
#include "includes.h"
+#include "rpc_server/dcerpc_server.h"
+#include "librpc/gen_ndr/ndr_srvsvc.h"
#include "rpc_server/common/common.h"
+#include "system/time.h"
/*
srvsvc_NetCharDevEnum
*/
-static NTSTATUS srvsvc_NetCharDevEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct srvsvc_NetCharDevEnum *r)
+static WERROR srvsvc_NetCharDevEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+ struct srvsvc_NetCharDevEnum *r)
{
r->out.level = r->in.level;
r->out.totalentries = 0;
r->out.resume_handle = NULL;
- r->out.result = WERR_OK;
switch (r->in.level) {
case 0:
- r->out.ctr.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetCharDevCtr0);
- WERR_TALLOC_CHECK(r->out.ctr.ctr0);
+ r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetCharDevCtr0);
+ W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
r->out.ctr.ctr0->count = 0;
r->out.ctr.ctr0->array = NULL;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
+ return WERR_NOT_SUPPORTED;
+
case 1:
- r->out.ctr.ctr1 = talloc_p(mem_ctx, struct srvsvc_NetCharDevCtr1);
- WERR_TALLOC_CHECK(r->out.ctr.ctr1);
+ r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetCharDevCtr1);
+ W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
r->out.ctr.ctr1->count = 0;
r->out.ctr.ctr1->array = NULL;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
+ return WERR_NOT_SUPPORTED;
+
default:
- r->out.result = WERR_UNKNOWN_LEVEL;
- break;
+ return WERR_UNKNOWN_LEVEL;
}
- return NT_STATUS_OK;
+ return WERR_OK;
}
/*
srvsvc_NetCharDevGetInfo
*/
-static NTSTATUS srvsvc_NetCharDevGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NetCharDevGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NetCharDevGetInfo *r)
{
- r->out.result = WERR_OK;
+ ZERO_STRUCT(r->out);
switch (r->in.level) {
case 0:
- r->out.info.info0 = NULL;
-
- r->out.result = WERR_NOT_SUPPORTED;
- break;
+ {
+ return WERR_NOT_SUPPORTED;
+ }
case 1:
- r->out.info.info1 = NULL;
-
- r->out.result = WERR_NOT_SUPPORTED;
- break;
+ {
+ return WERR_NOT_SUPPORTED;
+ }
default:
- r->out.result = WERR_UNKNOWN_LEVEL;
- break;
+ return WERR_UNKNOWN_LEVEL;
}
- return NT_STATUS_OK;
+ return WERR_UNKNOWN_LEVEL;
}
/*
srvsvc_NetCharDevControl
*/
-static NTSTATUS srvsvc_NetCharDevControl(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NetCharDevControl(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NetCharDevControl *r)
{
- r->out.result = WERR_NOT_SUPPORTED;
- return NT_STATUS_OK;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NetCharDevQEnum
*/
-static NTSTATUS srvsvc_NetCharDevQEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct srvsvc_NetCharDevQEnum *r)
+static WERROR srvsvc_NetCharDevQEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+ struct srvsvc_NetCharDevQEnum *r)
{
r->out.level = r->in.level;
r->out.totalentries = 0;
r->out.resume_handle = NULL;
- r->out.result = WERR_OK;
switch (r->in.level) {
case 0:
- r->out.ctr.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetCharDevQCtr0);
- WERR_TALLOC_CHECK(r->out.ctr.ctr0);
+ {
+ r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr0);
+ W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
r->out.ctr.ctr0->count = 0;
r->out.ctr.ctr0->array = NULL;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
+ return WERR_NOT_SUPPORTED;
+ }
case 1:
- r->out.ctr.ctr1 = talloc_p(mem_ctx, struct srvsvc_NetCharDevQCtr1);
- WERR_TALLOC_CHECK(r->out.ctr.ctr1);
+ {
+ r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr1);
+ W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
r->out.ctr.ctr1->count = 0;
r->out.ctr.ctr1->array = NULL;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
+ return WERR_NOT_SUPPORTED;
+ }
default:
- r->out.result = WERR_UNKNOWN_LEVEL;
- break;
+ return WERR_UNKNOWN_LEVEL;
}
- return NT_STATUS_OK;
+ return WERR_UNKNOWN_LEVEL;
}
/*
srvsvc_NetCharDevQGetInfo
*/
-static NTSTATUS srvsvc_NetCharDevQGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct srvsvc_NetCharDevQGetInfo *r)
+static WERROR srvsvc_NetCharDevQGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+ struct srvsvc_NetCharDevQGetInfo *r)
{
- r->out.result = WERR_OK;
+ ZERO_STRUCT(r->out);
switch (r->in.level) {
case 0:
- r->out.info.info0 = NULL;
-
- r->out.result = WERR_NOT_SUPPORTED;
- break;
+ {
+ return WERR_NOT_SUPPORTED;
+ }
case 1:
- r->out.info.info1 = NULL;
-
- r->out.result = WERR_NOT_SUPPORTED;
- break;
+ {
+ return WERR_NOT_SUPPORTED;
+ }
default:
- r->out.result = WERR_UNKNOWN_LEVEL;
- break;
+ return WERR_UNKNOWN_LEVEL;
}
- return NT_STATUS_OK;
+ return WERR_UNKNOWN_LEVEL;
}
/*
srvsvc_NetCharDevQSetInfo
*/
-static NTSTATUS srvsvc_NetCharDevQSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NetCharDevQSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NetCharDevQSetInfo *r)
{
- r->out.result = WERR_OK;
-
switch (r->in.level) {
- case 0:
+ case 0:
+ {
if (r->in.parm_error) {
r->out.parm_error = r->in.parm_error;
}
- r->out.result = WERR_NOT_SUPPORTED;
- break;
+ return WERR_NOT_SUPPORTED;
+ }
case 1:
+ {
if (r->in.parm_error) {
r->out.parm_error = r->in.parm_error;
}
- r->out.result = WERR_NOT_SUPPORTED;
- break;
+ return WERR_NOT_SUPPORTED;
+ }
default:
- r->out.result = WERR_UNKNOWN_LEVEL;
- break;
+ return WERR_UNKNOWN_LEVEL;
}
- return NT_STATUS_OK;
+ return WERR_UNKNOWN_LEVEL;
}
/*
srvsvc_NetCharDevQPurge
*/
-static NTSTATUS srvsvc_NetCharDevQPurge(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NetCharDevQPurge(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NetCharDevQPurge *r)
{
- r->out.result = WERR_NOT_SUPPORTED;
- return NT_STATUS_OK;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NetCharDevQPurgeSelf
*/
-static NTSTATUS srvsvc_NetCharDevQPurgeSelf(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct srvsvc_NetCharDevQPurgeSelf *r)
+static WERROR srvsvc_NetCharDevQPurgeSelf(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+ struct srvsvc_NetCharDevQPurgeSelf *r)
{
- r->out.result = WERR_NOT_SUPPORTED;
- return NT_STATUS_OK;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NetConnEnum
*/
-static NTSTATUS srvsvc_NetConnEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NetConnEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NetConnEnum *r)
{
r->out.level = r->in.level;
r->out.totalentries = 0;
r->out.resume_handle = NULL;
- r->out.result = WERR_OK;
switch (r->in.level) {
- case 0: {
- r->out.ctr.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetConnCtr0);
- WERR_TALLOC_CHECK(r->out.ctr.ctr0);
+ case 0:
+ {
+ r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetConnCtr0);
+ W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
r->out.ctr.ctr0->count = 0;
r->out.ctr.ctr0->array = NULL;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
- }
- case 1: {
- r->out.ctr.ctr1 = talloc_p(mem_ctx, struct srvsvc_NetConnCtr1);
- WERR_TALLOC_CHECK(r->out.ctr.ctr1);
+ return WERR_NOT_SUPPORTED;
+ }
+ case 1:
+ {
+ r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetConnCtr1);
+ W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
r->out.ctr.ctr1->count = 0;
r->out.ctr.ctr1->array = NULL;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
- }
+ return WERR_NOT_SUPPORTED;
+ }
default:
- r->out.result = WERR_UNKNOWN_LEVEL;
- break;
+ return WERR_UNKNOWN_LEVEL;
}
- return NT_STATUS_OK;
+ return WERR_UNKNOWN_LEVEL;
}
/*
srvsvc_NetFileEnum
*/
-static NTSTATUS srvsvc_NetFileEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct srvsvc_NetFileEnum *r)
+static WERROR srvsvc_NetFileEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+ struct srvsvc_NetFileEnum *r)
{
r->out.level = r->in.level;
r->out.totalentries = 0;
r->out.resume_handle = NULL;
- r->out.result = WERR_OK;
switch (r->in.level) {
- case 2: {
- r->out.ctr.ctr2 = talloc_p(mem_ctx, struct srvsvc_NetFileCtr2);
- WERR_TALLOC_CHECK(r->out.ctr.ctr2);
+ case 2:
+ {
+ r->out.ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetFileCtr2);
+ W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr2);
r->out.ctr.ctr2->count = 0;
r->out.ctr.ctr2->array = NULL;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
- }
- case 3: {
- r->out.ctr.ctr3 = talloc_p(mem_ctx, struct srvsvc_NetFileCtr3);
- WERR_TALLOC_CHECK(r->out.ctr.ctr3);
+ return WERR_NOT_SUPPORTED;
+ }
+ case 3:
+ {
+ r->out.ctr.ctr3 = talloc(mem_ctx, struct srvsvc_NetFileCtr3);
+ W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr3);
r->out.ctr.ctr3->count = 0;
r->out.ctr.ctr3->array = NULL;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
- }
+ return WERR_NOT_SUPPORTED;
+ }
default:
- r->out.result = WERR_UNKNOWN_LEVEL;
- break;
+ return WERR_UNKNOWN_LEVEL;
}
- return NT_STATUS_OK;
+ return WERR_UNKNOWN_LEVEL;
}
/*
srvsvc_NetFileGetInfo
*/
-static NTSTATUS srvsvc_NetFileGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct srvsvc_NetFileGetInfo *r)
+static WERROR srvsvc_NetFileGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+ struct srvsvc_NetFileGetInfo *r)
{
- r->out.result = WERR_OK;
+ ZERO_STRUCT(r->out);
switch (r->in.level) {
- case 2: {
- r->out.info.info2 = NULL;
-
- r->out.result = WERR_NOT_SUPPORTED;
- break;
- }
- case 3: {
- r->out.info.info3 = NULL;
-
- r->out.result = WERR_NOT_SUPPORTED;
- break;
- }
+ case 2:
+ {
+ return WERR_NOT_SUPPORTED;
+ }
+ case 3:
+ {
+ return WERR_NOT_SUPPORTED;
+ }
default:
- r->out.result = WERR_UNKNOWN_LEVEL;
- break;
+ return WERR_UNKNOWN_LEVEL;
}
- return NT_STATUS_OK;
+ return WERR_UNKNOWN_LEVEL;
}
/*
srvsvc_NetFileClose
*/
-static NTSTATUS srvsvc_NetFileClose(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NetFileClose(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NetFileClose *r)
{
- r->out.result = WERR_NOT_SUPPORTED;
- return NT_STATUS_OK;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NetSessEnum
*/
-static NTSTATUS srvsvc_NetSessEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NetSessEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NetSessEnum *r)
{
r->out.level = r->in.level;
r->out.totalentries = 0;
r->out.resume_handle = NULL;
- r->out.result = WERR_OK;
switch (r->in.level) {
- case 0: {
- r->out.ctr.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetSessCtr0);
- WERR_TALLOC_CHECK(r->out.ctr.ctr0);
+ case 0:
+ {
+ r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetSessCtr0);
+ W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
r->out.ctr.ctr0->count = 0;
r->out.ctr.ctr0->array = NULL;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
- }
- case 1: {
- r->out.ctr.ctr1 = talloc_p(mem_ctx, struct srvsvc_NetSessCtr1);
- WERR_TALLOC_CHECK(r->out.ctr.ctr1);
+ return WERR_NOT_SUPPORTED;
+ }
+ case 1:
+ {
+ r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetSessCtr1);
+ W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
r->out.ctr.ctr1->count = 0;
r->out.ctr.ctr1->array = NULL;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
- }
- case 2: {
- r->out.ctr.ctr2 = talloc_p(mem_ctx, struct srvsvc_NetSessCtr2);
- WERR_TALLOC_CHECK(r->out.ctr.ctr2);
+ return WERR_NOT_SUPPORTED;
+ }
+ case 2:
+ {
+ r->out.ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetSessCtr2);
+ W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr2);
r->out.ctr.ctr2->count = 0;
r->out.ctr.ctr2->array = NULL;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
- }
- case 10:{
- r->out.ctr.ctr10 = talloc_p(mem_ctx, struct srvsvc_NetSessCtr10);
- WERR_TALLOC_CHECK(r->out.ctr.ctr10);
+ return WERR_NOT_SUPPORTED;
+ }
+ case 10:
+ {
+ r->out.ctr.ctr10 = talloc(mem_ctx, struct srvsvc_NetSessCtr10);
+ W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr10);
r->out.ctr.ctr2->count = 0;
r->out.ctr.ctr2->array = NULL;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
- }
- case 502:{
- r->out.ctr.ctr502 = talloc_p(mem_ctx, struct srvsvc_NetSessCtr502);
- WERR_TALLOC_CHECK(r->out.ctr.ctr502);
+ return WERR_NOT_SUPPORTED;
+ }
+ case 502:
+ {
+ r->out.ctr.ctr502 = talloc(mem_ctx, struct srvsvc_NetSessCtr502);
+ W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr502);
r->out.ctr.ctr2->count = 0;
r->out.ctr.ctr2->array = NULL;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
- }
+ return WERR_NOT_SUPPORTED;
+ }
default:
- r->out.result = WERR_UNKNOWN_LEVEL;
- break;
+ return WERR_UNKNOWN_LEVEL;
}
- return NT_STATUS_OK;
+ return WERR_UNKNOWN_LEVEL;
}
/*
srvsvc_NetSessDel
*/
-static NTSTATUS srvsvc_NetSessDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NetSessDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NetSessDel *r)
{
- r->out.result = WERR_NOT_SUPPORTED;
- return NT_STATUS_OK;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NetShareAdd
*/
-static NTSTATUS srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NetShareAdd *r)
{
- r->out.result = WERR_OK;
-
switch (r->in.level) {
- case 0:
+ case 0:
+ {
if (r->in.parm_error) {
r->out.parm_error = r->in.parm_error;
}
- r->out.result = WERR_NOT_SUPPORTED;
- break;
+ return WERR_NOT_SUPPORTED;
+ }
case 1:
+ {
if (r->in.parm_error) {
r->out.parm_error = r->in.parm_error;
}
- r->out.result = WERR_NOT_SUPPORTED;
- break;
+ return WERR_NOT_SUPPORTED;
+ }
case 2:
+ {
if (r->in.parm_error) {
r->out.parm_error = r->in.parm_error;
}
- r->out.result = WERR_NOT_SUPPORTED;
- break;
+ return WERR_NOT_SUPPORTED;
+ }
case 501:
+ {
if (r->in.parm_error) {
r->out.parm_error = r->in.parm_error;
}
- r->out.result = WERR_NOT_SUPPORTED;
- break;
+ return WERR_NOT_SUPPORTED;
+ }
case 502:
+ {
if (r->in.parm_error) {
r->out.parm_error = r->in.parm_error;
}
- r->out.result = WERR_NOT_SUPPORTED;
- break;
+ return WERR_NOT_SUPPORTED;
+ }
default:
- r->out.result = WERR_UNKNOWN_LEVEL;
- break;
+ return WERR_UNKNOWN_LEVEL;
}
- return NT_STATUS_OK;
+ return WERR_UNKNOWN_LEVEL;
}
+static WERROR srvsvc_fiel_ShareInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+ int snum, uint32_t level, union srvsvc_NetShareInfo *info)
+{
+ struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
+
+ switch (level) {
+ case 0:
+ {
+ info->info0->name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, snum);
+ W_ERROR_HAVE_NO_MEMORY(info->info0->name);
+
+ return WERR_OK;
+ }
+ case 1:
+ {
+ info->info1->name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, snum);
+ W_ERROR_HAVE_NO_MEMORY(info->info1->name);
+ info->info1->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, snum);
+ info->info1->comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, snum);
+ W_ERROR_HAVE_NO_MEMORY(info->info1->comment);
+
+ return WERR_OK;
+ }
+ case 2:
+ {
+ info->info2->name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, snum);
+ W_ERROR_HAVE_NO_MEMORY(info->info2->name);
+ info->info2->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, snum);
+ info->info2->comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, snum);
+ W_ERROR_HAVE_NO_MEMORY(info->info2->comment);
+ info->info2->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, snum);
+ info->info2->max_users = dcesrv_common_get_share_max_users(mem_ctx, dce_ctx, snum);
+ info->info2->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, snum);
+ info->info2->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, snum);
+ W_ERROR_HAVE_NO_MEMORY(info->info2->path);
+ info->info2->password = dcesrv_common_get_share_password(mem_ctx, dce_ctx, snum);
+
+ return WERR_OK;
+ }
+ case 501:
+ {
+ info->info501->name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, snum);
+ W_ERROR_HAVE_NO_MEMORY(info->info501->name);
+ info->info501->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, snum);
+ info->info501->comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, snum);
+ W_ERROR_HAVE_NO_MEMORY(info->info501->comment);
+ info->info501->csc_policy = dcesrv_common_get_share_csc_policy(mem_ctx, dce_ctx, snum);
+
+ return WERR_OK;
+ }
+ case 502:
+ {
+ info->info502->name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, snum);
+ W_ERROR_HAVE_NO_MEMORY(info->info502->name);
+ info->info502->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, snum);
+ info->info502->comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, snum);
+ W_ERROR_HAVE_NO_MEMORY(info->info502->comment);
+ info->info502->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, snum);
+ info->info502->max_users = dcesrv_common_get_share_max_users(mem_ctx, dce_ctx, snum);
+ info->info502->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, snum);
+ info->info502->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, snum);
+ W_ERROR_HAVE_NO_MEMORY(info->info502->path);
+ info->info502->password = dcesrv_common_get_share_password(mem_ctx, dce_ctx, snum);
+ info->info502->unknown = dcesrv_common_get_share_unknown(mem_ctx, dce_ctx, snum);
+ info->info502->sd = dcesrv_common_get_security_descriptor(mem_ctx, dce_ctx, snum);
+
+ return WERR_OK;
+ }
+ case 1005:
+ {
+ info->info1005->dfs_flags = dcesrv_common_get_share_dfs_flags(mem_ctx, dce_ctx, snum);
+
+ return WERR_OK;
+ }
+ default:
+ return WERR_UNKNOWN_LEVEL;
+ }
+
+ return WERR_UNKNOWN_LEVEL;
+}
/*
srvsvc_NetShareEnumAll
*/
-static NTSTATUS srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct srvsvc_NetShareEnumAll *r)
+static WERROR srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+ struct srvsvc_NetShareEnumAll *r)
{
struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
+
r->out.level = r->in.level;
+ ZERO_STRUCT(r->out.ctr);
r->out.totalentries = 0;
r->out.resume_handle = NULL;
- r->out.result = WERR_OK;
+
+ /* TODO: - paging of results
+ * - access check
+ */
switch (r->in.level) {
- case 0: {
+ case 0:
+ {
int i;
+ struct srvsvc_NetShareCtr0 *ctr0;
- r->out.ctr.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr0);
- WERR_TALLOC_CHECK(r->out.ctr.ctr0);
-
- r->out.ctr.ctr0->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
- r->out.ctr.ctr0->array = NULL;
+ ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
+ W_ERROR_HAVE_NO_MEMORY(ctr0);
- if (r->out.ctr.ctr0->count == 0) break;
+ ctr0->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
+ ctr0->array = NULL;
- r->out.ctr.ctr0->array = talloc_array_p(mem_ctx, struct srvsvc_NetShareInfo0, r->out.ctr.ctr0->count);
- WERR_TALLOC_CHECK(r->out.ctr.ctr0->array);
-
- for (i=0;i<r->out.ctr.ctr0->count;i++) {
- r->out.ctr.ctr0->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i);
- WERR_TALLOC_CHECK(r->out.ctr.ctr0->array[i].name);
+ if (ctr0->count == 0) {
+ r->out.ctr.ctr0 = ctr0;
+ return WERR_OK;
}
- r->out.totalentries = r->out.ctr.ctr0->count;
+ ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, ctr0->count);
+ W_ERROR_HAVE_NO_MEMORY(ctr0->array);
+
+ for (i=0; i < ctr0->count; i++) {
+ WERROR status;
+ union srvsvc_NetShareInfo info;
- break;
+ info.info0 = &ctr0->array[i];
+ status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
+ if (!W_ERROR_IS_OK(status)) {
+ return status;
+ }
}
- case 1: {
- int i;
- r->out.ctr.ctr1 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr1);
- WERR_TALLOC_CHECK(r->out.ctr.ctr1);
- r->out.ctr.ctr1->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
- r->out.ctr.ctr1->array = NULL;
+ r->out.ctr.ctr0 = ctr0;
+ r->out.totalentries = r->out.ctr.ctr0->count;
+ return WERR_OK;
+ }
+ case 1:
+ {
+ int i;
+ struct srvsvc_NetShareCtr1 *ctr1;
- if (r->out.ctr.ctr1->count == 0) break;
+ ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
+ W_ERROR_HAVE_NO_MEMORY(ctr1);
- r->out.ctr.ctr1->array = talloc_array_p(mem_ctx, struct srvsvc_NetShareInfo1, r->out.ctr.ctr1->count);
- WERR_TALLOC_CHECK(r->out.ctr.ctr1->array);
+ ctr1->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
+ ctr1->array = NULL;
- for (i=0;i<r->out.ctr.ctr1->count;i++) {
- r->out.ctr.ctr1->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr1->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr1->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i);
+ if (ctr1->count == 0) {
+ r->out.ctr.ctr1 = ctr1;
+ return WERR_OK;
}
- r->out.totalentries = r->out.ctr.ctr1->count;
+ ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, ctr1->count);
+ W_ERROR_HAVE_NO_MEMORY(ctr1->array);
- break;
+ for (i=0; i < ctr1->count; i++) {
+ WERROR status;
+ union srvsvc_NetShareInfo info;
+
+ info.info1 = &ctr1->array[i];
+ status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
+ if (!W_ERROR_IS_OK(status)) {
+ return status;
+ }
}
- case 2: {
- int i;
- r->out.ctr.ctr2 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr2);
- WERR_TALLOC_CHECK(r->out.ctr.ctr2);
- r->out.ctr.ctr2->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
- r->out.ctr.ctr2->array = NULL;
+ r->out.ctr.ctr1 = ctr1;
+ r->out.totalentries = r->out.ctr.ctr1->count;
+ return WERR_OK;
+ }
+ case 2:
+ {
+ int i;
+ struct srvsvc_NetShareCtr2 *ctr2;
- if (r->out.ctr.ctr2->count == 0) break;
+ ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
+ W_ERROR_HAVE_NO_MEMORY(ctr2);
- r->out.ctr.ctr2->array = talloc_array_p(mem_ctx, struct srvsvc_NetShareInfo2, r->out.ctr.ctr2->count);
- WERR_TALLOC_CHECK(r->out.ctr.ctr2->array);
+ ctr2->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
+ ctr2->array = NULL;
- for (i=0;i<r->out.ctr.ctr2->count;i++) {
- r->out.ctr.ctr2->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr2->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr2->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr2->array[i].permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr2->array[i].max_users = dcesrv_common_get_share_max_users(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr2->array[i].current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr2->array[i].path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr2->array[i].password = dcesrv_common_get_share_password(mem_ctx, dce_ctx, i);
+ if (ctr2->count == 0) {
+ r->out.ctr.ctr2 = ctr2;
+ return WERR_OK;
}
- r->out.totalentries = r->out.ctr.ctr2->count;
+ ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, ctr2->count);
+ W_ERROR_HAVE_NO_MEMORY(ctr2->array);
- break;
+ for (i=0; i < ctr2->count; i++) {
+ WERROR status;
+ union srvsvc_NetShareInfo info;
+
+ info.info2 = &ctr2->array[i];
+ status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
+ if (!W_ERROR_IS_OK(status)) {
+ return status;
+ }
}
- case 501:{
- int i;
- r->out.ctr.ctr501 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr501);
- WERR_TALLOC_CHECK(r->out.ctr.ctr501);
- r->out.ctr.ctr501->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
- r->out.ctr.ctr501->array = NULL;
+ r->out.ctr.ctr2 = ctr2;
+ r->out.totalentries = r->out.ctr.ctr2->count;
+ return WERR_OK;
+ }
+ case 501:
+ {
+ int i;
+ struct srvsvc_NetShareCtr501 *ctr501;
- if (r->out.ctr.ctr501->count == 0) break;
+ ctr501 = talloc(mem_ctx, struct srvsvc_NetShareCtr501);
+ W_ERROR_HAVE_NO_MEMORY(ctr501);
- r->out.ctr.ctr501->array = talloc_array_p(mem_ctx, struct srvsvc_NetShareInfo501, r->out.ctr.ctr501->count);
- WERR_TALLOC_CHECK(r->out.ctr.ctr501->array);
+ ctr501->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
+ ctr501->array = NULL;
- for (i=0;i<r->out.ctr.ctr501->count;i++) {
- r->out.ctr.ctr501->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr501->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr501->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr501->array[i].csc_policy = dcesrv_common_get_share_csc_policy(mem_ctx, dce_ctx, i);
+ if (ctr501->count == 0) {
+ r->out.ctr.ctr501 = ctr501;
+ return WERR_OK;
}
- r->out.totalentries = r->out.ctr.ctr501->count;
+ ctr501->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo501, ctr501->count);
+ W_ERROR_HAVE_NO_MEMORY(ctr501->array);
+
+ for (i=0; i < ctr501->count; i++) {
+ WERROR status;
+ union srvsvc_NetShareInfo info;
- break;
+ info.info501 = &ctr501->array[i];
+ status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
+ if (!W_ERROR_IS_OK(status)) {
+ return status;
+ }
}
- case 502:{
+
+ r->out.ctr.ctr501 = ctr501;
+ r->out.totalentries = r->out.ctr.ctr501->count;
+ return WERR_OK;
+ }
+ case 502:
+ {
int i;
- r->out.ctr.ctr502 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr502);
- WERR_TALLOC_CHECK(r->out.ctr.ctr502);
-
- r->out.ctr.ctr502->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
- r->out.ctr.ctr502->array = NULL;
-
- if (r->out.ctr.ctr502->count == 0) break;
-
- r->out.ctr.ctr502->array = talloc_array_p(mem_ctx, struct srvsvc_NetShareInfo502, r->out.ctr.ctr502->count);
- WERR_TALLOC_CHECK(r->out.ctr.ctr502->array);
-
- for (i=0;i<r->out.ctr.ctr502->count;i++) {
- r->out.ctr.ctr502->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr502->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr502->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr502->array[i].permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr502->array[i].max_users = dcesrv_common_get_share_max_users(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr502->array[i].current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr502->array[i].path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr502->array[i].password = dcesrv_common_get_share_password(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr502->array[i].unknown = dcesrv_common_get_share_unknown(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr502->array[i].sd = dcesrv_common_get_security_descriptor(mem_ctx, dce_ctx, i);
+ struct srvsvc_NetShareCtr502 *ctr502;
+
+ ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
+ W_ERROR_HAVE_NO_MEMORY(ctr502);
+
+ ctr502->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
+ ctr502->array = NULL;
+
+ if (ctr502->count == 0) {
+ r->out.ctr.ctr502 = ctr502;
+ return WERR_OK;
}
- r->out.totalentries = r->out.ctr.ctr502->count;
+ ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, ctr502->count);
+ W_ERROR_HAVE_NO_MEMORY(ctr502->array);
+
+ for (i=0; i < ctr502->count; i++) {
+ WERROR status;
+ union srvsvc_NetShareInfo info;
- break;
+ info.info502 = &ctr502->array[i];
+ status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
+ if (!W_ERROR_IS_OK(status)) {
+ return status;
+ }
}
+
+ r->out.ctr.ctr502 = ctr502;
+ r->out.totalentries = r->out.ctr.ctr502->count;
+ return WERR_OK;
+ }
default:
- r->out.result = WERR_UNKNOWN_LEVEL;
- break;
+ return WERR_UNKNOWN_LEVEL;
}
- return NT_STATUS_OK;
+ return WERR_UNKNOWN_LEVEL;
}
/*
srvsvc_NetShareGetInfo
*/
-static NTSTATUS srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct srvsvc_NetShareGetInfo *r)
+static WERROR srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+ struct srvsvc_NetShareGetInfo *r)
{
- r->out.result = WERR_OK;
+ int snum;
+
+ ZERO_STRUCT(r->out);
+
+ /* TODO: - access check
+ */
+
+ if (strcmp("", r->in.share_name) == 0) {
+ return WERR_INVALID_PARAM;
+ }
+
+ snum = lp_servicenumber(r->in.share_name);
+ if (snum < 0) {
+ return WERR_NET_NAME_NOT_FOUND;
+ }
switch (r->in.level) {
- case 0: {
- r->out.info.info0 = NULL;
+ case 0:
+ {
+ WERROR status;
+ union srvsvc_NetShareInfo info;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
+ info.info0 = talloc(mem_ctx, struct srvsvc_NetShareInfo0);
+ W_ERROR_HAVE_NO_MEMORY(info.info0);
+
+ status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, snum, r->in.level, &info);
+ if (!W_ERROR_IS_OK(status)) {
+ return status;
}
- case 1: {
- r->out.info.info0 = NULL;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
+ r->out.info.info0 = info.info0;
+ return WERR_OK;
+ }
+ case 1:
+ {
+ WERROR status;
+ union srvsvc_NetShareInfo info;
+
+ info.info1 = talloc(mem_ctx, struct srvsvc_NetShareInfo1);
+ W_ERROR_HAVE_NO_MEMORY(info.info1);
+
+ status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, snum, r->in.level, &info);
+ if (!W_ERROR_IS_OK(status)) {
+ return status;
}
- case 2: {
- r->out.info.info0 = NULL;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
+ r->out.info.info1 = info.info1;
+ return WERR_OK;
+ }
+ case 2:
+ {
+ WERROR status;
+ union srvsvc_NetShareInfo info;
+
+ info.info2 = talloc(mem_ctx, struct srvsvc_NetShareInfo2);
+ W_ERROR_HAVE_NO_MEMORY(info.info2);
+
+ status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, snum, r->in.level, &info);
+ if (!W_ERROR_IS_OK(status)) {
+ return status;
}
- case 501:{
- r->out.info.info0 = NULL;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
+ r->out.info.info2 = info.info2;
+ return WERR_OK;
+ }
+ case 501:
+ {
+ WERROR status;
+ union srvsvc_NetShareInfo info;
+
+ info.info501 = talloc(mem_ctx, struct srvsvc_NetShareInfo501);
+ W_ERROR_HAVE_NO_MEMORY(info.info501);
+
+ status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, snum, r->in.level, &info);
+ if (!W_ERROR_IS_OK(status)) {
+ return status;
}
- case 502:{
- r->out.info.info0 = NULL;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
+ r->out.info.info501 = info.info501;
+ return WERR_OK;
+ }
+ case 502:
+ {
+ WERROR status;
+ union srvsvc_NetShareInfo info;
+
+ info.info502 = talloc(mem_ctx, struct srvsvc_NetShareInfo502);
+ W_ERROR_HAVE_NO_MEMORY(info.info502);
+
+ status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, snum, r->in.level, &info);
+ if (!W_ERROR_IS_OK(status)) {
+ return status;
}
+
+ r->out.info.info502 = info.info502;
+ return WERR_OK;
+ }
+ case 1005:
+ {
+ WERROR status;
+ union srvsvc_NetShareInfo info;
+
+ info.info1005 = talloc(mem_ctx, struct srvsvc_NetShareInfo1005);
+ W_ERROR_HAVE_NO_MEMORY(info.info1005);
+
+ status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, snum, r->in.level, &info);
+ if (!W_ERROR_IS_OK(status)) {
+ return status;
+ }
+
+ r->out.info.info1005 = info.info1005;
+ return WERR_OK;
+ }
default:
- r->out.result = WERR_UNKNOWN_LEVEL;
- break;
+ return WERR_UNKNOWN_LEVEL;
}
- return NT_STATUS_OK;
+ return WERR_UNKNOWN_LEVEL;
}
/*
srvsvc_NetShareSetInfo
*/
-static NTSTATUS srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NetShareSetInfo *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NetShareDel
*/
-static NTSTATUS srvsvc_NetShareDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NetShareDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NetShareDel *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NetShareDelSticky
*/
-static NTSTATUS srvsvc_NetShareDelSticky(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NetShareDelSticky(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NetShareDelSticky *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NetShareCheck
*/
-static NTSTATUS srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NetShareCheck *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ ZERO_STRUCT(r->out);
+
+ /* TODO: - access check
+ */
+
+ if (strcmp("", r->in.device_name) == 0) {
+ r->out.type = STYPE_IPC;
+ return WERR_OK;
+ }
+
+ if (strcmp("C:\\", r->in.device_name) == 0) {
+ r->out.type = STYPE_DISKTREE;
+ return WERR_OK;
+ }
+
+ /* TODO: - lookup the share be devicename (path) */
+ return WERR_DEVICE_NOT_SHARED;
}
/*
srvsvc_NetSrvGetInfo
*/
-static NTSTATUS srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NetSrvGetInfo *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
+
+ ZERO_STRUCT(r->out);
+
+ switch (r->in.level) {
+ case 100:
+ {
+ struct srvsvc_NetSrvInfo100 *info100;
+
+ info100 = talloc(mem_ctx, struct srvsvc_NetSrvInfo100);
+ W_ERROR_HAVE_NO_MEMORY(info100);
+
+ info100->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
+ info100->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
+ W_ERROR_HAVE_NO_MEMORY(info100->server_name);
+
+ r->out.info.info100 = info100;
+ return WERR_OK;
+ }
+ case 101:
+ {
+ struct srvsvc_NetSrvInfo101 *info101;
+
+ info101 = talloc(mem_ctx, struct srvsvc_NetSrvInfo101);
+ W_ERROR_HAVE_NO_MEMORY(info101);
+
+ info101->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
+ info101->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
+ W_ERROR_HAVE_NO_MEMORY(info101->server_name);
+
+ info101->version_major = dcesrv_common_get_version_major(mem_ctx, dce_ctx);
+ info101->version_minor = dcesrv_common_get_version_minor(mem_ctx, dce_ctx);
+ info101->server_type = dcesrv_common_get_server_type(mem_ctx, dce_ctx);
+ info101->comment = talloc_strdup(mem_ctx, lp_serverstring());
+ W_ERROR_HAVE_NO_MEMORY(info101->comment);
+
+ r->out.info.info101 = info101;
+ return WERR_OK;
+ }
+ default:
+ return WERR_UNKNOWN_LEVEL;
+ }
+
+ return WERR_UNKNOWN_LEVEL;
}
/*
srvsvc_NetSrvSetInfo
*/
-static NTSTATUS srvsvc_NetSrvSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NetSrvSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NetSrvSetInfo *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NetDiskEnum
*/
-static NTSTATUS srvsvc_NetDiskEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NetDiskEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NetDiskEnum *r)
{
r->out.count = 0;
r->out.ctr0 = NULL;
r->out.totalentries = 0;
r->out.resume_handle = NULL;
- r->out.result = WERR_OK;
switch (r->in.level) {
- case 0: {
- r->out.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetDiskCtr0);
- WERR_TALLOC_CHECK(r->out.ctr0);
+ case 0:
+ {
+ r->out.ctr0 = talloc(mem_ctx, struct srvsvc_NetDiskCtr0);
+ W_ERROR_HAVE_NO_MEMORY(r->out.ctr0);
r->out.ctr0->unknown = 0x1;
r->out.ctr0->count = 0;
r->out.ctr0->array = NULL;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
- }
+ return WERR_NOT_SUPPORTED;
+ }
default:
- r->out.result = WERR_UNKNOWN_LEVEL;
- break;
+ return WERR_UNKNOWN_LEVEL;
}
- return NT_STATUS_OK;
+ return WERR_UNKNOWN_LEVEL;
}
/*
srvsvc_NETRSERVERSTATISTICSGET
*/
-static NTSTATUS srvsvc_NETRSERVERSTATISTICSGET(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct srvsvc_NETRSERVERSTATISTICSGET *r)
+static WERROR srvsvc_NETRSERVERSTATISTICSGET(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+ struct srvsvc_NETRSERVERSTATISTICSGET *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NETRSERVERTRANSPORTADD
*/
-static NTSTATUS srvsvc_NETRSERVERTRANSPORTADD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRSERVERTRANSPORTADD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRSERVERTRANSPORTADD *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NetTransportEnum
*/
-static NTSTATUS srvsvc_NetTransportEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NetTransportEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NetTransportEnum *r)
{
r->out.level = r->in.level;
r->out.totalentries = 0;
r->out.resume_handle = NULL;
- r->out.result = WERR_OK;
switch (r->in.level) {
- case 0: {
- r->out.ctr.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetTransportCtr0);
- WERR_TALLOC_CHECK(r->out.ctr.ctr0);
+ case 0:
+ {
+ r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetTransportCtr0);
+ W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
r->out.ctr.ctr0->count = 0;
r->out.ctr.ctr0->array = NULL;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
- }
- case 1: {
- r->out.ctr.ctr1 = talloc_p(mem_ctx, struct srvsvc_NetTransportCtr1);
- WERR_TALLOC_CHECK(r->out.ctr.ctr1);
+ return WERR_NOT_SUPPORTED;
+ }
+ case 1:
+ {
+ r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetTransportCtr1);
+ W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
r->out.ctr.ctr1->count = 0;
r->out.ctr.ctr1->array = NULL;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
- }
- case 2: {
- r->out.ctr.ctr2 = talloc_p(mem_ctx, struct srvsvc_NetTransportCtr2);
- WERR_TALLOC_CHECK(r->out.ctr.ctr2);
+ return WERR_NOT_SUPPORTED;
+ }
+ case 2:
+ {
+ r->out.ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetTransportCtr2);
+ W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr2);
r->out.ctr.ctr2->count = 0;
r->out.ctr.ctr2->array = NULL;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
- }
- case 3: {
- r->out.ctr.ctr3 = talloc_p(mem_ctx, struct srvsvc_NetTransportCtr3);
- WERR_TALLOC_CHECK(r->out.ctr.ctr3);
+ return WERR_NOT_SUPPORTED;
+ }
+ case 3:
+ {
+ r->out.ctr.ctr3 = talloc(mem_ctx, struct srvsvc_NetTransportCtr3);
+ W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr3);
r->out.ctr.ctr3->count = 0;
r->out.ctr.ctr3->array = NULL;
- r->out.result = WERR_NOT_SUPPORTED;
- break;
- }
+ return WERR_NOT_SUPPORTED;
+ }
default:
- r->out.result = WERR_UNKNOWN_LEVEL;
- break;
+ return WERR_UNKNOWN_LEVEL;
}
- return NT_STATUS_OK;
+ return WERR_UNKNOWN_LEVEL;
}
/*
srvsvc_NETRSERVERTRANSPORTDEL
*/
-static NTSTATUS srvsvc_NETRSERVERTRANSPORTDEL(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRSERVERTRANSPORTDEL(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRSERVERTRANSPORTDEL *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
- srvsvc_NET_REMOTE_TOD
+ srvsvc_NetRemoteTOD
*/
-static NTSTATUS srvsvc_NET_REMOTE_TOD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct srvsvc_NET_REMOTE_TOD *r)
+static WERROR srvsvc_NetRemoteTOD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+ struct srvsvc_NetRemoteTOD *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ struct timeval tval;
+ time_t t;
+ struct tm tm;
+
+ r->out.info = talloc(mem_ctx, struct srvsvc_NetRemoteTODInfo);
+ W_ERROR_HAVE_NO_MEMORY(r->out.info);
+
+ GetTimeOfDay(&tval);
+ t = tval.tv_sec;
+
+ gmtime_r(&t, &tm);
+
+ r->out.info->elapsed = t;
+ /* TODO: fake the uptime: just return the milliseconds till 0:00:00 today */
+ r->out.info->msecs = (tm.tm_hour*60*60*1000)
+ + (tm.tm_min*60*1000)
+ + (tm.tm_sec*1000)
+ + (tval.tv_usec/1000);
+ r->out.info->hours = tm.tm_hour;
+ r->out.info->mins = tm.tm_min;
+ r->out.info->secs = tm.tm_sec;
+ r->out.info->hunds = tval.tv_usec/10000;
+ r->out.info->timezone = get_time_zone(t)/60;
+ r->out.info->tinterval = 310; /* just return the same as windows */
+ r->out.info->day = tm.tm_mday;
+ r->out.info->month = tm.tm_mon + 1;
+ r->out.info->year = tm.tm_year + 1900;
+ r->out.info->weekday = tm.tm_wday;
+
+ return WERR_OK;
}
/*
srvsvc_NETRSERVERSETSERVICEBITS
*/
-static NTSTATUS srvsvc_NETRSERVERSETSERVICEBITS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRSERVERSETSERVICEBITS(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRSERVERSETSERVICEBITS *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NETRPRPATHTYPE
*/
-static NTSTATUS srvsvc_NETRPRPATHTYPE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRPRPATHTYPE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRPRPATHTYPE *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NETRPRPATHCANONICALIZE
*/
-static NTSTATUS srvsvc_NETRPRPATHCANONICALIZE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRPRPATHCANONICALIZE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRPRPATHCANONICALIZE *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NETRPRPATHCOMPARE
*/
-static NTSTATUS srvsvc_NETRPRPATHCOMPARE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRPRPATHCOMPARE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRPRPATHCOMPARE *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NET_NAME_VALIDATE
*/
-static NTSTATUS srvsvc_NET_NAME_VALIDATE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NET_NAME_VALIDATE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NET_NAME_VALIDATE *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NETRPRNAMECANONICALIZE
*/
-static NTSTATUS srvsvc_NETRPRNAMECANONICALIZE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRPRNAMECANONICALIZE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRPRNAMECANONICALIZE *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NETRPRNAMECOMPARE
*/
-static NTSTATUS srvsvc_NETRPRNAMECOMPARE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRPRNAMECOMPARE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRPRNAMECOMPARE *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NetShareEnum
*/
-static NTSTATUS srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct srvsvc_NetShareEnum *r)
+static WERROR srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+ struct srvsvc_NetShareEnum *r)
{
struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
+
r->out.level = r->in.level;
+ ZERO_STRUCT(r->out.ctr);
r->out.totalentries = 0;
r->out.resume_handle = NULL;
- r->out.result = WERR_OK;
+
+ /* TODO: - paging of results
+ * - access check
+ */
switch (r->in.level) {
- case 0: {
+ case 0:
+ {
int i;
+ uint32_t count;
+ struct srvsvc_NetShareCtr0 *ctr0;
- r->out.ctr.ctr0 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr0);
- WERR_TALLOC_CHECK(r->out.ctr.ctr0);
+ ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
+ W_ERROR_HAVE_NO_MEMORY(ctr0);
- r->out.ctr.ctr0->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
- r->out.ctr.ctr0->array = NULL;
+ ctr0->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
+ ctr0->array = NULL;
- if (r->out.ctr.ctr0->count == 0) break;
+ if (ctr0->count == 0) {
+ r->out.ctr.ctr0 = ctr0;
+ return WERR_OK;
+ }
- r->out.ctr.ctr0->array = talloc(mem_ctx, r->out.ctr.ctr0->count*sizeof(struct srvsvc_NetShareInfo0));
- WERR_TALLOC_CHECK(r->out.ctr.ctr0->array);
+ ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, ctr0->count);
+ W_ERROR_HAVE_NO_MEMORY(ctr0->array);
- for (i=0;i<r->out.ctr.ctr0->count;i++) {
- r->out.ctr.ctr0->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i);
- WERR_TALLOC_CHECK(r->out.ctr.ctr0->array[i].name);
- }
+ count = ctr0->count;
+ ctr0->count = 0;
+ for (i=0; i < count; i++) {
+ WERROR status;
+ union srvsvc_NetShareInfo info;
- r->out.totalentries = r->out.ctr.ctr0->count;
+ if (!lp_browseable(i)){
+ continue;
+ }
- break;
+ info.info0 = &ctr0->array[ctr0->count++];
+ status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
+ if (!W_ERROR_IS_OK(status)) {
+ return status;
+ }
}
- case 1: {
- int i;
- r->out.ctr.ctr1 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr1);
- WERR_TALLOC_CHECK(r->out.ctr.ctr1);
- r->out.ctr.ctr1->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
- r->out.ctr.ctr1->array = NULL;
+ r->out.ctr.ctr0 = ctr0;
+ r->out.totalentries = r->out.ctr.ctr0->count;
+ return WERR_OK;
+ }
+ case 1:
+ {
+ int i;
+ uint32_t count;
+ struct srvsvc_NetShareCtr1 *ctr1;
- if (r->out.ctr.ctr1->count == 0) break;
+ ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
+ W_ERROR_HAVE_NO_MEMORY(ctr1);
- r->out.ctr.ctr1->array = talloc(mem_ctx, r->out.ctr.ctr1->count*sizeof(struct srvsvc_NetShareInfo1));
- WERR_TALLOC_CHECK(r->out.ctr.ctr1->array);
+ ctr1->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
+ ctr1->array = NULL;
- for (i=0;i<r->out.ctr.ctr1->count;i++) {
- r->out.ctr.ctr1->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr1->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr1->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i);
+ if (ctr1->count == 0) {
+ r->out.ctr.ctr1 = ctr1;
+ return WERR_OK;
}
- r->out.totalentries = r->out.ctr.ctr1->count;
+ ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, ctr1->count);
+ W_ERROR_HAVE_NO_MEMORY(ctr1->array);
+
+ count = ctr1->count;
+ ctr1->count = 0;
+ for (i=0; i < count; i++) {
+ WERROR status;
+ union srvsvc_NetShareInfo info;
- break;
+ if (!lp_browseable(i)){
+ continue;
+ }
+
+ info.info1 = &ctr1->array[ctr1->count++];
+ status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
+ if (!W_ERROR_IS_OK(status)) {
+ return status;
+ }
}
- case 2: {
- int i;
- r->out.ctr.ctr2 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr2);
- WERR_TALLOC_CHECK(r->out.ctr.ctr2);
- r->out.ctr.ctr2->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
- r->out.ctr.ctr2->array = NULL;
+ r->out.ctr.ctr1 = ctr1;
+ r->out.totalentries = r->out.ctr.ctr1->count;
+ return WERR_OK;
+ }
+ case 2:
+ {
+ int i;
+ uint32_t count;
+ struct srvsvc_NetShareCtr2 *ctr2;
- if (r->out.ctr.ctr2->count == 0) break;
+ ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
+ W_ERROR_HAVE_NO_MEMORY(ctr2);
- r->out.ctr.ctr2->array = talloc(mem_ctx, r->out.ctr.ctr2->count*sizeof(struct srvsvc_NetShareInfo2));
- WERR_TALLOC_CHECK(r->out.ctr.ctr2->array);
+ ctr2->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
+ ctr2->array = NULL;
- for (i=0;i<r->out.ctr.ctr2->count;i++) {
- r->out.ctr.ctr2->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr2->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr2->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr2->array[i].permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr2->array[i].max_users = dcesrv_common_get_share_max_users(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr2->array[i].current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr2->array[i].path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr2->array[i].password = dcesrv_common_get_share_password(mem_ctx, dce_ctx, i);
+ if (ctr2->count == 0) {
+ r->out.ctr.ctr2 = ctr2;
+ return WERR_OK;
}
- r->out.totalentries = r->out.ctr.ctr2->count;
+ ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, ctr2->count);
+ W_ERROR_HAVE_NO_MEMORY(ctr2->array);
+
+ count = ctr2->count;
+ ctr2->count = 0;
+ for (i=0; i < count; i++) {
+ WERROR status;
+ union srvsvc_NetShareInfo info;
+
+ if (!lp_browseable(i)){
+ continue;
+ }
- break;
+ info.info2 = &ctr2->array[ctr2->count++];
+ status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
+ if (!W_ERROR_IS_OK(status)) {
+ return status;
+ }
}
- case 501:{
- int i;
- r->out.ctr.ctr501 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr501);
- WERR_TALLOC_CHECK(r->out.ctr.ctr501);
- r->out.ctr.ctr501->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
- r->out.ctr.ctr501->array = NULL;
+ r->out.ctr.ctr2 = ctr2;
+ r->out.totalentries = r->out.ctr.ctr2->count;
+ return WERR_OK;
+ }
+ case 501:
+ {
+ int i;
+ uint32_t count;
+ struct srvsvc_NetShareCtr501 *ctr501;
- if (r->out.ctr.ctr501->count == 0) break;
+ ctr501 = talloc(mem_ctx, struct srvsvc_NetShareCtr501);
+ W_ERROR_HAVE_NO_MEMORY(ctr501);
- r->out.ctr.ctr501->array = talloc(mem_ctx, r->out.ctr.ctr501->count*sizeof(struct srvsvc_NetShareInfo501));
- WERR_TALLOC_CHECK(r->out.ctr.ctr501->array);
+ ctr501->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
+ ctr501->array = NULL;
- for (i=0;i<r->out.ctr.ctr501->count;i++) {
- r->out.ctr.ctr501->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr501->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr501->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr501->array[i].csc_policy = dcesrv_common_get_share_csc_policy(mem_ctx, dce_ctx, i);
+ if (ctr501->count == 0) {
+ r->out.ctr.ctr501 = ctr501;
+ return WERR_OK;
}
- r->out.totalentries = r->out.ctr.ctr501->count;
+ ctr501->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo501, ctr501->count);
+ W_ERROR_HAVE_NO_MEMORY(ctr501->array);
+
+ count = ctr501->count;
+ ctr501->count = 0;
+ for (i=0; i < count; i++) {
+ WERROR status;
+ union srvsvc_NetShareInfo info;
- break;
+ if (!lp_browseable(i)){
+ continue;
+ }
+
+ info.info501 = &ctr501->array[ctr501->count++];
+ status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
+ if (!W_ERROR_IS_OK(status)) {
+ return status;
+ }
}
- case 502:{
+
+ r->out.ctr.ctr501 = ctr501;
+ r->out.totalentries = r->out.ctr.ctr501->count;
+ return WERR_OK;
+ }
+ case 502:
+ {
int i;
- r->out.ctr.ctr502 = talloc_p(mem_ctx, struct srvsvc_NetShareCtr502);
- WERR_TALLOC_CHECK(r->out.ctr.ctr502);
-
- r->out.ctr.ctr502->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
- r->out.ctr.ctr502->array = NULL;
-
- if (r->out.ctr.ctr502->count == 0) break;
-
- r->out.ctr.ctr502->array = talloc(mem_ctx, r->out.ctr.ctr502->count*sizeof(struct srvsvc_NetShareInfo502));
- WERR_TALLOC_CHECK(r->out.ctr.ctr502->array);
-
- for (i=0;i<r->out.ctr.ctr502->count;i++) {
- r->out.ctr.ctr502->array[i].name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr502->array[i].type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr502->array[i].comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr502->array[i].permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr502->array[i].max_users = dcesrv_common_get_share_max_users(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr502->array[i].current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr502->array[i].path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr502->array[i].password = dcesrv_common_get_share_password(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr502->array[i].unknown = dcesrv_common_get_share_unknown(mem_ctx, dce_ctx, i);
- r->out.ctr.ctr502->array[i].sd = dcesrv_common_get_security_descriptor(mem_ctx, dce_ctx, i);
+ uint32_t count;
+ struct srvsvc_NetShareCtr502 *ctr502;
+
+ ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
+ W_ERROR_HAVE_NO_MEMORY(ctr502);
+
+ ctr502->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
+ ctr502->array = NULL;
+
+ if (ctr502->count == 0) {
+ r->out.ctr.ctr502 = ctr502;
+ return WERR_OK;
}
- r->out.totalentries = r->out.ctr.ctr502->count;
+ ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, ctr502->count);
+ W_ERROR_HAVE_NO_MEMORY(ctr502->array);
+
+ count = ctr502->count;
+ ctr502->count = 0;
+ for (i=0; i < count; i++) {
+ WERROR status;
+ union srvsvc_NetShareInfo info;
- break;
+ if (!lp_browseable(i)){
+ continue;
+ }
+
+ info.info502 = &ctr502->array[ctr502->count++];
+ status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
+ if (!W_ERROR_IS_OK(status)) {
+ return status;
+ }
}
+
+ r->out.ctr.ctr502 = ctr502;
+ r->out.totalentries = r->out.ctr.ctr502->count;
+ return WERR_OK;
+ }
default:
- r->out.result = WERR_UNKNOWN_LEVEL;
- break;
+ return WERR_UNKNOWN_LEVEL;
}
- return NT_STATUS_OK;
+ return WERR_UNKNOWN_LEVEL;
}
/*
srvsvc_NETRSHAREDELSTART
*/
-static NTSTATUS srvsvc_NETRSHAREDELSTART(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRSHAREDELSTART(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRSHAREDELSTART *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NETRSHAREDELCOMMIT
*/
-static NTSTATUS srvsvc_NETRSHAREDELCOMMIT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRSHAREDELCOMMIT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRSHAREDELCOMMIT *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NET_FILE_QUERY_SECDESC
*/
-static NTSTATUS srvsvc_NET_FILE_QUERY_SECDESC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NET_FILE_QUERY_SECDESC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NET_FILE_QUERY_SECDESC *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NET_FILE_SET_SECDESC
*/
-static NTSTATUS srvsvc_NET_FILE_SET_SECDESC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NET_FILE_SET_SECDESC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NET_FILE_SET_SECDESC *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NETRSERVERTRANSPORTADDEX
*/
-static NTSTATUS srvsvc_NETRSERVERTRANSPORTADDEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRSERVERTRANSPORTADDEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRSERVERTRANSPORTADDEX *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NETRSERVERSETSERVICEBITSEX
*/
-static NTSTATUS srvsvc_NETRSERVERSETSERVICEBITSEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRSERVERSETSERVICEBITSEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRSERVERSETSERVICEBITSEX *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NETRDFSGETVERSION
*/
-static NTSTATUS srvsvc_NETRDFSGETVERSION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRDFSGETVERSION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRDFSGETVERSION *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NETRDFSCREATELOCALPARTITION
*/
-static NTSTATUS srvsvc_NETRDFSCREATELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRDFSCREATELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRDFSCREATELOCALPARTITION *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NETRDFSDELETELOCALPARTITION
*/
-static NTSTATUS srvsvc_NETRDFSDELETELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRDFSDELETELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRDFSDELETELOCALPARTITION *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NETRDFSSETLOCALVOLUMESTATE
*/
-static NTSTATUS srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NETRDFSSETSERVERINFO
*/
-static NTSTATUS srvsvc_NETRDFSSETSERVERINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRDFSSETSERVERINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRDFSSETSERVERINFO *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NETRDFSCREATEEXITPOINT
*/
-static NTSTATUS srvsvc_NETRDFSCREATEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRDFSCREATEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRDFSCREATEEXITPOINT *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NETRDFSDELETEEXITPOINT
*/
-static NTSTATUS srvsvc_NETRDFSDELETEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRDFSDELETEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRDFSDELETEEXITPOINT *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NETRDFSMODIFYPREFIX
*/
-static NTSTATUS srvsvc_NETRDFSMODIFYPREFIX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRDFSMODIFYPREFIX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRDFSMODIFYPREFIX *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NETRDFSFIXLOCALVOLUME
*/
-static NTSTATUS srvsvc_NETRDFSFIXLOCALVOLUME(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRDFSFIXLOCALVOLUME(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRDFSFIXLOCALVOLUME *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NETRDFSMANAGERREPORTSITEINFO
*/
-static NTSTATUS srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}
/*
srvsvc_NETRSERVERTRANSPORTDELEX
*/
-static NTSTATUS srvsvc_NETRSERVERTRANSPORTDELEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+static WERROR srvsvc_NETRSERVERTRANSPORTDELEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NETRSERVERTRANSPORTDELEX *r)
{
- return NT_STATUS_NOT_IMPLEMENTED;
+ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
}