2005-01-12 10:03:29 +03:00
/*
Unix SMB / CIFS implementation .
2005-09-26 15:47:55 +04:00
composite request interfaces
2005-01-12 10:03:29 +03:00
Copyright ( C ) Andrew Tridgell 2005
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
2007-07-10 06:07:03 +04:00
the Free Software Foundation ; either version 3 of the License , or
2005-01-12 10:03:29 +03:00
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
2007-07-10 06:07:03 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2005-01-12 10:03:29 +03:00
*/
2008-04-02 06:53:27 +04:00
# ifndef __COMPOSITE_H__
# define __COMPOSITE_H__
2006-08-30 15:29:34 +04:00
# include "libcli/raw/interfaces.h"
2008-12-29 22:24:57 +03:00
struct tevent_context ;
2008-12-17 02:06:34 +03:00
2005-01-12 10:03:29 +03:00
/*
this defines the structures associated with " composite "
requests . Composite requests are libcli requests that are internally
2005-09-26 15:47:55 +04:00
implemented as multiple async calls , but can be treated as a
2005-01-12 10:03:29 +03:00
single call via these composite calls . The composite calls are
2005-09-26 15:47:55 +04:00
particularly designed to be used in async applications .
you can also stack multiple level of composite call
2005-01-12 10:03:29 +03:00
*/
2005-09-26 15:47:55 +04:00
/*
a composite call moves between the following 3 states .
*/
2005-09-30 02:36:41 +04:00
enum composite_state { COMPOSITE_STATE_INIT , /* we are creating the request */
COMPOSITE_STATE_IN_PROGRESS , /* the request is in the outgoing socket Q */
COMPOSITE_STATE_DONE , /* the request is received by the caller finished */
COMPOSITE_STATE_ERROR } ; /* a packet or transport level error has occurred */
2005-01-12 10:03:29 +03:00
2005-09-26 15:47:55 +04:00
/* the context of one "composite" call */
2005-01-31 11:30:44 +03:00
struct composite_context {
2005-01-12 10:03:29 +03:00
/* the external state - will be queried by the caller */
2005-09-26 15:47:55 +04:00
enum composite_state state ;
2005-01-12 10:03:29 +03:00
2005-01-17 01:22:13 +03:00
/* a private pointer for use by the composite function
implementation */
2005-09-26 15:47:55 +04:00
void * private_data ;
2005-01-12 14:43:18 +03:00
2005-01-12 10:03:29 +03:00
/* status code when finished */
NTSTATUS status ;
2005-01-15 13:29:43 +03:00
/* the event context we are using */
2008-12-29 22:24:57 +03:00
struct tevent_context * event_ctx ;
2005-01-15 13:29:43 +03:00
2005-01-12 10:03:29 +03:00
/* information on what to do on completion */
struct {
2005-01-31 11:30:44 +03:00
void ( * fn ) ( struct composite_context * ) ;
2005-09-26 15:47:55 +04:00
void * private_data ;
2005-01-12 10:03:29 +03:00
} async ;
2005-12-08 04:13:45 +03:00
2007-08-27 22:10:19 +04:00
bool used_wait ;
2005-04-15 18:45:00 +04:00
} ;
2006-03-07 14:07:23 +03:00
2006-03-14 18:03:25 +03:00
struct smbcli_request ;
2006-07-30 20:48:41 +04:00
struct smb2_request ;
2006-03-18 18:42:57 +03:00
struct nbt_name_request ;
2006-03-14 18:03:25 +03:00
2008-12-29 22:24:57 +03:00
struct composite_context * composite_create ( TALLOC_CTX * mem_ctx , struct tevent_context * ev ) ;
2008-04-02 06:53:27 +04:00
bool composite_nomem ( const void * p , struct composite_context * ctx ) ;
void composite_continue ( struct composite_context * ctx ,
struct composite_context * new_ctx ,
void ( * continuation ) ( struct composite_context * ) ,
void * private_data ) ;
void composite_continue_smb ( struct composite_context * ctx ,
struct smbcli_request * new_req ,
void ( * continuation ) ( struct smbcli_request * ) ,
void * private_data ) ;
void composite_continue_smb2 ( struct composite_context * ctx ,
struct smb2_request * new_req ,
void ( * continuation ) ( struct smb2_request * ) ,
void * private_data ) ;
void composite_continue_nbt ( struct composite_context * ctx ,
struct nbt_name_request * new_req ,
void ( * continuation ) ( struct nbt_name_request * ) ,
void * private_data ) ;
bool composite_is_ok ( struct composite_context * ctx ) ;
void composite_done ( struct composite_context * ctx ) ;
void composite_error ( struct composite_context * ctx , NTSTATUS status ) ;
NTSTATUS composite_wait ( struct composite_context * c ) ;
2008-05-16 09:03:12 +04:00
NTSTATUS composite_wait_free ( struct composite_context * c ) ;
2008-04-02 06:53:27 +04:00
# endif /* __COMPOSITE_H__ */