2003-10-30 11:32:26 +03:00
/*
Unix SMB / CIFS implementation .
rpc interface definitions
Copyright ( C ) Andrew Tridgell 2003
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
( 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
along with this program ; if not , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
/*
this provides definitions for the libcli / rpc / MSRPC library
*/
2004-08-12 09:15:41 +04:00
/*
this is used by the token store / retrieve code
*/
struct ndr_token_list {
struct ndr_token_list * next , * prev ;
const void * key ;
uint32_t value ;
2003-11-17 05:18:11 +03:00
} ;
2003-10-30 11:32:26 +03:00
/* this is the base structure passed to routines that
parse MSRPC formatted data
note that in Samba4 we use separate routines and structures for
MSRPC marshalling and unmarshalling . Also note that these routines
are being kept deliberately very simple , and are not tied to a
particular transport
*/
2003-11-03 09:22:45 +03:00
struct ndr_pull {
2004-05-25 20:24:13 +04:00
uint32_t flags ; /* LIBNDR_FLAG_* */
2004-09-02 14:45:58 +04:00
uint8_t * data ;
2004-05-25 20:24:13 +04:00
uint32_t data_size ;
uint32_t offset ;
2003-11-17 05:18:11 +03:00
2004-08-12 09:15:41 +04:00
struct ndr_token_list * relative_list ;
2004-12-09 10:05:00 +03:00
struct ndr_token_list * array_size_list ;
struct ndr_token_list * array_length_list ;
2004-08-12 09:15:41 +04:00
/* this is used to ensure we generate unique reference IDs
between request and reply */
uint32_t ptr_count ;
2003-10-30 11:32:26 +03:00
} ;
2003-11-03 09:22:45 +03:00
struct ndr_pull_save {
2004-05-25 20:24:13 +04:00
uint32_t data_size ;
uint32_t offset ;
2003-11-17 05:18:11 +03:00
struct ndr_pull_save * next ;
2003-10-30 11:32:26 +03:00
} ;
2003-11-03 09:22:45 +03:00
/* structure passed to functions that generate NDR formatted data */
struct ndr_push {
2004-05-25 20:24:13 +04:00
uint32_t flags ; /* LIBNDR_FLAG_* */
2004-09-02 14:45:58 +04:00
uint8_t * data ;
2004-05-25 20:24:13 +04:00
uint32_t alloc_size ;
uint32_t offset ;
2003-11-16 14:36:59 +03:00
2004-08-12 09:15:41 +04:00
struct ndr_token_list * relative_list ;
2003-11-20 06:09:19 +03:00
/* this is used to ensure we generate unique reference IDs */
2004-05-25 20:24:13 +04:00
uint32_t ptr_count ;
2003-11-03 09:22:45 +03:00
} ;
2003-11-04 12:10:31 +03:00
struct ndr_push_save {
2004-05-25 20:24:13 +04:00
uint32_t offset ;
2003-11-16 14:36:59 +03:00
struct ndr_push_save * next ;
2003-11-04 12:10:31 +03:00
} ;
2003-11-11 07:04:36 +03:00
/* structure passed to functions that print IDL structures */
struct ndr_print {
2004-05-25 20:24:13 +04:00
uint32_t flags ; /* LIBNDR_FLAG_* */
uint32_t depth ;
2003-11-11 07:04:36 +03:00
void ( * print ) ( struct ndr_print * , const char * , . . . ) ;
2003-11-12 08:34:21 +03:00
void * private ;
2003-11-11 07:04:36 +03:00
} ;
2003-11-21 16:14:17 +03:00
# define LIBNDR_FLAG_BIGENDIAN (1<<0)
# define LIBNDR_FLAG_NOALIGN (1<<1)
2003-10-30 11:32:26 +03:00
2004-11-02 16:46:39 +03:00
# define LIBNDR_FLAG_STR_ASCII (1<<2)
# define LIBNDR_FLAG_STR_LEN4 (1<<3)
# define LIBNDR_FLAG_STR_SIZE4 (1<<4)
# define LIBNDR_FLAG_STR_NOTERM (1<<5)
# define LIBNDR_FLAG_STR_NULLTERM (1<<6)
# define LIBNDR_FLAG_STR_SIZE2 (1<<7)
# define LIBNDR_FLAG_STR_BYTESIZE (1<<8)
# define LIBNDR_FLAG_STR_FIXLEN32 (1<<9)
# define LIBNDR_FLAG_STR_CONFORMANT (1<<10)
# define LIBNDR_FLAG_STR_CHARLEN (1<<11)
2004-11-05 14:31:35 +03:00
# define LIBNDR_FLAG_STR_UTF8 (1<<12)
2005-01-21 09:54:10 +03:00
# define LIBNDR_FLAG_STR_FIXLEN15 (1<<13)
# define LIBNDR_STRING_FLAGS (0x3FFC)
2004-11-02 16:46:39 +03:00
# define LIBNDR_FLAG_REF_ALLOC (1<<20)
# define LIBNDR_FLAG_REMAINING (1<<21)
# define LIBNDR_FLAG_ALIGN2 (1<<22)
# define LIBNDR_FLAG_ALIGN4 (1<<23)
# define LIBNDR_FLAG_ALIGN8 (1<<24)
2003-11-23 09:28:12 +03:00
# define LIBNDR_ALIGN_FLAGS (LIBNDR_FLAG_ALIGN2|LIBNDR_FLAG_ALIGN4|LIBNDR_FLAG_ALIGN8)
2003-11-22 11:11:32 +03:00
2004-11-02 16:46:39 +03:00
# define LIBNDR_PRINT_ARRAY_HEX (1<<25)
# define LIBNDR_PRINT_SET_VALUES (1<<26)
2003-12-01 06:19:43 +03:00
2003-12-31 04:32:33 +03:00
/* used to force a section of IDL to be little-endian */
2004-11-02 16:46:39 +03:00
# define LIBNDR_FLAG_LITTLE_ENDIAN (1<<27)
2003-12-31 04:32:33 +03:00
2004-09-02 14:45:58 +04:00
/* used to check if alignment padding is zero */
2004-11-02 16:46:39 +03:00
# define LIBNDR_FLAG_PAD_CHECK (1<<28)
2004-09-02 14:45:58 +04:00
2004-09-03 16:10:34 +04:00
/* used to indicate spoolss style relative pointers (relative to current
offset , not base ) */
2004-11-02 16:46:39 +03:00
# define LIBNDR_FLAG_RELATIVE_CURRENT (1<<29)
2004-09-03 16:10:34 +04:00
2004-11-08 05:12:15 +03:00
/* set if an object uuid will be present */
# define LIBNDR_FLAG_OBJECT_PRESENT (1<<30)
2003-12-01 06:19:43 +03:00
2003-11-11 07:04:36 +03:00
/* useful macro for debugging */
# define NDR_PRINT_DEBUG(type, p) ndr_print_debug((ndr_print_fn_t)ndr_print_ ##type, #p, p)
2003-11-11 07:38:51 +03:00
# define NDR_PRINT_UNION_DEBUG(type, level, p) ndr_print_union_debug((ndr_print_union_fn_t)ndr_print_ ##type, #p, level, p)
2003-11-17 14:55:56 +03:00
# define NDR_PRINT_FUNCTION_DEBUG(type, flags, p) ndr_print_function_debug((ndr_print_function_t)ndr_print_ ##type, #type, flags, p)
# define NDR_PRINT_BOTH_DEBUG(type, p) NDR_PRINT_FUNCTION_DEBUG(type, NDR_BOTH, p)
# define NDR_PRINT_OUT_DEBUG(type, p) NDR_PRINT_FUNCTION_DEBUG(type, NDR_OUT, p)
2003-12-02 03:31:54 +03:00
# define NDR_PRINT_IN_DEBUG(type, p) NDR_PRINT_FUNCTION_DEBUG(type, NDR_IN | NDR_SET_VALUES, p)
2003-11-11 07:04:36 +03:00
2003-11-13 12:26:53 +03:00
enum ndr_err_code {
NDR_ERR_CONFORMANT_SIZE ,
NDR_ERR_ARRAY_SIZE ,
2003-11-15 13:58:29 +03:00
NDR_ERR_BAD_SWITCH ,
NDR_ERR_OFFSET ,
2003-11-16 16:49:14 +03:00
NDR_ERR_RELATIVE ,
2003-11-16 14:36:59 +03:00
NDR_ERR_CHARCNV ,
2003-11-21 16:14:17 +03:00
NDR_ERR_LENGTH ,
NDR_ERR_SUBCONTEXT ,
2003-11-22 11:11:32 +03:00
NDR_ERR_STRING ,
NDR_ERR_VALIDATE ,
NDR_ERR_BUFSIZE ,
2004-10-13 16:55:10 +04:00
NDR_ERR_ALLOC ,
2004-12-09 10:05:00 +03:00
NDR_ERR_RANGE ,
NDR_ERR_TOKEN
2003-11-13 12:26:53 +03:00
} ;
2003-11-08 14:21:57 +03:00
/*
flags passed to control parse flow
*/
# define NDR_SCALARS 1
# define NDR_BUFFERS 2
2003-11-17 14:55:56 +03:00
/*
flags passed to ndr_print_ * ( )
*/
# define NDR_IN 1
# define NDR_OUT 2
# define NDR_BOTH 3
2003-12-02 03:31:54 +03:00
# define NDR_SET_VALUES 4
2003-11-17 14:55:56 +03:00
2003-11-15 07:42:48 +03:00
# define NDR_PULL_NEED_BYTES(ndr, n) do { \
if ( ( n ) > ndr - > data_size | | ndr - > offset + ( n ) > ndr - > data_size ) { \
2003-11-22 11:11:32 +03:00
return ndr_pull_error ( ndr , NDR_ERR_BUFSIZE , " Pull bytes %u " , n ) ; \
2003-11-15 07:42:48 +03:00
} \
} while ( 0 )
2003-11-23 09:28:12 +03:00
# define NDR_ALIGN(ndr, n) ndr_align_size(ndr->offset, n)
2003-11-15 07:42:48 +03:00
# define NDR_PULL_ALIGN(ndr, n) do { \
2003-11-21 16:14:17 +03:00
if ( ! ( ndr - > flags & LIBNDR_FLAG_NOALIGN ) ) { \
2004-09-02 14:45:58 +04:00
if ( ndr - > flags & LIBNDR_FLAG_PAD_CHECK ) { \
ndr_check_padding ( ndr , n ) ; \
} \
2003-11-21 16:14:17 +03:00
ndr - > offset = ( ndr - > offset + ( n - 1 ) ) & ~ ( n - 1 ) ; \
} \
2005-01-29 06:17:14 +03:00
if ( ndr - > offset > ndr - > data_size ) { \
2003-11-22 11:11:32 +03:00
return ndr_pull_error ( ndr , NDR_ERR_BUFSIZE , " Pull align %u " , n ) ; \
2003-11-15 07:42:48 +03:00
} \
} while ( 0 )
# define NDR_PUSH_NEED_BYTES(ndr, n) NDR_CHECK(ndr_push_expand(ndr, ndr->offset+(n)))
# define NDR_PUSH_ALIGN(ndr, n) do { \
2003-11-21 16:14:17 +03:00
if ( ! ( ndr - > flags & LIBNDR_FLAG_NOALIGN ) ) { \
2004-05-25 20:24:13 +04:00
uint32_t _pad = ( ( ndr - > offset + ( n - 1 ) ) & ~ ( n - 1 ) ) - ndr - > offset ; \
2005-02-10 00:10:23 +03:00
while ( _pad - - ) NDR_CHECK ( ndr_push_uint8 ( ndr , NDR_SCALARS , 0 ) ) ; \
2003-11-21 16:14:17 +03:00
} \
2003-11-15 07:42:48 +03:00
} while ( 0 )
2003-10-30 11:32:26 +03:00
/* these are used to make the error checking on each element in libndr
less tedious , hopefully making the code more readable */
# define NDR_CHECK(call) do { NTSTATUS _status; \
_status = call ; \
if ( ! NT_STATUS_IS_OK ( _status ) ) \
return _status ; \
} while ( 0 )
2003-11-13 12:26:53 +03:00
# define NDR_ALLOC_SIZE(ndr, s, size) do { \
2005-01-06 06:20:56 +03:00
( s ) = talloc_size ( ndr , size ) ; \
2003-11-23 09:28:12 +03:00
if ( ( size ) & & ! ( s ) ) return ndr_pull_error ( ndr , NDR_ERR_ALLOC , \
2003-11-22 11:11:32 +03:00
" Alloc %u failed \n " , \
size ) ; \
2003-10-30 11:32:26 +03:00
} while ( 0 )
2003-11-13 12:26:53 +03:00
# define NDR_ALLOC(ndr, s) NDR_ALLOC_SIZE(ndr, s, sizeof(*(s)))
2003-11-08 14:21:57 +03:00
# define NDR_ALLOC_N_SIZE(ndr, s, n, elsize) do { \
2005-01-07 07:39:16 +03:00
( s ) = talloc_array_size ( ndr , elsize , n ) ; \
2004-12-09 10:05:00 +03:00
if ( ! ( s ) ) return ndr_pull_error ( ndr , NDR_ERR_ALLOC , " Alloc %u * %u failed \n " , n , elsize ) ; \
} while ( 0 )
2003-11-13 12:26:53 +03:00
2003-11-08 14:21:57 +03:00
# define NDR_ALLOC_N(ndr, s, n) NDR_ALLOC_N_SIZE(ndr, s, n, sizeof(*(s)))
2003-11-03 10:26:30 +03:00
2003-11-22 11:11:32 +03:00
# define NDR_PUSH_ALLOC_SIZE(ndr, s, size) do { \
2005-01-06 06:20:56 +03:00
( s ) = talloc_size ( ndr , size ) ; \
2004-12-09 10:05:00 +03:00
if ( ! ( s ) ) return ndr_push_error ( ndr , NDR_ERR_ALLOC , " push alloc %u failed \n " , size ) ; \
} while ( 0 )
2003-11-22 11:11:32 +03:00
# define NDR_PUSH_ALLOC(ndr, s) NDR_PUSH_ALLOC_SIZE(ndr, s, sizeof(*(s)))
2003-11-03 11:37:48 +03:00
/* these are used when generic fn pointers are needed for ndr push/pull fns */
2003-11-08 14:21:57 +03:00
typedef NTSTATUS ( * ndr_push_flags_fn_t ) ( struct ndr_push * , int ndr_flags , void * ) ;
2003-11-16 16:49:14 +03:00
typedef NTSTATUS ( * ndr_push_const_fn_t ) ( struct ndr_push * , int ndr_flags , const void * ) ;
2003-11-08 14:21:57 +03:00
typedef NTSTATUS ( * ndr_pull_flags_fn_t ) ( struct ndr_pull * , int ndr_flags , void * ) ;
2004-05-25 20:24:13 +04:00
typedef NTSTATUS ( * ndr_push_union_fn_t ) ( struct ndr_push * , int ndr_flags , uint32_t , void * ) ;
typedef NTSTATUS ( * ndr_pull_union_fn_t ) ( struct ndr_pull * , int ndr_flags , uint32_t , void * ) ;
2003-11-11 07:04:36 +03:00
typedef void ( * ndr_print_fn_t ) ( struct ndr_print * , const char * , void * ) ;
2003-11-17 14:55:56 +03:00
typedef void ( * ndr_print_function_t ) ( struct ndr_print * , const char * , int , void * ) ;
2004-05-25 20:24:13 +04:00
typedef void ( * ndr_print_union_fn_t ) ( struct ndr_print * , const char * , uint32_t , void * ) ;
2003-11-08 14:21:57 +03:00