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
2005-06-02 07:41:12 +04:00
uint32_t relative_base_offset ;
struct ndr_token_list * relative_base_list ;
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 ;
2005-03-06 20:02:14 +03:00
struct ndr_token_list * switch_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
2005-06-02 07:41:12 +04:00
uint32_t relative_base_offset ;
struct ndr_token_list * relative_base_list ;
2005-03-06 20:02:14 +03:00
struct ndr_token_list * switch_list ;
2004-08-12 09:15:41 +04:00
struct ndr_token_list * relative_list ;
2005-07-07 23:49:35 +04:00
struct ndr_token_list * nbt_string_list ;
2004-08-12 09:15:41 +04:00
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 ;
2005-04-03 00:57:27 +04:00
struct ndr_token_list * switch_list ;
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-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
2005-03-11 13:09:16 +03:00
/* set to avoid recursion in ndr_size_*() calculation */
# define LIBNDR_FLAG_NO_NDR_SIZE (1<<31)
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)
2005-05-11 03:33:56 +04:00
# define NDR_PRINT_UNION_DEBUG(type, level, p) ndr_print_union_debug((ndr_print_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
2005-04-29 23:16:39 +04:00
# define NDR_BE(ndr) (((ndr)->flags & (LIBNDR_FLAG_BIGENDIAN|LIBNDR_FLAG_LITTLE_ENDIAN)) == LIBNDR_FLAG_BIGENDIAN)
2003-11-11 07:04:36 +03:00
2003-11-13 12:26:53 +03:00
enum ndr_err_code {
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 ,
2005-03-25 16:40:17 +03:00
NDR_ERR_COMPRESSION ,
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
} ;
2005-03-25 16:40:17 +03:00
enum ndr_compression_alg {
2005-03-30 14:48:52 +04:00
NDR_COMPRESSION_MSZIP
2005-03-25 16:40:17 +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)
2005-07-04 19:42:08 +04:00
# define NDR_ROUND(size, n) (((size)+((n)-1)) & ~((n)-1))
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 */
2005-06-24 05:18:56 +04:00
typedef NTSTATUS ( * ndr_push_flags_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 * ) ;
2005-06-24 05:18:56 +04:00
typedef void ( * ndr_print_fn_t ) ( struct ndr_print * , const char * , const void * ) ;
typedef void ( * ndr_print_function_t ) ( struct ndr_print * , const char * , int , const void * ) ;
2003-11-08 14:21:57 +03:00