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 + -
显示快捷键?