dcesrv_srvsvc.c
来自「samba最新软件」· C语言 代码 · 共 2,328 行 · 第 1/4 页
C
2,328 行
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* srvsvc_NetNameValidate */static WERROR dcesrv_srvsvc_NetNameValidate(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NetNameValidate *r){ int len; if ((r->in.flags != 0x0) && (r->in.flags != 0x80000000)) { return WERR_INVALID_NAME; } switch (r->in.name_type) { case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: return WERR_NOT_SUPPORTED; case 9: /* validate share name */ len = strlen_m(r->in.name); if ((r->in.flags == 0x0) && (len > 81)) { return WERR_INVALID_NAME; } if ((r->in.flags == 0x80000000) && (len > 13)) { return WERR_INVALID_NAME; } if (! dcesrv_common_validate_share_name(mem_ctx, r->in.name)) { return WERR_INVALID_NAME; } return WERR_OK; case 10: case 11: case 12: case 13: return WERR_NOT_SUPPORTED; default: return WERR_INVALID_PARAM; } return WERR_INVALID_PARAM;}/* srvsvc_NetPRNameCompare */static WERROR dcesrv_srvsvc_NetPRNameCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NetPRNameCompare *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* srvsvc_NetShareEnum */static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NetShareEnum *r){ NTSTATUS nterr; int numshares = 0; const char **snames; struct share_context *sctx; struct share_config *scfg; 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; /* TODO: - paging of results */ nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx); if (!NT_STATUS_IS_OK(nterr)) { return ntstatus_to_werror(nterr); } nterr = share_list_all(mem_ctx, sctx, &numshares, &snames); if (!NT_STATUS_IS_OK(nterr)) { return ntstatus_to_werror(nterr); } switch (r->in.level) { case 0: { int i, y = 0; int count; struct srvsvc_NetShareCtr0 *ctr0; ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0); W_ERROR_HAVE_NO_MEMORY(ctr0); count = numshares; ctr0->count = count; ctr0->array = NULL; if (ctr0->count == 0) { r->out.ctr.ctr0 = ctr0; return WERR_OK; } ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, count); W_ERROR_HAVE_NO_MEMORY(ctr0->array); for (i=0; i < count; i++) { WERROR status; union srvsvc_NetShareInfo info; enum srvsvc_ShareType type; nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg); if (!NT_STATUS_IS_OK(nterr)) { DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i])); return WERR_GENERAL_FAILURE; } type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg); if (type & STYPE_HIDDEN) { ctr0->count--; talloc_free(scfg); continue; } info.info0 = &ctr0->array[y]; status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info); W_ERROR_NOT_OK_RETURN(status); talloc_free(scfg); y++; } talloc_free(snames); r->out.ctr.ctr0 = ctr0; r->out.totalentries = r->out.ctr.ctr0->count; return WERR_OK; } case 1: { int i, y = 0; int count; struct srvsvc_NetShareCtr1 *ctr1; ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1); W_ERROR_HAVE_NO_MEMORY(ctr1); count = numshares; ctr1->count = count; ctr1->array = NULL; if (ctr1->count == 0) { r->out.ctr.ctr1 = ctr1; return WERR_OK; } ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, count); W_ERROR_HAVE_NO_MEMORY(ctr1->array); for (i=0; i < count; i++) { WERROR status; union srvsvc_NetShareInfo info; enum srvsvc_ShareType type; nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg); if (!NT_STATUS_IS_OK(nterr)) { DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i])); return WERR_GENERAL_FAILURE; } type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg); if (type & STYPE_HIDDEN) { ctr1->count--; talloc_free(scfg); continue; } info.info1 = &ctr1->array[y]; status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info); W_ERROR_NOT_OK_RETURN(status); talloc_free(scfg); y++; } talloc_free(snames); r->out.ctr.ctr1 = ctr1; r->out.totalentries = r->out.ctr.ctr1->count; return WERR_OK; } case 2: { int i, y = 0; int count; struct srvsvc_NetShareCtr2 *ctr2; SRVSVC_CHECK_ADMIN_ACCESS; ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2); W_ERROR_HAVE_NO_MEMORY(ctr2); count = numshares; ctr2->count = count; ctr2->array = NULL; if (ctr2->count == 0) { r->out.ctr.ctr2 = ctr2; return WERR_OK; } ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, count); W_ERROR_HAVE_NO_MEMORY(ctr2->array); for (i=0; i < count; i++) { WERROR status; union srvsvc_NetShareInfo info; enum srvsvc_ShareType type; nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg); if (!NT_STATUS_IS_OK(nterr)) { DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i])); return WERR_GENERAL_FAILURE; } type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg); if (type & STYPE_HIDDEN) { ctr2->count--; talloc_free(scfg); continue; } info.info2 = &ctr2->array[y]; status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info); W_ERROR_NOT_OK_RETURN(status); talloc_free(scfg); y++; } talloc_free(snames); r->out.ctr.ctr2 = ctr2; r->out.totalentries = r->out.ctr.ctr2->count; return WERR_OK; } case 502: { int i, y = 0; int count; struct srvsvc_NetShareCtr502 *ctr502; SRVSVC_CHECK_ADMIN_ACCESS; ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502); W_ERROR_HAVE_NO_MEMORY(ctr502); count = numshares; ctr502->count = count; ctr502->array = NULL; if (ctr502->count == 0) { r->out.ctr.ctr502 = ctr502; return WERR_OK; } ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, count); W_ERROR_HAVE_NO_MEMORY(ctr502->array); for (i=0; i < count; i++) { WERROR status; union srvsvc_NetShareInfo info; enum srvsvc_ShareType type; nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg); if (!NT_STATUS_IS_OK(nterr)) { DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i])); return WERR_GENERAL_FAILURE; } type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg); if (type & STYPE_HIDDEN) { ctr502->count--; talloc_free(scfg); continue; } info.info502 = &ctr502->array[y]; status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info); W_ERROR_NOT_OK_RETURN(status); talloc_free(scfg); y++; } talloc_free(snames); r->out.ctr.ctr502 = ctr502; r->out.totalentries = r->out.ctr.ctr502->count; return WERR_OK; } default: return WERR_UNKNOWN_LEVEL; } return WERR_UNKNOWN_LEVEL;}/* srvsvc_NetShareDelStart */static WERROR dcesrv_srvsvc_NetShareDelStart(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NetShareDelStart *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* srvsvc_NetShareDelCommit */static WERROR dcesrv_srvsvc_NetShareDelCommit(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NetShareDelCommit *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* srvsvc_NetGetFileSecurity */static WERROR dcesrv_srvsvc_NetGetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NetGetFileSecurity *r){ struct sec_desc_buf *sd_buf; struct ntvfs_context *ntvfs_ctx = NULL; struct ntvfs_request *ntvfs_req; union smb_fileinfo *io; NTSTATUS nt_status; nt_status = srvsvc_create_ntvfs_context(dce_call, mem_ctx, r->in.share, &ntvfs_ctx); if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status); ntvfs_req = ntvfs_request_create(ntvfs_ctx, mem_ctx, dce_call->conn->auth_state.session_info, 0, dce_call->time, NULL, NULL, 0); W_ERROR_HAVE_NO_MEMORY(ntvfs_req); sd_buf = talloc(mem_ctx, struct sec_desc_buf); W_ERROR_HAVE_NO_MEMORY(sd_buf); io = talloc(mem_ctx, union smb_fileinfo); W_ERROR_HAVE_NO_MEMORY(io); io->query_secdesc.level = RAW_FILEINFO_SEC_DESC; io->query_secdesc.in.file.path = r->in.file; io->query_secdesc.in.secinfo_flags = r->in.securityinformation; nt_status = ntvfs_qpathinfo(ntvfs_req, io); if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status); sd_buf->sd = io->query_secdesc.out.sd; r->out.sd_buf = sd_buf; return WERR_OK;}/* srvsvc_NetSetFileSecurity */static WERROR dcesrv_srvsvc_NetSetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NetSetFileSecurity *r){ struct ntvfs_context *ntvfs_ctx; struct ntvfs_request *ntvfs_req; union smb_setfileinfo *io; NTSTATUS nt_status; nt_status = srvsvc_create_ntvfs_context(dce_call, mem_ctx, r->in.share, &ntvfs_ctx); if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status); ntvfs_req = ntvfs_request_create(ntvfs_ctx, mem_ctx, dce_call->conn->auth_state.session_info, 0, dce_call->time, NULL, NULL, 0); W_ERROR_HAVE_NO_MEMORY(ntvfs_req); io = talloc(mem_ctx, union smb_setfileinfo); W_ERROR_HAVE_NO_MEMORY(io); io->set_secdesc.level = RAW_FILEINFO_SEC_DESC; io->set_secdesc.in.file.path = r->in.file; io->set_secdesc.in.secinfo_flags = r->in.securityinformation; io->set_secdesc.in.sd = r->in.sd_buf.sd; nt_status = ntvfs_setpathinfo(ntvfs_req, io); if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status); return WERR_OK;}/* srvsvc_NetServerTransportAddEx */static WERROR dcesrv_srvsvc_NetServerTransportAddEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NetServerTransportAddEx *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* srvsvc_NetServerSetServiceBitsEx */static WERROR dcesrv_srvsvc_NetServerSetServiceBitsEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NetServerSetServiceBitsEx *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* srvsvc_NETRDFSGETVERSION */static WERROR dcesrv_srvsvc_NETRDFSGETVERSION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NETRDFSGETVERSION *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* srvsvc_NETRDFSCREATELOCALPARTITION */static WERROR dcesrv_srvsvc_NETRDFSCREATELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NETRDFSCREATELOCALPARTITION *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* srvsvc_NETRDFSDELETELOCALPARTITION */static WERROR dcesrv_srvsvc_NETRDFSDELETELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NETRDFSDELETELOCALPARTITION *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* srvsvc_NETRDFSSETLOCALVOLUMESTATE */static WERROR dcesrv_srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* srvsvc_NETRDFSSETSERVERINFO */static WERROR dcesrv_srvsvc_NETRDFSSETSERVERINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NETRDFSSETSERVERINFO *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* srvsvc_NETRDFSCREATEEXITPOINT */static WERROR dcesrv_srvsvc_NETRDFSCREATEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NETRDFSCREATEEXITPOINT *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* srvsvc_NETRDFSDELETEEXITPOINT */static WERROR dcesrv_srvsvc_NETRDFSDELETEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NETRDFSDELETEEXITPOINT *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* srvsvc_NETRDFSMODIFYPREFIX */static WERROR dcesrv_srvsvc_NETRDFSMODIFYPREFIX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NETRDFSMODIFYPREFIX *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* srvsvc_NETRDFSFIXLOCALVOLUME */static WERROR dcesrv_srvsvc_NETRDFSFIXLOCALVOLUME(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NETRDFSFIXLOCALVOLUME *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* srvsvc_NETRDFSMANAGERREPORTSITEINFO */static WERROR dcesrv_srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* srvsvc_NETRSERVERTRANSPORTDELEX */static WERROR dcesrv_srvsvc_NETRSERVERTRANSPORTDELEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NETRSERVERTRANSPORTDELEX *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* srvsvc_NetShareDel */static WERROR dcesrv_srvsvc_NetShareDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NetShareDel *r){ NTSTATUS nterr; struct share_context *sctx; nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx); if (!NT_STATUS_IS_OK(nterr)) { return ntstatus_to_werror(nterr); } nterr = share_remove(sctx, r->in.share_name); if (!NT_STATUS_IS_OK(nterr)) { return ntstatus_to_werror(nterr); } return WERR_OK;}/* srvsvc_NetSetServiceBits */static WERROR dcesrv_srvsvc_NetSetServiceBits(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NetSetServiceBits *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* srvsvc_NETRPRNAMECANONICALIZE */static WERROR dcesrv_srvsvc_NETRPRNAMECANONICALIZE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NETRPRNAMECANONICALIZE *r){ DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);}/* include the generated boilerplate */#include "librpc/gen_ndr/ndr_srvsvc_s.c"
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?