text: /*
   * Unix SMB/CIFS implementation.
   * server auto-generated by pidl. DO NOT MODIFY!
   */
  
  #include "includes.h"
  #include "ntdomain.h"
  #include "librpc/gen_ndr/srv_krb5pac.h"
  
  static bool api_decode_pac(struct pipes_struct *p)
  {
  	const struct ndr_interface_call *call;
  	struct ndr_pull *pull;
  	struct ndr_push *push;
  	enum ndr_err_code ndr_err;
  	struct decode_pac *r;
  
  	call = &ndr_table_krb5pac.calls[NDR_DECODE_PAC];
  
  	r = talloc(talloc_tos(), struct decode_pac);
  	if (r == NULL) {
  		return false;
  	}
  
  	pull = ndr_pull_init_blob(&p->in_data.data, r);
  	if (pull == NULL) {
  		talloc_free(r);
  		return false;
  	}
  
  	pull->flags |= LIBNDR_FLAG_REF_ALLOC;
  	if (p->endian) {
  		pull->flags |= LIBNDR_FLAG_BIGENDIAN;
  	}
  	ndr_err = call->ndr_pull(pull, NDR_IN, r);
  	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
  		talloc_free(r);
  		return false;
  	}
  
  	if (DEBUGLEVEL >= 10) {
  		NDR_PRINT_FUNCTION_DEBUG(decode_pac, NDR_IN, r);
  	}
  
  	_decode_pac(p, r);
  
  	if (p->fault_state) {
  		talloc_free(r);
  		/* Return true here, srv_pipe_hnd.c will take care */
  		return true;
  	}
  
  	if (DEBUGLEVEL >= 10) {
  		NDR_PRINT_FUNCTION_DEBUG(decode_pac, NDR_OUT | NDR_SET_VALUES, r);
  	}
  
  	push = ndr_push_init_ctx(r);
  	if (push == NULL) {
  		talloc_free(r);
  		return false;
  	}
  
  	/*
  	 * carry over the pointer count to the reply in case we are
  	 * using full pointer. See NDR specification for full pointers
  	 */
  	push->ptr_count = pull->ptr_count;
  
  	ndr_err = call->ndr_push(push, NDR_OUT, r);
  	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
  		talloc_free(r);
  		return false;
  	}
  
  	p->out_data.rdata = ndr_push_blob(push);
  	talloc_steal(p->mem_ctx, p->out_data.rdata.data);
  
  	talloc_free(r);
  
  	return true;
  }
  
  static bool api_decode_pac_raw(struct pipes_struct *p)
  {
  	const struct ndr_interface_call *call;
  	struct ndr_pull *pull;
  	struct ndr_push *push;
  	enum ndr_err_code ndr_err;
  	struct decode_pac_raw *r;
  
  	call = &ndr_table_krb5pac.calls[NDR_DECODE_PAC_RAW];
  
  	r = talloc(talloc_tos(), struct decode_pac_raw);
  	if (r == NULL) {
  		return false;
  	}
  
  	pull = ndr_pull_init_blob(&p->in_data.data, r);
  	if (pull == NULL) {
  		talloc_free(r);
  		return false;
  	}
  
  	pull->flags |= LIBNDR_FLAG_REF_ALLOC;
  	if (p->endian) {
  		pull->flags |= LIBNDR_FLAG_BIGENDIAN;
  	}
  	ndr_err = call->ndr_pull(pull, NDR_IN, r);
  	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
  		talloc_free(r);
  		return false;
  	}
  
  	if (DEBUGLEVEL >= 10) {
  		NDR_PRINT_FUNCTION_DEBUG(decode_pac_raw, NDR_IN, r);
  	}
  
  	_decode_pac_raw(p, r);
  
  	if (p->fault_state) {
  		talloc_free(r);
  		/* Return true here, srv_pipe_hnd.c will take care */
  		return true;
  	}
  
  	if (DEBUGLEVEL >= 10) {
  		NDR_PRINT_FUNCTION_DEBUG(decode_pac_raw, NDR_OUT | NDR_SET_VALUES, r);
  	}
  
  	push = ndr_push_init_ctx(r);
  	if (push == NULL) {
  		talloc_free(r);
  		return false;
  	}
  
  	/*
  	 * carry over the pointer count to the reply in case we are
  	 * using full pointer. See NDR specification for full pointers
  	 */
  	push->ptr_count = pull->ptr_count;
  
  	ndr_err = call->ndr_push(push, NDR_OUT, r);
  	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
  		talloc_free(r);
  		return false;
  	}
  
  	p->out_data.rdata = ndr_push_blob(push);
  	talloc_steal(p->mem_ctx, p->out_data.rdata.data);
  
  	talloc_free(r);
  
  	return true;
  }
  
  static bool api_decode_login_info(struct pipes_struct *p)
  {
  	const struct ndr_interface_call *call;
  	struct ndr_pull *pull;
  	struct ndr_push *push;
  	enum ndr_err_code ndr_err;
  	struct decode_login_info *r;
  
  	call = &ndr_table_krb5pac.calls[NDR_DECODE_LOGIN_INFO];
  
  	r = talloc(talloc_tos(), struct decode_login_info);
  	if (r == NULL) {
  		return false;
  	}
  
  	pull = ndr_pull_init_blob(&p->in_data.data, r);
  	if (pull == NULL) {
  		talloc_free(r);
  		return false;
  	}
  
  	pull->flags |= LIBNDR_FLAG_REF_ALLOC;
  	if (p->endian) {
  		pull->flags |= LIBNDR_FLAG_BIGENDIAN;
  	}
  	ndr_err = call->ndr_pull(pull, NDR_IN, r);
  	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
  		talloc_free(r);
  		return false;
  	}
  
  	if (DEBUGLEVEL >= 10) {
  		NDR_PRINT_FUNCTION_DEBUG(decode_login_info, NDR_IN, r);
  	}
  
  	_decode_login_info(p, r);
  
  	if (p->fault_state) {
  		talloc_free(r);
  		/* Return true here, srv_pipe_hnd.c will take care */
  		return true;
  	}
  
  	if (DEBUGLEVEL >= 10) {
  		NDR_PRINT_FUNCTION_DEBUG(decode_login_info, NDR_OUT | NDR_SET_VALUES, r);
  	}
  
  	push = ndr_push_init_ctx(r);
  	if (push == NULL) {
  		talloc_free(r);
  		return false;
  	}
  
  	/*
  	 * carry over the pointer count to the reply in case we are
  	 * using full pointer. See NDR specification for full pointers
  	 */
  	push->ptr_count = pull->ptr_count;
  
  	ndr_err = call->ndr_push(push, NDR_OUT, r);
  	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
  		talloc_free(r);
  		return false;
  	}
  
  	p->out_data.rdata = ndr_push_blob(push);
  	talloc_steal(p->mem_ctx, p->out_data.rdata.data);
  
  	talloc_free(r);
  
  	return true;
  }
  
  static bool api_decode_login_info_ctr(struct pipes_struct *p)
  {
  	const struct ndr_interface_call *call;
  	struct ndr_pull *pull;
  	struct ndr_push *push;
  	enum ndr_err_code ndr_err;
  	struct decode_login_info_ctr *r;
  
  	call = &ndr_table_krb5pac.calls[NDR_DECODE_LOGIN_INFO_CTR];
  
  	r = talloc(talloc_tos(), struct decode_login_info_ctr);
  	if (r == NULL) {
  		return false;
  	}
  
  	pull = ndr_pull_init_blob(&p->in_data.data, r);
  	if (pull == NULL) {
  		talloc_free(r);
  		return false;
  	}
  
  	pull->flags |= LIBNDR_FLAG_REF_ALLOC;
  	if (p->endian) {
  		pull->flags |= LIBNDR_FLAG_BIGENDIAN;
  	}
  	ndr_err = call->ndr_pull(pull, NDR_IN, r);
  	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
  		talloc_free(r);
  		return false;
  	}
  
  	if (DEBUGLEVEL >= 10) {
  		NDR_PRINT_FUNCTION_DEBUG(decode_login_info_ctr, NDR_IN, r);
  	}
  
  	_decode_login_info_ctr(p, r);
  
  	if (p->fault_state) {
  		talloc_free(r);
  		/* Return true here, srv_pipe_hnd.c will take care */
  		return true;
  	}
  
  	if (DEBUGLEVEL >= 10) {
  		NDR_PRINT_FUNCTION_DEBUG(decode_login_info_ctr, NDR_OUT | NDR_SET_VALUES, r);
  	}
  
  	push = ndr_push_init_ctx(r);
  	if (push == NULL) {
  		talloc_free(r);
  		return false;
  	}
  
  	/*
  	 * carry over the pointer count to the reply in case we are
  	 * using full pointer. See NDR specification for full pointers
  	 */
  	push->ptr_count = pull->ptr_count;
  
  	ndr_err = call->ndr_push(push, NDR_OUT, r);
  	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
  		talloc_free(r);
  		return false;
  	}
  
  	p->out_data.rdata = ndr_push_blob(push);
  	talloc_steal(p->mem_ctx, p->out_data.rdata.data);
  
  	talloc_free(r);
  
  	return true;
  }
  
  static bool api_decode_pac_validate(struct pipes_struct *p)
  {
  	const struct ndr_interface_call *call;
  	struct ndr_pull *pull;
  	struct ndr_push *push;
  	enum ndr_err_code ndr_err;
  	struct decode_pac_validate *r;
  
  	call = &ndr_table_krb5pac.calls[NDR_DECODE_PAC_VALIDATE];
  
  	r = talloc(talloc_tos(), struct decode_pac_validate);
  	if (r == NULL) {
  		return false;
  	}
  
  	pull = ndr_pull_init_blob(&p->in_data.data, r);
  	if (pull == NULL) {
  		talloc_free(r);
  		return false;
  	}
  
  	pull->flags |= LIBNDR_FLAG_REF_ALLOC;
  	if (p->endian) {
  		pull->flags |= LIBNDR_FLAG_BIGENDIAN;
  	}
  	ndr_err = call->ndr_pull(pull, NDR_IN, r);
  	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
  		talloc_free(r);
  		return false;
  	}
  
  	if (DEBUGLEVEL >= 10) {
  		NDR_PRINT_FUNCTION_DEBUG(decode_pac_validate, NDR_IN, r);
  	}
  
  	_decode_pac_validate(p, r);
  
  	if (p->fault_state) {
  		talloc_free(r);
  		/* Return true here, srv_pipe_hnd.c will take care */
  		return true;
  	}
  
  	if (DEBUGLEVEL >= 10) {
  		NDR_PRINT_FUNCTION_DEBUG(decode_pac_validate, NDR_OUT | NDR_SET_VALUES, r);
  	}
  
  	push = ndr_push_init_ctx(r);
  	if (push == NULL) {
  		talloc_free(r);
  		return false;
  	}
  
  	/*
  	 * carry over the pointer count to the reply in case we are
  	 * using full pointer. See NDR specification for full pointers
  	 */
  	push->ptr_count = pull->ptr_count;
  
  	ndr_err = call->ndr_push(push, NDR_OUT, r);
  	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
  		talloc_free(r);
  		return false;
  	}
  
  	p->out_data.rdata = ndr_push_blob(push);
  	talloc_steal(p->mem_ctx, p->out_data.rdata.data);
  
  	talloc_free(r);
  
  	return true;
  }
  
  
  /* Tables */
  static struct api_struct api_krb5pac_cmds[] = 
  {
  	{"DECODE_PAC", NDR_DECODE_PAC, api_decode_pac},
  	{"DECODE_PAC_RAW", NDR_DECODE_PAC_RAW, api_decode_pac_raw},
  	{"DECODE_LOGIN_INFO", NDR_DECODE_LOGIN_INFO, api_decode_login_info},
  	{"DECODE_LOGIN_INFO_CTR", NDR_DECODE_LOGIN_INFO_CTR, api_decode_login_info_ctr},
  	{"DECODE_PAC_VALIDATE", NDR_DECODE_PAC_VALIDATE, api_decode_pac_validate},
  };
  
  void krb5pac_get_pipe_fns(struct api_struct **fns, int *n_fns)
  {
  	*fns = api_krb5pac_cmds;
  	*n_fns = sizeof(api_krb5pac_cmds) / sizeof(struct api_struct);
  }
  
  NTSTATUS rpc_krb5pac_init(const struct rpc_srv_callbacks *rpc_srv_cb)
  {
  	return rpc_srv_register(SMB_RPC_INTERFACE_VERSION, "krb5pac", "krb5pac", &ndr_table_krb5pac, api_krb5pac_cmds, sizeof(api_krb5pac_cmds) / sizeof(struct api_struct), rpc_srv_cb);
  }
  
  NTSTATUS rpc_krb5pac_shutdown(void)
  {
  	return rpc_srv_unregister(&ndr_table_krb5pac);
  }
  