X-Git-Url: http://git.samba.org/?a=blobdiff_plain;f=source%2Frpc_server%2Fsrv_echo_nt.c;h=1179a162b0711febac916c53a78703cc24d3dd86;hb=5c6c8e1fe93;hp=c861c74cc6af6a3381a6bf6adc08d6a8ba707c88;hpb=ae6b9b34e59167e3958bfdb9997fa25340b9a0a3;p=samba.git diff --git a/source/rpc_server/srv_echo_nt.c b/source/rpc_server/srv_echo_nt.c index c861c74cc6a..1179a162b07 100644 --- a/source/rpc_server/srv_echo_nt.c +++ b/source/rpc_server/srv_echo_nt.c @@ -1,11 +1,13 @@ /* * Unix SMB/CIFS implementation. * RPC Pipe client / server routines for rpcecho - * Copyright (C) Tim Potter 2003. + * Copyright (C) Tim Potter 2003 + * Copyright (C) Jelmer Vernooij 2006 + * Copyright (C) Gerald (Jerry) Carter 2007 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -14,8 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * along with this program; if not, see . */ /* This is the interface to the rpcecho pipe. */ @@ -30,49 +31,95 @@ /* Add one to the input and return it */ -void _echo_add_one(pipes_struct *p, ECHO_Q_ADD_ONE *q_u, ECHO_R_ADD_ONE *r_u) +void _echo_AddOne(pipes_struct *p, struct echo_AddOne *r ) { - DEBUG(10, ("_echo_add_one\n")); + DEBUG(10, ("_echo_AddOne\n")); - r_u->response = q_u->request + 1; + *r->out.out_data = r->in.in_data + 1; } /* Echo back an array of data */ -void _echo_data(pipes_struct *p, ECHO_Q_ECHO_DATA *q_u, - ECHO_R_ECHO_DATA *r_u) +void _echo_EchoData(pipes_struct *p, struct echo_EchoData *r) { - DEBUG(10, ("_echo_data\n")); + DEBUG(10, ("_echo_EchoData\n")); - r_u->data = (char *)TALLOC(p->mem_ctx, q_u->size); - r_u->size = q_u->size; - memcpy(r_u->data, q_u->data, q_u->size); + if ( r->in.len == 0 ) { + r->out.out_data = NULL; + return; + } + + r->out.out_data = TALLOC_ARRAY(p->mem_ctx, uint8, r->in.len); + memcpy( r->out.out_data, r->in.in_data, r->in.len ); + return; } /* Sink an array of data */ -void _sink_data(pipes_struct *p, ECHO_Q_SINK_DATA *q_u, - ECHO_R_SINK_DATA *r_u) +void _echo_SinkData(pipes_struct *p, struct echo_SinkData *r) { - DEBUG(10, ("_sink_data\n")); + DEBUG(10, ("_echo_SinkData\n")); /* My that was some yummy data! */ + return; } /* Source an array of data */ -void _source_data(pipes_struct *p, ECHO_Q_SOURCE_DATA *q_u, - ECHO_R_SOURCE_DATA *r_u) +void _echo_SourceData(pipes_struct *p, struct echo_SourceData *r) { uint32 i; - DEBUG(10, ("_source_data\n")); + DEBUG(10, ("_echo_SourceData\n")); + + if ( r->in.len == 0 ) { + r->out.data = NULL; + return; + } + + r->out.data = TALLOC_ARRAY(p->mem_ctx, uint8, r->in.len ); + + for (i = 0; i < r->in.len; i++ ) { + r->out.data[i] = i & 0xff; + } + + return; +} + +void _echo_TestCall(pipes_struct *p, struct echo_TestCall *r) +{ + p->rng_fault_state = True; + return; +} + +NTSTATUS _echo_TestCall2(pipes_struct *p, struct echo_TestCall2 *r) +{ + p->rng_fault_state = True; + return NT_STATUS_OK; +} + +uint32 _echo_TestSleep(pipes_struct *p, struct echo_TestSleep *r) +{ + p->rng_fault_state = True; + return 0; +} + +void _echo_TestEnum(pipes_struct *p, struct echo_TestEnum *r) +{ + p->rng_fault_state = True; + return; +} - r_u->data = (char *)TALLOC(p->mem_ctx, q_u->size); - r_u->size = q_u->size; +void _echo_TestSurrounding(pipes_struct *p, struct echo_TestSurrounding *r) +{ + p->rng_fault_state = True; + return; +} - for (i = 0; i < r_u->size; i++) - r_u->data[i] = i & 0xff; +uint16 _echo_TestDoublePointer(pipes_struct *p, struct echo_TestDoublePointer *r) +{ + p->rng_fault_state = True; + return 0; } #endif /* DEVELOPER */