+From d9fee28b67dcee387654151a24ebe2547d18156a Mon Sep 17 00:00:00 2001
+From: Nick Bowler <nbowler@draconx.ca>
+Date: Thu, 8 Sep 2022 17:29:28 -0400
+Subject: [PATCH 2/3] Adapt for NDR API changes in Samba.
+
+---
+ configure.ac | 38 ++++++++++++++++++++++++++
+ libmapi/socket/interface.c | 4 +++
+ ndr_mapi.c | 55 ++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 97 insertions(+)
+
+diff --git a/configure.ac b/configure.ac
+index 65793e9..20fa171 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -512,6 +512,44 @@ AS_CASE([$oc_cv_samba_cli_credentials_flavour],
+ [*new*], [AC_DEFINE([SAMBA_CRED_NEW_STYLE_SET_STATE], [1],
+ [Define to 1 if Samba cli_credentials_set_kerberos_state take 3 arguments])])
+
++# Probe for samba ndr.h incompatible change
++
++AC_CACHE_CHECK([whether Sabma ndr_token_peek returns error code],
++[oc_cv_samba_ndr_token_peek_errors],
++[oc_save_CFLAGS=$CFLAGS
++CFLAGS="$CFLAGS $SAMBA_CFLAGS"
++AC_COMPILE_IFELSE(
++ [AC_LANG_PROGRAM([#include <ndr.h>
++enum ndr_err_code ndr_token_peek();],
++ [return ndr_token_peek(0, 0, 0)])],
++ [oc_cv_samba_ndr_token_peek_errors=yes],
++ [oc_cv_samba_ndr_token_peek_errors=no])
++CFLAGS=$oc_save_CFLAGS])
++
++AS_CASE([$oc_cv_samba_ndr_token_peek_errors],
++ [yes], [AC_DEFINE([SAMBA_NDR_TOKEN_PEEK_ERRORS], [1],
++ [Define to 1 if Samba ndr_token_peek returns an error code])])
++
++AC_CACHE_CHECK([for Samba NDR_ZERO_STRUCT],
++[oc_cv_samba_have_ndr_zero_struct],
++[oc_save_CFLAGS=$CFLAGS
++CFLAGS="$CFLAGS $SAMBA_CFLAGS"
++AC_COMPILE_IFELSE(
++ [AC_LANG_PROGRAM([#include <ndr.h>],
++ [struct foo { int x; } bar; NDR_ZERO_STRUCT(bar);])],
++ [oc_cv_samba_have_ndr_zero_struct=yes],
++ [oc_cv_samba_have_ndr_zero_struct=no])
++CFLAGS=$oc_save_CFLAGS])
++
++AS_CASE([$oc_cv_samba_have_ndr_zero_struct],
++ [yes], [AC_DEFINE([SAMBA_HAVE_NDR_ZERO_STRUCT], [1],
++ [Define to 1 if Samba provides NDR_ZERO_STRUCT(P) macros])])
++
++oc_save_CFLAGS=$CFLAGS
++CFLAGS="$CFLAGS $SAMBA_CFLAGS"
++AC_CHECK_FUNCS([ndr_push_get_switch_value ndr_pull_get_switch_value ndr_print_get_switch_value])
++CFLAGS=$oc_save_CFLAGS
++
+ dnl ---------------------------------------------------------------------------
+ dnl Finally add libmapi to the library list
+ dnl ---------------------------------------------------------------------------
+diff --git a/libmapi/socket/interface.c b/libmapi/socket/interface.c
+index f1b3258..bc0d69a 100644
+--- a/libmapi/socket/interface.c
++++ b/libmapi/socket/interface.c
+@@ -23,6 +23,10 @@
+ #include "libmapi/libmapi_private.h"
+ #include <param.h>
+
++#if SAMBA_HAVE_NDR_ZERO_STRUCT
++# define ZERO_STRUCTPN(x) NDR_ZERO_STRUCT(*x)
++#endif
++
+ #define ALLONES ((uint32_t)0xFFFFFFFF)
+ /*
+ address construction based on a patch from fred@datalync.com
+diff --git a/ndr_mapi.c b/ndr_mapi.c
+index c177556..1b78c4b 100644
+--- a/ndr_mapi.c
++++ b/ndr_mapi.c
+@@ -27,6 +27,61 @@
+
+ #define MIN(a,b) ((a)<(b)?(a):(b))
+
++#if SAMBA_NDR_TOKEN_PEEK_ERRORS
++static uint32_t wrap_ndr_token_peek(struct ndr_token_list *list, const void *key)
++{
++ uint32_t ret;
++
++ ndr_token_peek(list, key, &ret);
++ return ret;
++}
++#define ndr_token_peek(a, b) wrap_ndr_token_peek(a, b)
++
++static uint32_t wrap_ndr_get_array_size(struct ndr_pull *ndr, const void *p)
++{
++ uint32_t ret;
++
++ ndr_get_array_size(ndr, p, &ret);
++ return ret;
++}
++#define ndr_get_array_size(a, b) wrap_ndr_get_array_size(a, b)
++
++static uint32_t wrap_ndr_get_array_length(struct ndr_pull *ndr, const void *p)
++{
++ uint32_t ret;
++
++ ndr_get_array_length(ndr, p, &ret);
++ return ret;
++}
++#define ndr_get_array_length(a, b) wrap_ndr_get_array_length(a, b)
++#endif
++
++#if SAMBA_HAVE_NDR_ZERO_STRUCT
++# define ZERO_STRUCT(x) NDR_ZERO_STRUCT(x)
++# define ZERO_STRUCTP(x) NDR_ZERO_STRUCTP(x)
++#endif
++
++#if !HAVE_NDR_PRINT_GET_SWITCH_VALUE
++static uint32_t ndr_print_get_switch_value(struct ndr_print *ndr, const void *p)
++{
++ return ndr_token_peek(&ndr->switch_list, p);
++}
++#endif
++
++#if !HAVE_NDR_PUSH_GET_SWITCH_VALUE
++static uint32_t ndr_push_get_switch_value(struct ndr_push *ndr, const void *p)
++{
++ return ndr_token_peek(&ndr->switch_list, p);
++}
++#endif
++
++#if !HAVE_NDR_PULL_GET_SWITCH_VALUE
++static uint32_t ndr_pull_get_switch_value(struct ndr_pull *ndr, const void *p)
++{
++ return ndr_token_peek(&ndr->switch_list, p);
++}
++#endif
++
+ _PUBLIC_ void obfuscate_data(uint8_t *data, uint32_t size, uint8_t salt)
+ {
+ uint32_t i;
+--
+2.35.1
+