2 Unix SMB/CIFS implementation.
4 endpoint server for the echo pipe
6 Copyright (C) Andrew Tridgell 2003
7 Copyright (C) Stefan (metze) Metzmacher 2005
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>.
24 #include "system/filesys.h"
25 #include "rpc_server/dcerpc_server.h"
26 #include "librpc/gen_ndr/ndr_echo.h"
27 #include "lib/events/events.h"
30 static NTSTATUS
dcesrv_echo_AddOne(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
, struct echo_AddOne
*r
)
32 *r
->out
.out_data
= r
->in
.in_data
+ 1;
36 static NTSTATUS
dcesrv_echo_EchoData(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
, struct echo_EchoData
*r
)
42 r
->out
.out_data
= talloc_memdup(mem_ctx
, r
->in
.in_data
, r
->in
.len
);
43 if (!r
->out
.out_data
) {
44 return NT_STATUS_NO_MEMORY
;
50 static NTSTATUS
dcesrv_echo_SinkData(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
, struct echo_SinkData
*r
)
55 static NTSTATUS
dcesrv_echo_SourceData(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
, struct echo_SourceData
*r
)
59 r
->out
.data
= talloc_array(mem_ctx
, uint8_t, r
->in
.len
);
61 return NT_STATUS_NO_MEMORY
;
64 for (i
=0;i
<r
->in
.len
;i
++) {
71 static NTSTATUS
dcesrv_echo_TestCall(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
, struct echo_TestCall
*r
)
73 *r
->out
.s2
= talloc_strdup(mem_ctx
, r
->in
.s1
);
74 if (r
->in
.s1
&& !*r
->out
.s2
) {
75 return NT_STATUS_NO_MEMORY
;
80 static NTSTATUS
dcesrv_echo_TestCall2(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
, struct echo_TestCall2
*r
)
82 r
->out
.info
= talloc(mem_ctx
, union echo_Info
);
84 return NT_STATUS_NO_MEMORY
;
87 switch (r
->in
.level
) {
89 r
->out
.info
->info1
.v
= 10;
92 r
->out
.info
->info2
.v
= 20;
95 r
->out
.info
->info3
.v
= 30;
98 r
->out
.info
->info4
.v
= 40;
101 r
->out
.info
->info5
.v1
= 50;
102 r
->out
.info
->info5
.v2
= 60;
105 r
->out
.info
->info6
.v1
= 70;
106 r
->out
.info
->info6
.info1
.v
= 80;
109 r
->out
.info
->info7
.v1
= 80;
110 r
->out
.info
->info7
.info4
.v
= 90;
113 return NT_STATUS_INVALID_LEVEL
;
119 static NTSTATUS
dcesrv_echo_TestEnum(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
, struct echo_TestEnum
*r
)
121 r
->out
.foo2
->e1
= ECHO_ENUM2
;
125 static NTSTATUS
dcesrv_echo_TestSurrounding(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
, struct echo_TestSurrounding
*r
)
132 r
->out
.data
= talloc(mem_ctx
, struct echo_Surrounding
);
134 return NT_STATUS_NO_MEMORY
;
136 r
->out
.data
->x
= 2 * r
->in
.data
->x
;
137 r
->out
.data
->surrounding
= talloc_zero_array(mem_ctx
, uint16_t, r
->out
.data
->x
);
138 if (!r
->out
.data
->surrounding
) {
139 return NT_STATUS_NO_MEMORY
;
145 static uint16_t dcesrv_echo_TestDoublePointer(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
, struct echo_TestDoublePointer
*r
)
151 return ***r
->in
.data
;
154 struct echo_TestSleep_private
{
155 struct dcesrv_call_state
*dce_call
;
156 struct echo_TestSleep
*r
;
159 static void echo_TestSleep_handler(struct tevent_context
*ev
, struct tevent_timer
*te
,
160 struct timeval t
, void *private_data
)
162 struct echo_TestSleep_private
*p
= talloc_get_type(private_data
,
163 struct echo_TestSleep_private
);
164 struct echo_TestSleep
*r
= p
->r
;
167 r
->out
.result
= r
->in
.seconds
;
169 status
= dcesrv_reply(p
->dce_call
);
170 if (!NT_STATUS_IS_OK(status
)) {
171 DEBUG(0,("echo_TestSleep_handler: dcesrv_reply() failed - %s\n",
176 static long dcesrv_echo_TestSleep(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
, struct echo_TestSleep
*r
)
178 struct echo_TestSleep_private
*p
;
180 if (!(dce_call
->state_flags
& DCESRV_CALL_STATE_FLAG_MAY_ASYNC
)) {
181 /* we're not allowed to reply async */
182 sleep(r
->in
.seconds
);
183 return r
->in
.seconds
;
186 /* we're allowed to reply async */
187 p
= talloc(mem_ctx
, struct echo_TestSleep_private
);
192 p
->dce_call
= dce_call
;
195 event_add_timed(dce_call
->event_ctx
, p
,
196 timeval_add(&dce_call
->time
, r
->in
.seconds
, 0),
197 echo_TestSleep_handler
, p
);
199 dce_call
->state_flags
|= DCESRV_CALL_STATE_FLAG_ASYNC
;
203 /* include the generated boilerplate */
204 #include "librpc/gen_ndr/ndr_echo_s.c"