lsa4: Fix Coverity ID 1499410
[Samba.git] / librpc / rpc / dcesrv_mgmt.c
blob8f00e91930159d8a5ea2ee36b1e6d1c298e134f1
1 /*
2 Unix SMB/CIFS implementation.
4 endpoint server for the mgmt pipe
6 Copyright (C) Jelmer Vernooij 2006
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "includes.h"
23 #include "librpc/rpc/dcesrv_core.h"
24 #include "librpc/rpc/dcesrv_core_proto.h"
25 #include "librpc/gen_ndr/ndr_mgmt.h"
27 #define DCESRV_INTERFACE_MGMT_BIND(context, iface) \
28 dcesrv_interface_mgmt_bind(context, iface)
30 * This #define allows the mgmt interface to accept invalid
31 * association groups, because association groups are to coordinate
32 * handles, and handles are not used in mgmt. This in turn avoids
33 * the need to coordinate these across multiple possible NETLOGON
34 * processes, as an mgmt interface is added to each
37 #define DCESRV_INTERFACE_MGMT_FLAGS DCESRV_INTERFACE_FLAGS_HANDLES_NOT_USED
39 static NTSTATUS dcesrv_interface_mgmt_bind(struct dcesrv_connection_context *context,
40 const struct dcesrv_interface *iface)
42 return dcesrv_interface_bind_allow_connect(context, iface);
46 mgmt_inq_if_ids
48 static WERROR dcesrv_mgmt_inq_if_ids(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
49 struct mgmt_inq_if_ids *r)
51 const struct dcesrv_endpoint *ep = dce_call->conn->endpoint;
52 struct dcesrv_if_list *l = NULL;
53 struct rpc_if_id_vector_t *vector = NULL;
55 vector = talloc(mem_ctx, struct rpc_if_id_vector_t);
56 if (vector == NULL) {
57 return WERR_NOT_ENOUGH_MEMORY;
60 vector->count = 0;
61 vector->if_id = NULL;
63 for (l = ep->interface_list; l; l = l->next) {
64 bool filter;
66 filter = ndr_syntax_id_equal(&l->iface->syntax_id, &ndr_table_mgmt.syntax_id);
67 if (filter) {
69 * We should not return the mgmt syntax itself here
71 continue;
74 vector->count++;
75 vector->if_id = talloc_realloc(vector, vector->if_id, struct ndr_syntax_id_p, vector->count);
76 if (vector->if_id == NULL) {
77 return WERR_NOT_ENOUGH_MEMORY;
79 vector->if_id[vector->count-1].id = &l->iface->syntax_id;
82 *r->out.if_id_vector = vector;
83 return WERR_OK;
88 mgmt_inq_stats
90 static WERROR dcesrv_mgmt_inq_stats(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
91 struct mgmt_inq_stats *r)
93 if (r->in.max_count != MGMT_STATS_ARRAY_MAX_SIZE)
94 return WERR_NOT_SUPPORTED;
96 r->out.statistics->statistics = talloc_zero_array(mem_ctx,
97 uint32_t,
98 r->in.max_count);
99 if (r->out.statistics->statistics == NULL) {
100 return WERR_NOT_ENOUGH_MEMORY;
102 r->out.statistics->count = r->in.max_count;
103 /* FIXME */
104 r->out.statistics->statistics[MGMT_STATS_CALLS_IN] = 0;
105 r->out.statistics->statistics[MGMT_STATS_CALLS_OUT] = 0;
106 r->out.statistics->statistics[MGMT_STATS_PKTS_IN] = 0;
107 r->out.statistics->statistics[MGMT_STATS_PKTS_OUT] = 0;
109 return WERR_OK;
114 mgmt_is_server_listening
116 static uint32_t dcesrv_mgmt_is_server_listening(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
117 struct mgmt_is_server_listening *r)
119 *r->out.status = 0;
120 return 1;
125 mgmt_stop_server_listening
127 static WERROR dcesrv_mgmt_stop_server_listening(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
128 struct mgmt_stop_server_listening *r)
130 return WERR_ACCESS_DENIED;
135 mgmt_inq_princ_name
137 static WERROR dcesrv_mgmt_inq_princ_name(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
138 struct mgmt_inq_princ_name *r)
140 const char *principal = NULL;
142 if (r->in.princ_name_size < 1) {
143 DCESRV_FAULT(DCERPC_FAULT_BAD_STUB_DATA);
146 r->out.princ_name = "";
148 principal = dcesrv_auth_type_principal_find(dce_call->conn->dce_ctx,
149 r->in.authn_proto);
150 if (principal == NULL) {
151 return WERR_RPC_S_UNKNOWN_AUTHN_SERVICE;
154 if (strlen(principal) + 1 > r->in.princ_name_size) {
155 return WERR_INSUFFICIENT_BUFFER;
158 r->out.princ_name = principal;
159 return WERR_OK;
163 /* include the generated boilerplate */
164 #include "librpc/gen_ndr/ndr_mgmt_s.c"
166 const struct dcesrv_interface *dcesrv_get_mgmt_interface(void)
168 return &dcesrv_mgmt_interface;