diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f290fd1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/openchange-2.3-VULCAN.tar.gz
diff --git a/EMPTY b/EMPTY
deleted file mode 100644
index 0519ecb..0000000
--- a/EMPTY
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/doxygen_to_devhelp.xsl b/doxygen_to_devhelp.xsl
new file mode 100644
index 0000000..39f2471
--- /dev/null
+++ b/doxygen_to_devhelp.xsl
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ .html#
+
+
+
+
+
+
diff --git a/libmapi-0.8.2-libmapi-conflict.patch b/libmapi-0.8.2-libmapi-conflict.patch
new file mode 100644
index 0000000..2ccd77f
--- /dev/null
+++ b/libmapi-0.8.2-libmapi-conflict.patch
@@ -0,0 +1,348 @@
+diff -up openchange-openchange-2.3-VULCAN/libmapi.pc.in.libmapi-conflict openchange-openchange-2.3-VULCAN/libmapi.pc.in
+--- openchange-openchange-2.3-VULCAN/libmapi.pc.in.libmapi-conflict 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/libmapi.pc.in 2015-05-18 07:00:01.718355270 +0200
+@@ -8,7 +8,7 @@ datadir=@datadir@
+ Name: MAPI
+ Description: MAPI Protocol Implementation
+ Version: @PACKAGE_VERSION@
+-Libs: -L${libdir} -lmapi
++Libs: -L${libdir} -lmapi-openchange
+ Libs.private: @LIBS@
+ Cflags: -I${includedir}
+ Requires: talloc dcerpc ndr tevent
+diff -up openchange-openchange-2.3-VULCAN/Makefile.libmapi-conflict openchange-openchange-2.3-VULCAN/Makefile
+--- openchange-openchange-2.3-VULCAN/Makefile.libmapi-conflict 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/Makefile 2015-05-18 07:01:57.737350354 +0200
+@@ -166,7 +166,7 @@ LIBMAPI_SO_VERSION = 0
+
+ libmapi: idl \
+ libmapi/version.h \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+
+ libmapi-install: libmapi \
+ libmapi-installpc \
+@@ -201,8 +201,8 @@ endif
+ rm -f *~
+ rm -f */*~
+ rm -f */*/*~
+- rm -f libmapi.$(SHLIBEXT).$(PACKAGE_VERSION) libmapi.$(SHLIBEXT).* \
+- libmapi.$(SHLIBEXT)
++ rm -f libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION) libmapi-openchange.$(SHLIBEXT).* \
++ libmapi-openchange.$(SHLIBEXT)
+
+ clean:: libmapi-clean
+
+@@ -219,10 +219,10 @@ libmapi-installpc:
+ libmapi-installlib:
+ @echo "[*] install: libmapi library"
+ $(INSTALL) -d $(DESTDIR)$(libdir)
+- $(INSTALL) -m 0755 libmapi.$(SHLIBEXT).$(PACKAGE_VERSION) $(DESTDIR)$(libdir)
+- ln -sf libmapi.$(SHLIBEXT).$(PACKAGE_VERSION) $(DESTDIR)$(libdir)/libmapi.$(SHLIBEXT)
++ $(INSTALL) -m 0755 libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION) $(DESTDIR)$(libdir)
++ ln -sf libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION) $(DESTDIR)$(libdir)/libmapi-openchange.$(SHLIBEXT)
+ ifeq ($(MANUALLY_CREATE_SYMLINKS), yes)
+- ln -sf libmapi.$(SHLIBEXT).$(PACKAGE_VERSION) $(DESTDIR)$(libdir)/libmapi.$(SHLIBEXT).$(LIBMAPI_SO_VERSION)
++ ln -sf libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION) $(DESTDIR)$(libdir)/libmapi-openchange.$(SHLIBEXT).$(LIBMAPI_SO_VERSION)
+ endif
+
+ libmapi-installheader:
+@@ -267,7 +267,7 @@ libmapi-uninstallpc:
+ rm -f $(DESTDIR)$(libdir)/pkgconfig/libmapi.pc
+
+ libmapi-uninstalllib:
+- rm -f $(DESTDIR)$(libdir)/libmapi.*
++ rm -f $(DESTDIR)$(libdir)/libmapi-openchange.*
+
+ libmapi-uninstallheader:
+ rm -rf $(DESTDIR)$(includedir)/libmapi
+@@ -279,7 +279,7 @@ libmapi-uninstallscript:
+ rm -f $(DESTDIR)$(datadir)/setup/profiles/oc_profiles*
+ rm -rf $(DESTDIR)$(datadir)/setup/profiles
+
+-libmapi.$(SHLIBEXT).$(PACKAGE_VERSION): \
++libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION): \
+ libmapi/emsmdb.po \
+ libmapi/async_emsmdb.po \
+ libmapi/IABContainer.po \
+@@ -326,10 +326,10 @@ libmapi.$(SHLIBEXT).$(PACKAGE_VERSION):
+ libmapi/socket/interface.po \
+ libmapi/socket/netif.po
+ @echo "Linking $@"
+- @$(CC) $(DSOOPT) $(CFLAGS) $(LDFLAGS) -Wl,-soname,libmapi.$(SHLIBEXT).$(LIBMAPI_SO_VERSION) -o $@ $^ $(LIBS)
++ @$(CC) $(DSOOPT) $(CFLAGS) $(LDFLAGS) -Wl,-soname,libmapi-openchange.$(SHLIBEXT).$(LIBMAPI_SO_VERSION) -o $@ $^ $(LIBS)
+
+
+-libmapi.$(SHLIBEXT).$(LIBMAPI_SO_VERSION): libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++libmapi-openchange.$(SHLIBEXT).$(LIBMAPI_SO_VERSION): libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ ln -fs $< $@
+
+ libmapi/version.h: VERSION
+@@ -364,7 +364,7 @@ libmapipp.$(SHLIBEXT).$(PACKAGE_VERSION)
+ libmapi++/src/object.po \
+ libmapi++/src/profile.po \
+ libmapi++/src/session.po \
+- libmapi.$(SHLIBEXT).$(LIBMAPI_SO_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(LIBMAPI_SO_VERSION)
+ @echo "Linking $@"
+ @$(CXX) $(DSOOPT) $(CXX11FLAGS) $(CXXFLAGS) $(LDFLAGS) -Wl,-soname,libmapipp.$(SHLIBEXT).$(LIBMAPIPP_SO_VERSION) -o $@ $^ $(LIBS)
+
+@@ -445,7 +445,7 @@ clean:: libmapixx-tests-clean
+
+ bin/libmapixx-test: libmapi++/tests/test.cpp \
+ libmapipp.$(SHLIBEXT).$(PACKAGE_VERSION) \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking sample application $@"
+ @$(CXX) $(CXX11FLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)
+
+@@ -460,7 +460,7 @@ libmapixx-attach-clean:
+
+ bin/libmapixx-attach: libmapi++/tests/attach_test.po \
+ libmapipp.$(SHLIBEXT).$(PACKAGE_VERSION) \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking sample application $@"
+ @$(CXX) $(CXX11FLAGS) $(CXXFLAGS) -o $@ $^ $(LIBS)
+
+@@ -470,7 +470,7 @@ libmapixx-exception: bin/libmapixx-excep
+
+ bin/libmapixx-exception: libmapi++/tests/exception_test.cpp \
+ libmapipp.$(SHLIBEXT).$(PACKAGE_VERSION) \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking exception test application $@"
+ @$(CXX) $(CXX11FLAGS) $(CXXFLAGS) -o $@ $^ $(LIBS)
+
+@@ -490,7 +490,7 @@ libmapixx-profiletest-clean:
+
+ bin/libmapixx-profiletest: libmapi++/tests/profile_test.po \
+ libmapipp.$(SHLIBEXT).$(PACKAGE_VERSION) \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking profile test application $@"
+ @$(CXX) $(CXX11FLAGS) $(CXXFLAGS) -o $@ $^ $(LIBS)
+
+@@ -511,7 +511,7 @@ libmapixx-messages-clean:
+
+ libmapi++/examples/foldertree: libmapi++/examples/foldertree.cpp \
+ libmapipp.$(SHLIBEXT).$(PACKAGE_VERSION) \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking foldertree example application $@"
+ @$(CXX) $(CXX11FLAGS) $(CXXFLAGS) -o $@ $^ $(LIBS)
+
+@@ -519,7 +519,7 @@ clean:: libmapixx-foldertree-clean
+
+ libmapi++/examples/messages: libmapi++/examples/messages.cpp \
+ libmapipp.$(SHLIBEXT).$(PACKAGE_VERSION) \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking messages example application $@"
+ @$(CXX) $(CXX11FLAGS) $(CXXFLAGS) -o $@ $^ $(LIBS)
+
+@@ -586,7 +586,7 @@ libmapiadmin-uninstallheader:
+ libmapiadmin.$(SHLIBEXT).$(PACKAGE_VERSION): \
+ libmapiadmin/mapiadmin_user.po \
+ libmapiadmin/mapiadmin.po \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking $@"
+ @$(CC) $(DSOOPT) $(LDFLAGS) -Wl,-soname,libmapiadmin.$(SHLIBEXT).$(LIBMAPIADMIN_SO_VERSION) -o $@ $^ $(LIBS) $(LIBMAPIADMIN_LIBS)
+
+@@ -663,7 +663,7 @@ libocpf.$(SHLIBEXT).$(PACKAGE_VERSION):
+ libocpf/ocpf_dump.po \
+ libocpf/ocpf_api.po \
+ libocpf/ocpf_write.po \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking $@"
+ @$(CC) $(DSOOPT) $(LDFLAGS) -Wl,-soname,libocpf.$(SHLIBEXT).$(LIBOCPF_SO_VERSION) -o $@ $^ $(LIBS)
+
+@@ -740,7 +740,7 @@ mapiproxy/dcesrv_mapiproxy.$(SHLIBEXT):
+ gen_ndr/ndr_exchange.po
+
+ @echo "Linking $@"
+- @$(CC) -o $@ $(DSOOPT) $^ -L. $(LDFLAGS) $(LIBS) $(SAMBASERVER_LIBS) $(SAMDB_LIBS) -Lmapiproxy mapiproxy/libmapiproxy.$(SHLIBEXT).$(PACKAGE_VERSION) libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ @$(CC) -o $@ $(DSOOPT) $^ -L. $(LDFLAGS) $(LIBS) $(SAMBASERVER_LIBS) $(SAMDB_LIBS) -Lmapiproxy mapiproxy/libmapiproxy.$(SHLIBEXT).$(PACKAGE_VERSION) libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+
+ mapiproxy/dcesrv_mapiproxy.c: gen_ndr/ndr_exchange_s.c gen_ndr/ndr_exchange.c
+
+@@ -748,7 +748,7 @@ mapiproxy/dcesrv_mapiproxy.c: gen_ndr/nd
+ mapiproxy/dcesrv_asyncemsmdb.$(SHLIBEXT): mapiproxy/servers/default/asyncemsmdb/dcesrv_asyncemsmdb.po \
+ gen_ndr/ndr_asyncemsmdb.po
+ @echo "Linking $@"
+- @$(CC) -o $@ $(DSOOPT) $^ -L. $(LDFLAGS) $(LIBS) $(SAMBASERVER_LIBS) $(SAMDB_LIBS) $(NANOMSG_LIBS) -Lmapiproxy mapiproxy/libmapiproxy.$(SHLIBEXT).$(PACKAGE_VERSION) libmapi.$(SHLIBEXT).$(PACKAGE_VERSION) mapiproxy/libmapistore.$(SHLIBEXT).$(PACKAGE_VERSION) mapiproxy/libmapiserver.$(SHLIBEXT).$(PACKAGE_VERSION) \
++ @$(CC) -o $@ $(DSOOPT) $^ -L. $(LDFLAGS) $(LIBS) $(SAMBASERVER_LIBS) $(SAMDB_LIBS) $(NANOMSG_LIBS) -Lmapiproxy mapiproxy/libmapiproxy.$(SHLIBEXT).$(PACKAGE_VERSION) libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION) mapiproxy/libmapistore.$(SHLIBEXT).$(PACKAGE_VERSION) mapiproxy/libmapiserver.$(SHLIBEXT).$(PACKAGE_VERSION) \
+
+
+ mapiproxy/servers/default/asyncemsmdb/dcesrv_asyncemsmdb.c: gen_ndr/ndr_asyncemsmdb_s.c gen_ndr/ndr_asyncemsmdb.c
+@@ -808,7 +808,7 @@ mapiproxy/libmapiproxy.$(SHLIBEXT).$(PAC
+ mapiproxy/util/mysql.po \
+ mapiproxy/util/schema_migration.po \
+ mapiproxy/util/ccan/htable/htable.po \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking $@"
+ @$(CC) -o $@ $(DSOOPT) $(LDFLAGS) -Wl,-soname,libmapiproxy.$(SHLIBEXT).$(LIBMAPIPROXY_SO_VERSION) $^ -L. $(LIBS) $(TDB_LIBS) $(DL_LIBS) $(MYSQL_LIBS) $(PYTHON_LIBS)
+
+@@ -962,7 +962,7 @@ mapiproxy/libmapistore.$(SHLIBEXT).$(PAC
+ mapiproxy/util/ccan/htable/htable.po \
+ mapiproxy/util/ccan/hash/hash.po \
+ mapiproxy/libmapiproxy.$(SHLIBEXT).$(PACKAGE_VERSION) \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking $@"
+ @$(CC) $(DSOOPT) $(MEMCACHED_CFLAGS) $(CFLAGS) $(LDFLAGS) -Wl,-soname,libmapistore.$(SHLIBEXT).$(LIBMAPISTORE_SO_VERSION) -o $@ $^ $(LIBS) $(TDB_LIBS) $(DL_LIBS) $(MYSQL_LIBS) $(MEMCACHED_LIBS)
+
+@@ -984,7 +984,7 @@ mapistore_test: bin/mapistore_test
+ bin/mapistore_test: mapiproxy/libmapistore/tests/mapistore_test.o \
+ mapiproxy/libmapistore.$(SHLIBEXT).$(PACKAGE_VERSION) \
+ mapiproxy/libmapiproxy.$(SHLIBEXT).$(PACKAGE_VERSION) \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking $@"
+ @$(CC) -o $@ $^ $(LDFLAGS) $(LIBS) -lpopt
+
+@@ -1178,7 +1178,7 @@ clean:: openchangeclient-clean
+
+ bin/openchangeclient: utils/openchangeclient.o \
+ utils/openchange-tools.o \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION) \
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION) \
+ libocpf.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking $@"
+ @$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS) -lpopt
+@@ -1207,7 +1207,7 @@ clean:: mapiprofile-clean
+
+ bin/mapiprofile: utils/mapiprofile.o \
+ utils/openchange-tools.o \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking $@"
+ @$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS) -lpopt
+
+@@ -1233,7 +1233,7 @@ clean:: ocnotify-clean
+ bin/ocnotify: utils/ocnotify.o \
+ mapiproxy/libmapistore.$(SHLIBEXT).$(PACKAGE_VERSION) \
+ mapiproxy/libmapiproxy.$(SHLIBEXT).$(PACKAGE_VERSION) \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking $@"
+ @$(CC) $(CFLAGS) $(NANOMSG_CFLAGS) -o $@ $^ $(LDFLAGS) $(NANOMSG_LIBS) $(LIBS) -lpopt
+
+@@ -1257,7 +1257,7 @@ rpcextract-clean::
+ clean:: rpcextract-clean
+
+ bin/rpcextract: utils/rpcextract.o \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking $@"
+ @$(CC) $(CFLAGS) $(PCAP_CFLAGS) -o $@ $^ $(LDFLAGS) $(PCAP_LIBS) $(LIBS) -lpopt -lndr
+
+@@ -1282,7 +1282,7 @@ mapipropsdump-clean::
+ clean:: mapipropsdump-clean
+
+ bin/mapipropsdump: utils/mapipropsdump.o \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking $@"
+ @$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(SAMBA_LIBS) $(LIBS) $(DL_LIBS) -lpopt -lndr
+
+@@ -1309,7 +1309,7 @@ clean:: openchangepfadmin-clean
+
+ bin/openchangepfadmin: utils/openchangepfadmin.o \
+ utils/openchange-tools.o \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION) \
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION) \
+ libmapiadmin.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking $@"
+ @$(CC) -o $@ $^ $(LDFLAGS) $(LIBS) $(LIBMAPIADMIN_LIBS) -lpopt
+@@ -1341,7 +1341,7 @@ clean:: exchange2mbox-clean
+
+ bin/exchange2mbox: utils/exchange2mbox.o \
+ utils/openchange-tools.o \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking $@"
+ @$(CC) -o $@ $^ $(LIBS) $(LDFLAGS) -lpopt $(MAGIC_LIBS)
+
+@@ -1405,7 +1405,7 @@ bin/exchange2ical: utils/exchange2ical_t
+ libexchange2ical/ical2exchange.o \
+ libexchange2ical/ical2exchange_property.o \
+ utils/openchange-tools.o \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking $@"
+ @$(CC) $(LDFLAGS) -o $@ $^ $(LIBS) $(ICAL_LIBS) -lpopt
+
+@@ -1445,7 +1445,7 @@ bin/openchange-testsuite: testsuite/tes
+ mapiproxy/libmapistore.$(SHLIBEXT).$(PACKAGE_VERSION) \
+ mapiproxy/libmapiproxy.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking $@"
+- @$(CC) $(CFLAGS) $(CHECK_CFLAGS) $(TDB_CFLAGS) $(PYTHON_CFLAGS) -I. -Itestsuite/ -Imapiproxy -o $@ $^ $(LDFLAGS) $(LIBS) $(TDB_LIBS) $(CHECK_LIBS) $(MYSQL_LIBS) $(PYTHON_LIBS) -lpopt libmapi.$(SHLIBEXT).$(PACKAGE_VERSION) $(MEMCACHED_LIBS)
++ @$(CC) $(CFLAGS) $(CHECK_CFLAGS) $(TDB_CFLAGS) $(PYTHON_CFLAGS) -I. -Itestsuite/ -Imapiproxy -o $@ $^ $(LDFLAGS) $(LIBS) $(TDB_LIBS) $(CHECK_LIBS) $(MYSQL_LIBS) $(PYTHON_LIBS) -lpopt libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION) $(MEMCACHED_LIBS)
+
+ testsuite-check: testsuite
+ @LD_LIBRARY_PATH=. PYTHONPATH=./python CK_XML_LOG_FILE_NAME=test_results.xml ./bin/openchange-testsuite
+@@ -1513,7 +1513,7 @@ bin/mapitest: utils/mapitest/mapitest.o
+ utils/mapitest/modules/module_lcid.o \
+ utils/mapitest/modules/module_mapidump.o \
+ utils/mapitest/modules/module_lzxpress.o \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking $@"
+ @$(CC) -o $@ $^ $(LDFLAGS) $(LIBS) -lpopt $(SUBUNIT_LIBS)
+
+@@ -1574,7 +1574,7 @@ clean:: openchangemapidump-clean
+ bin/openchangemapidump: utils/backup/openchangemapidump.o \
+ utils/backup/openchangebackup.o \
+ utils/openchange-tools.o \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking $@"
+ @$(CC) -o $@ $^ $(LDFLAGS) $(LIBS) -lpopt
+
+@@ -1625,7 +1625,7 @@ check_fasttransfer-clean::
+ clean:: check_fasttransfer-clean
+
+ bin/check_fasttransfer: testprogs/check_fasttransfer.o \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION) \
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION) \
+ mapiproxy/libmapistore.$(SHLIBEXT).$(PACKAGE_VERSION) \
+ mapiproxy/libmapiproxy.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking $@"
+@@ -1653,7 +1653,7 @@ test_asyncnotif-clean::
+ clean:: test_asyncnotif-clean
+
+ bin/test_asyncnotif: testprogs/test_asyncnotif.o \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking $@"
+ @$(CC) -o $@ $^ $(LIBS) $(LDFLAGS) -lpopt
+
+@@ -1701,13 +1701,13 @@ pyopenchange: $(pythonscriptdir)/opench
+
+ $(pythonscriptdir)/openchange/mapi.$(SHLIBEXT): pyopenchange/pymapi.c \
+ pyopenchange/pymapi_properties.c \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking $@"
+ @$(CC) $(PYTHON_CFLAGS) $(CFLAGS) -fno-strict-aliasing $(DSOOPT) $(LDFLAGS) -o $@ $^ $(PYTHON_LIBS) $(LIBS)
+
+ # $(pythonscriptdir)/openchange/ocpf.$(SHLIBEXT): pyopenchange/pyocpf.c \
+ # libocpf.$(SHLIBEXT).$(PACKAGE_VERSION) \
+-# libmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
++# libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION)
+ # @echo "Linking $@"
+ # @$(CC) $(PYTHON_CFLAGS) $(CFLAGS) $(DSOOPT) $(LDFLAGS) -o $@ $^ $(PYTHON_LIBS) $(LIBS)
+
+@@ -1894,7 +1894,7 @@ libqtmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
+
+ qt/demo/demoapp: qt/demo/demoapp.o \
+ qt/demo/main.o \
+- libmapi.$(SHLIBEXT).$(PACKAGE_VERSION) \
++ libmapi-openchange.$(SHLIBEXT).$(PACKAGE_VERSION) \
+ libmapipp.$(SHLIBEXT).$(PACKAGE_VERSION) \
+ libqtmapi.$(SHLIBEXT).$(PACKAGE_VERSION)
+ @echo "Linking $@"
diff --git a/openchange-0.9-generate-xml-doc.patch b/openchange-0.9-generate-xml-doc.patch
new file mode 100644
index 0000000..49b84f3
--- /dev/null
+++ b/openchange-0.9-generate-xml-doc.patch
@@ -0,0 +1,196 @@
+diff -up openchange-2.0-QUADRANT/Doxyfile.in.generate-xml-doc openchange-2.0-QUADRANT/Doxyfile.in
+--- openchange-2.0-QUADRANT/Doxyfile.in.generate-xml-doc 2013-01-24 19:55:36.000000000 +0100
++++ openchange-2.0-QUADRANT/Doxyfile.in 2013-02-14 12:23:27.594802658 +0100
+@@ -224,7 +224,7 @@ SUBGROUPING = YES
+ # Private class members and static file members will be hidden unless
+ # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+-EXTRACT_ALL = NO
++EXTRACT_ALL = YES
+
+ # If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+ # will be included in the documentation.
+@@ -918,13 +918,13 @@ MAN_LINKS = YES
+ # generate an XML file that captures the structure of
+ # the code including all documentation.
+
+-GENERATE_XML = NO
++GENERATE_XML = YES
+
+ # The XML_OUTPUT tag is used to specify where the XML pages will be put.
+ # If a relative path is entered the value of OUTPUT_DIRECTORY will be
+ # put in front of it. If left blank `xml' will be used as the default path.
+
+-XML_OUTPUT = xml
++XML_OUTPUT = xml/overview
+
+ # The XML_SCHEMA tag can be used to specify an XML schema,
+ # which can be used by a validating XML parser to check the
+diff -up openchange-2.0-QUADRANT/libmapiadmin/Doxyfile.in.generate-xml-doc openchange-2.0-QUADRANT/libmapiadmin/Doxyfile.in
+--- openchange-2.0-QUADRANT/libmapiadmin/Doxyfile.in.generate-xml-doc 2013-01-24 19:55:36.000000000 +0100
++++ openchange-2.0-QUADRANT/libmapiadmin/Doxyfile.in 2013-02-14 12:23:27.594802658 +0100
+@@ -224,7 +224,7 @@ SUBGROUPING = YES
+ # Private class members and static file members will be hidden unless
+ # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+-EXTRACT_ALL = NO
++EXTRACT_ALL = YES
+
+ # If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+ # will be included in the documentation.
+@@ -916,13 +916,13 @@ MAN_LINKS = YES
+ # generate an XML file that captures the structure of
+ # the code including all documentation.
+
+-GENERATE_XML = NO
++GENERATE_XML = YES
+
+ # The XML_OUTPUT tag is used to specify where the XML pages will be put.
+ # If a relative path is entered the value of OUTPUT_DIRECTORY will be
+ # put in front of it. If left blank `xml' will be used as the default path.
+
+-XML_OUTPUT = xml
++XML_OUTPUT = xml/libmapiadmin
+
+ # The XML_SCHEMA tag can be used to specify an XML schema,
+ # which can be used by a validating XML parser to check the
+diff -up openchange-2.0-QUADRANT/libmapi/Doxyfile.in.generate-xml-doc openchange-2.0-QUADRANT/libmapi/Doxyfile.in
+--- openchange-2.0-QUADRANT/libmapi/Doxyfile.in.generate-xml-doc 2013-01-24 19:55:36.000000000 +0100
++++ openchange-2.0-QUADRANT/libmapi/Doxyfile.in 2013-02-14 12:23:27.594802658 +0100
+@@ -224,7 +224,7 @@ SUBGROUPING = YES
+ # Private class members and static file members will be hidden unless
+ # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+-EXTRACT_ALL = NO
++EXTRACT_ALL = YES
+
+ # If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+ # will be included in the documentation.
+@@ -922,13 +922,13 @@ MAN_LINKS = YES
+ # generate an XML file that captures the structure of
+ # the code including all documentation.
+
+-GENERATE_XML = NO
++GENERATE_XML = YES
+
+ # The XML_OUTPUT tag is used to specify where the XML pages will be put.
+ # If a relative path is entered the value of OUTPUT_DIRECTORY will be
+ # put in front of it. If left blank `xml' will be used as the default path.
+
+-XML_OUTPUT = xml
++XML_OUTPUT = xml/libmapi
+
+ # The XML_SCHEMA tag can be used to specify an XML schema,
+ # which can be used by a validating XML parser to check the
+diff -up openchange-2.0-QUADRANT/libmapi++/Doxyfile.in.generate-xml-doc openchange-2.0-QUADRANT/libmapi++/Doxyfile.in
+--- openchange-2.0-QUADRANT/libmapi++/Doxyfile.in.generate-xml-doc 2013-01-24 19:55:36.000000000 +0100
++++ openchange-2.0-QUADRANT/libmapi++/Doxyfile.in 2013-02-14 12:23:27.595802671 +0100
+@@ -224,7 +224,7 @@ SUBGROUPING = YES
+ # Private class members and static file members will be hidden unless
+ # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+-EXTRACT_ALL = NO
++EXTRACT_ALL = YES
+
+ # If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+ # will be included in the documentation.
+@@ -901,13 +901,13 @@ MAN_LINKS = YES
+ # generate an XML file that captures the structure of
+ # the code including all documentation.
+
+-GENERATE_XML = NO
++GENERATE_XML = YES
+
+ # The XML_OUTPUT tag is used to specify where the XML pages will be put.
+ # If a relative path is entered the value of OUTPUT_DIRECTORY will be
+ # put in front of it. If left blank `xml' will be used as the default path.
+
+-XML_OUTPUT = xml
++XML_OUTPUT = xml/libmapi++
+
+ # The XML_SCHEMA tag can be used to specify an XML schema,
+ # which can be used by a validating XML parser to check the
+diff -up openchange-2.0-QUADRANT/libocpf/Doxyfile.in.generate-xml-doc openchange-2.0-QUADRANT/libocpf/Doxyfile.in
+--- openchange-2.0-QUADRANT/libocpf/Doxyfile.in.generate-xml-doc 2013-01-24 19:55:36.000000000 +0100
++++ openchange-2.0-QUADRANT/libocpf/Doxyfile.in 2013-02-14 12:23:27.595802671 +0100
+@@ -224,7 +224,7 @@ SUBGROUPING = YES
+ # Private class members and static file members will be hidden unless
+ # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+-EXTRACT_ALL = NO
++EXTRACT_ALL = YES
+
+ # If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+ # will be included in the documentation.
+@@ -920,13 +920,13 @@ MAN_LINKS = YES
+ # generate an XML file that captures the structure of
+ # the code including all documentation.
+
+-GENERATE_XML = NO
++GENERATE_XML = YES
+
+ # The XML_OUTPUT tag is used to specify where the XML pages will be put.
+ # If a relative path is entered the value of OUTPUT_DIRECTORY will be
+ # put in front of it. If left blank `xml' will be used as the default path.
+
+-XML_OUTPUT = xml
++XML_OUTPUT = xml/libocpf
+
+ # The XML_SCHEMA tag can be used to specify an XML schema,
+ # which can be used by a validating XML parser to check the
+diff -up openchange-2.0-QUADRANT/mapiproxy/Doxyfile.in.generate-xml-doc openchange-2.0-QUADRANT/mapiproxy/Doxyfile.in
+--- openchange-2.0-QUADRANT/mapiproxy/Doxyfile.in.generate-xml-doc 2013-01-24 19:55:36.000000000 +0100
++++ openchange-2.0-QUADRANT/mapiproxy/Doxyfile.in 2013-02-14 12:23:27.596802685 +0100
+@@ -286,7 +286,7 @@ SYMBOL_CACHE_SIZE = 0
+ # Private class members and static file members will be hidden unless
+ # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+-EXTRACT_ALL = NO
++EXTRACT_ALL = YES
+
+ # If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+ # will be included in the documentation.
+@@ -1118,13 +1118,13 @@ MAN_LINKS = YES
+ # generate an XML file that captures the structure of
+ # the code including all documentation.
+
+-GENERATE_XML = NO
++GENERATE_XML = YES
+
+ # The XML_OUTPUT tag is used to specify where the XML pages will be put.
+ # If a relative path is entered the value of OUTPUT_DIRECTORY will be
+ # put in front of it. If left blank `xml' will be used as the default path.
+
+-XML_OUTPUT = xml
++XML_OUTPUT = xml/mapiproxy
+
+ # The XML_SCHEMA tag can be used to specify an XML schema,
+ # which can be used by a validating XML parser to check the
+diff -up openchange-2.0-QUADRANT/utils/mapitest/Doxyfile.in.generate-xml-doc openchange-2.0-QUADRANT/utils/mapitest/Doxyfile.in
+--- openchange-2.0-QUADRANT/utils/mapitest/Doxyfile.in.generate-xml-doc 2013-01-24 19:55:36.000000000 +0100
++++ openchange-2.0-QUADRANT/utils/mapitest/Doxyfile.in 2013-02-14 12:23:27.596802685 +0100
+@@ -224,7 +224,7 @@ SUBGROUPING = YES
+ # Private class members and static file members will be hidden unless
+ # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+-EXTRACT_ALL = NO
++EXTRACT_ALL = YES
+
+ # If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+ # will be included in the documentation.
+@@ -914,13 +914,13 @@ MAN_LINKS = YES
+ # generate an XML file that captures the structure of
+ # the code including all documentation.
+
+-GENERATE_XML = NO
++GENERATE_XML = YES
+
+ # The XML_OUTPUT tag is used to specify where the XML pages will be put.
+ # If a relative path is entered the value of OUTPUT_DIRECTORY will be
+ # put in front of it. If left blank `xml' will be used as the default path.
+
+-XML_OUTPUT = xml
++XML_OUTPUT = xml/mapitest
+
+ # The XML_SCHEMA tag can be used to specify an XML schema,
+ # which can be used by a validating XML parser to check the
diff --git a/openchange-1.0-OC_RULE_ADD-fix.patch b/openchange-1.0-OC_RULE_ADD-fix.patch
new file mode 100644
index 0000000..9435bfd
--- /dev/null
+++ b/openchange-1.0-OC_RULE_ADD-fix.patch
@@ -0,0 +1,12 @@
+diff -up openchange-2.1-QUADRANT/configure.ac.OC_RULE_ADD-fix openchange-2.1-QUADRANT/configure.ac
+--- openchange-2.1-QUADRANT/configure.ac.OC_RULE_ADD-fix 2014-04-28 11:41:13.075975644 +0200
++++ openchange-2.1-QUADRANT/configure.ac 2014-04-28 11:56:50.991936546 +0200
+@@ -639,7 +639,7 @@ dnl ####################################
+ dnl mapiproxy server
+ dnl ##########################################################################
+ if test x$PYTHON != x; then
+- if test "x$SAMBASERVER_LIBS" != x ; then
++ if test "x$SAMDB_LIBS" != x -a "x$SAMBASERVER_LIBS" != x ; then
+ mapiproxy=1
+ fi
+ fi
diff --git a/openchange-1.0-symbol-clash.patch b/openchange-1.0-symbol-clash.patch
new file mode 100644
index 0000000..1c352e6
--- /dev/null
+++ b/openchange-1.0-symbol-clash.patch
@@ -0,0 +1,109 @@
+diff -up openchange-2.1-QUADRANT/libmapi/emsmdb.c.symbol-clash openchange-2.1-QUADRANT/libmapi/emsmdb.c
+--- openchange-2.1-QUADRANT/libmapi/emsmdb.c.symbol-clash 2014-04-28 11:58:17.560932938 +0200
++++ openchange-2.1-QUADRANT/libmapi/emsmdb.c 2014-04-28 12:00:21.085927789 +0200
+@@ -644,7 +644,7 @@ struct mapi_notify_ctx *emsmdb_bind_noti
+ notify_ctx->notifications->next = NULL;
+
+ openchange_load_interfaces(mem_ctx, lpcfg_interfaces(mapi_ctx->lp_ctx), &ifaces);
+- ipaddr = iface_best_ip(ifaces, mapi_ctx->session->profile->server);
++ ipaddr = libmapi_iface_best_ip(ifaces, mapi_ctx->session->profile->server);
+ if (!ipaddr) {
+ talloc_free(notify_ctx->notifications);
+ talloc_free(notify_ctx);
+diff -up openchange-2.1-QUADRANT/libmapi/libmapi_private.h.symbol-clash openchange-2.1-QUADRANT/libmapi/libmapi_private.h
+--- openchange-2.1-QUADRANT/libmapi/libmapi_private.h.symbol-clash 2014-04-28 11:58:17.560932938 +0200
++++ openchange-2.1-QUADRANT/libmapi/libmapi_private.h 2014-04-28 12:05:13.875915584 +0200
+@@ -123,13 +123,13 @@ uint16_t mapi_recipients_RecipientFlags
+
+ /* The following private definitions come from libmapi/socket/interface.c */
+ void openchange_load_interfaces(TALLOC_CTX *, const char **, struct interface **);
+-int iface_count(struct interface *);
+-const char *iface_n_ip(struct interface *, int);
+-const char *iface_n_bcast(struct interface *, int);
+-const char *iface_n_netmask(struct interface *, int);
+-const char *iface_best_ip(struct interface *, const char *);
+-bool iface_is_local(struct interface *, const char *);
+-bool iface_same_net(const char *, const char *, const char *);
++int libmapi_iface_count(struct interface *);
++const char *libmapi_iface_n_ip(struct interface *, int);
++const char *libmapi_iface_n_bcast(struct interface *, int);
++const char *libmapi_iface_n_netmask(struct interface *, int);
++const char *libmapi_iface_best_ip(struct interface *, const char *);
++bool libmapi_iface_is_local(struct interface *, const char *);
++bool libmapi_iface_same_net(const char *, const char *, const char *);
+
+ __END_DECLS
+
+diff -up openchange-2.1-QUADRANT/libmapi/socket/interface.c.symbol-clash openchange-2.1-QUADRANT/libmapi/socket/interface.c
+--- openchange-2.1-QUADRANT/libmapi/socket/interface.c.symbol-clash 2014-04-23 21:43:06.000000000 +0200
++++ openchange-2.1-QUADRANT/libmapi/socket/interface.c 2014-04-28 11:58:17.560932938 +0200
+@@ -228,7 +228,7 @@ void openchange_load_interfaces(TALLOC_C
+ /**
+ how many interfaces do we have
+ **/
+-int iface_count(struct interface *ifaces)
++int libmapi_iface_count(struct interface *ifaces)
+ {
+ int ret = 0;
+ struct interface *i;
+@@ -241,7 +241,7 @@ int iface_count(struct interface *ifaces
+ /**
+ return IP of the Nth interface
+ **/
+-const char *iface_n_ip(struct interface *ifaces, int n)
++const char *libmapi_iface_n_ip(struct interface *ifaces, int n)
+ {
+ struct interface *i;
+
+@@ -257,7 +257,7 @@ const char *iface_n_ip(struct interface
+ /**
+ return bcast of the Nth interface
+ **/
+-const char *iface_n_bcast(struct interface *ifaces, int n)
++const char *libmapi_iface_n_bcast(struct interface *ifaces, int n)
+ {
+ struct interface *i;
+
+@@ -273,7 +273,7 @@ const char *iface_n_bcast(struct interfa
+ /**
+ return netmask of the Nth interface
+ **/
+-const char *iface_n_netmask(struct interface *ifaces, int n)
++const char *libmapi_iface_n_netmask(struct interface *ifaces, int n)
+ {
+ struct interface *i;
+
+@@ -290,7 +290,7 @@ const char *iface_n_netmask(struct inter
+ return the local IP address that best matches a destination IP, or
+ our first interface if none match
+ */
+-const char *iface_best_ip(struct interface *ifaces, const char *dest)
++const char *libmapi_iface_best_ip(struct interface *ifaces, const char *dest)
+ {
+ struct interface *iface;
+ struct in_addr ip;
+@@ -300,13 +300,13 @@ const char *iface_best_ip(struct interfa
+ if (iface) {
+ return iface->ip_s;
+ }
+- return iface_n_ip(ifaces, 0);
++ return libmapi_iface_n_ip(ifaces, 0);
+ }
+
+ /**
+ return true if an IP is one one of our local networks
+ */
+-bool iface_is_local(struct interface *ifaces, const char *dest)
++bool libmapi_iface_is_local(struct interface *ifaces, const char *dest)
+ {
+ struct in_addr ip;
+
+@@ -320,7 +320,7 @@ bool iface_is_local(struct interface *if
+ /**
+ return true if a IP matches a IP/netmask pair
+ */
+-bool iface_same_net(const char *ip1, const char *ip2, const char *netmask)
++bool libmapi_iface_same_net(const char *ip1, const char *ip2, const char *netmask)
+ {
+ return same_net_v4(interpret_addr2(ip1),
+ interpret_addr2(ip2),
diff --git a/openchange-2.2-samba-4.2.0-rc2.patch b/openchange-2.2-samba-4.2.0-rc2.patch
new file mode 100644
index 0000000..d154505
--- /dev/null
+++ b/openchange-2.2-samba-4.2.0-rc2.patch
@@ -0,0 +1,136 @@
+diff -up openchange-openchange-2.3-VULCAN/libmapi/cdo_mapi.c.samba-4.2.0-rc2 openchange-openchange-2.3-VULCAN/libmapi/cdo_mapi.c
+--- openchange-openchange-2.3-VULCAN/libmapi/cdo_mapi.c.samba-4.2.0-rc2 2015-12-03 11:20:17.502119228 +0100
++++ openchange-openchange-2.3-VULCAN/libmapi/cdo_mapi.c 2015-12-03 11:20:44.524118102 +0100
+@@ -337,6 +337,9 @@ _PUBLIC_ enum MAPISTATUS SetMAPIDebugLev
+ ret = lpcfg_set_cmdline(mapi_ctx->lp_ctx, "log level", debuglevel);
+ talloc_free(debuglevel);
+
++ if (ret)
++ _oc_log_samba_level = level;
++
+ return (ret == true) ? MAPI_E_SUCCESS : MAPI_E_INVALID_PARAMETER;
+ }
+
+diff -up openchange-openchange-2.3-VULCAN/libmapi/oc_log.c.samba-4.2.0-rc2 openchange-openchange-2.3-VULCAN/libmapi/oc_log.c
+--- openchange-openchange-2.3-VULCAN/libmapi/oc_log.c.samba-4.2.0-rc2 2015-12-03 11:11:01.801142393 +0100
++++ openchange-openchange-2.3-VULCAN/libmapi/oc_log.c 2015-12-03 11:27:22.921101494 +0100
+@@ -20,7 +20,9 @@
+ */
+
+ #include "libmapi/libmapi.h"
+-#include
++#include
++
++int _oc_log_samba_level = 0;
+
+ void oc_log(enum oc_log_level level, const char *fmt_string, ...)
+ {
+@@ -47,12 +49,16 @@ void oc_logv(enum oc_log_level level, co
+ samba_level = 0;
+ }
+
++ if (samba_level && !(_oc_log_samba_level & samba_level))
++ return;
++
+ /* Add a trailing newline if one is not already present */
+ if (line[strlen(line)-1] == '\n') {
+- DEBUG(samba_level, ("%s", line));
++ fprintf(stderr, "%s", line);
+ } else {
+- DEBUG(samba_level, ("%s\n", line));
++ fprintf(stderr, "%s\n", line);
+ }
++ fflush(stderr);
+ }
+
+ void oc_log_init_stdout()
+diff -up openchange-openchange-2.3-VULCAN/libmapi/oc_log.h.samba-4.2.0-rc2 openchange-openchange-2.3-VULCAN/libmapi/oc_log.h
+--- openchange-openchange-2.3-VULCAN/libmapi/oc_log.h.samba-4.2.0-rc2 2015-12-03 11:18:27.407123817 +0100
++++ openchange-openchange-2.3-VULCAN/libmapi/oc_log.h 2015-12-03 11:20:19.228119156 +0100
+@@ -77,4 +77,6 @@ void oc_log_init_user(const char *progna
+ defaulting to /var/log/openchange.log */
+ void oc_log_init_server(const char *progname, struct loadparm_context *lp_ctx);
+
++extern int _oc_log_samba_level; /* Private, do not change it other than by SetMAPIDebugLevel() */
++
+ #endif /* _OC_LOG_H_ */
+diff -up openchange-openchange-2.3-VULCAN/mapiproxy/libmapiproxy/fault_util.c.samba-4.2.0-rc2 openchange-openchange-2.3-VULCAN/mapiproxy/libmapiproxy/fault_util.c
+--- openchange-openchange-2.3-VULCAN/mapiproxy/libmapiproxy/fault_util.c.samba-4.2.0-rc2 2015-12-03 11:11:17.337141745 +0100
++++ openchange-openchange-2.3-VULCAN/mapiproxy/libmapiproxy/fault_util.c 2015-12-03 11:27:46.505100511 +0100
+@@ -30,14 +30,14 @@
+ #include "fault_util.h"
+ #include "libmapi/libmapi.h"
+ #include "libmapi/libmapi_private.h"
+-#include
++#include
+
+ #include
+
+ #include
+
+ /**
+- \details print a backtrace using DEBUG() macro.
++ \details print a backtrace (*not* using DEBUG() macro).
+
+ */
+ _PUBLIC_ void debug_print_backtrace(int dbg_level)
+@@ -47,16 +47,19 @@ _PUBLIC_ void debug_print_backtrace(int
+ size_t backtrace_size;
+ char **backtrace_strings;
+
++ if (!(_oc_log_samba_level & dbg_level))
++ return;
++
+ backtrace_size = backtrace(backtrace_stack, BACKTRACE_SIZE);
+ backtrace_strings = backtrace_symbols(backtrace_stack, backtrace_size);
+
+- DEBUG(dbg_level, ("BACKTRACE: %lu stack frames:\n", (unsigned long)backtrace_size));
++ fprintf(stderr, "BACKTRACE: %lu stack frames:\n", (unsigned long)backtrace_size);
+
+ if (backtrace_strings) {
+ int i;
+
+ for (i = 0; i < backtrace_size; i++) {
+- DEBUGADD(dbg_level, (" #%.2u %s\n", i, backtrace_strings[i]));
++ fprintf(stderr, " #%.2u %s\n", i, backtrace_strings[i]);
+ }
+
+ free(backtrace_strings);
+diff -up openchange-openchange-2.3-VULCAN/mapiproxy/libmapiproxy/fault_util.h.samba-4.2.0-rc2 openchange-openchange-2.3-VULCAN/mapiproxy/libmapiproxy/fault_util.h
+--- openchange-openchange-2.3-VULCAN/mapiproxy/libmapiproxy/fault_util.h.samba-4.2.0-rc2 2015-12-03 11:11:37.089140922 +0100
++++ openchange-openchange-2.3-VULCAN/mapiproxy/libmapiproxy/fault_util.h 2015-12-03 11:26:38.633103340 +0100
+@@ -28,7 +28,7 @@
+ * It will print information about the error and if is_fatal is true abort()
+ * will be called.
+ *
+- * DEBUG macro will be used to print a report with the following format:
++ * DEBUG macro will *not* be used to print a report with the following format:
+ * @code
+ * ==================================
+ * OPENCHANGE INTERNAL ERROR: pid 123
+@@ -59,9 +59,10 @@
+ * @see DEBUG()
+ */
+ #define OC_PANIC( is_fatal, body ) \
+- DEBUGSEP(0); \
+- DEBUG(0, ("OPENCHANGE INTERNAL ERROR: pid %d\n", (int)getpid())); \
+- DEBUG(0, body); \
++ fprintf(stderr,"\n"); \
++ fprintf(stderr, "OPENCHANGE INTERNAL ERROR: pid %d\n", (int)getpid()); \
++ fprintf(stderr, body); \
++ fflush(stderr); \
+ openchange_abort(is_fatal);
+
+ #ifndef __BEGIN_DECLS
+diff -up openchange-openchange-2.3-VULCAN/mapiproxy/libmapiproxy/mapi_handles.c.samba-4.2.0-rc2 openchange-openchange-2.3-VULCAN/mapiproxy/libmapiproxy/mapi_handles.c
+--- openchange-openchange-2.3-VULCAN/mapiproxy/libmapiproxy/mapi_handles.c.samba-4.2.0-rc2 2015-12-03 11:12:08.457139614 +0100
++++ openchange-openchange-2.3-VULCAN/mapiproxy/libmapiproxy/mapi_handles.c 2015-12-03 11:26:50.473102847 +0100
+@@ -429,7 +429,7 @@ static int mapi_handles_traverse_delete(
+ OC_DEBUG(5, "handles being released must NOT have child handles attached to them (%s is a child of %s)", handle_str, container_handle_str);
+ handle = strtol((const char *) handle_str, NULL, 16);
+ /* abort(); */
+- /* DEBUG(5, ("deleting child handle: %d, %s\n", handle, handle_str)); */
++ /* OC_DEBUG(5, ("deleting child handle: %d, %s\n", handle, handle_str)); */
+ mapi_handles_delete(handles_private->handles_ctx, handle);
+ }
+
diff --git a/openchange-2.3-covscan.patch b/openchange-2.3-covscan.patch
new file mode 100644
index 0000000..69b2890
--- /dev/null
+++ b/openchange-2.3-covscan.patch
@@ -0,0 +1,675 @@
+diff -up openchange-openchange-2.3-VULCAN/libexchange2ical/exchange2ical_property.c.covscan openchange-openchange-2.3-VULCAN/libexchange2ical/exchange2ical_property.c
+--- openchange-openchange-2.3-VULCAN/libexchange2ical/exchange2ical_property.c.covscan 2018-07-19 13:53:41.281450703 +0200
++++ openchange-openchange-2.3-VULCAN/libexchange2ical/exchange2ical_property.c 2018-07-19 13:53:41.285450703 +0200
+@@ -53,6 +53,7 @@ static void openchange_all_string_sub(ch
+ }
+ }
+
++#if 0
+ struct RRULE_byday {
+ uint16_t DayOfWeek;
+ const char *DayName;
+@@ -68,6 +69,7 @@ static const struct RRULE_byday RRULE_by
+ { 0x0006, "SA" },
+ { 0x0007, NULL }
+ };
++#endif
+
+ static const char *get_filename(const char *filename)
+ {
+diff -up openchange-openchange-2.3-VULCAN/libexchange2ical/exchange2ical_utils.c.covscan openchange-openchange-2.3-VULCAN/libexchange2ical/exchange2ical_utils.c
+--- openchange-openchange-2.3-VULCAN/libexchange2ical/exchange2ical_utils.c.covscan 2018-07-19 13:53:41.281450703 +0200
++++ openchange-openchange-2.3-VULCAN/libexchange2ical/exchange2ical_utils.c 2018-07-19 13:53:41.285450703 +0200
+@@ -232,7 +232,7 @@ uint32_t get_exchange_rdfDays_from_ical(
+
+ struct icaltimetype get_icaltimetype_from_tm(struct tm *tm)
+ {
+- struct icaltimetype tt;
++ struct icaltimetype tt = icaltime_null_time ();
+
+ tt.year = tm->tm_year+1900;
+ tt.month = tm->tm_mon+1;
+@@ -259,7 +259,7 @@ struct icaltimetype get_icaltimetype_fro
+
+ struct icaltimetype get_icaldate_from_tm(struct tm *tm)
+ {
+- struct icaltimetype tt;
++ struct icaltimetype tt = icaltime_null_time ();
+
+ tt.year = tm->tm_year+1900;
+ tt.month = tm->tm_mon+1;
+@@ -267,6 +267,7 @@ struct icaltimetype get_icaldate_from_tm
+ tt.hour = 0;
+ tt.minute = 0;
+ tt.second = 0;
++ tt.zone = NULL;
+
+ tt.is_date = 1;
+ tt.is_daylight = 0;
+@@ -292,7 +293,7 @@ struct tm *get_tm_from_FILETIME(const st
+
+ struct icaltimetype get_icaltime_from_FILETIME(const struct FILETIME *ft)
+ {
+- struct icaltimetype tt;
++ struct icaltimetype tt = icaltime_null_time ();
+ NTTIME nttime;
+ struct timeval temp_timeval;
+ struct tm *tm;
+@@ -317,7 +318,7 @@ struct icaltimetype get_icaltime_from_FI
+
+ struct icaltimetype get_icaltime_from_FILETIME_UTC(const struct FILETIME *ft)
+ {
+- struct icaltimetype tt;
++ struct icaltimetype tt = icaltime_null_time ();
+ NTTIME nttime;
+ struct timeval temp_timeval;
+ struct tm *tm;
+@@ -342,7 +343,7 @@ struct icaltimetype get_icaltime_from_FI
+
+ struct icaltimetype get_icaldate_from_FILETIME(const struct FILETIME *ft)
+ {
+- struct icaltimetype tt;
++ struct icaltimetype tt = icaltime_null_time ();
+ NTTIME nttime;
+ struct timeval temp_timeval;
+ struct tm *tm;
+@@ -373,7 +374,7 @@ struct icaltimetype get_icaldate_from_FI
+
+ struct icaltimetype get_icaldate_from_GlobalObjectId(struct GlobalObjectId *GlobalObjectId)
+ {
+- struct icaltimetype tt;
++ struct icaltimetype tt = icaltime_null_time ();
+ tt.year = GlobalObjectId->YH;
+ tt.year = tt.year <<8;
+ tt.year |= GlobalObjectId->YL;
+@@ -513,7 +514,10 @@ uint32_t get_minutes_from_icaltimetype(i
+ time_t time;
+ NTTIME nttime;
+ struct timeval t;
+-
++
++ if (icaltime_is_null_time(icaltime) || !icaltime_is_valid_time(icaltime))
++ return 0;
++
+ tm.tm_year = icaltime.year - 1900;
+ tm.tm_mon = icaltime.month - 1;
+ tm.tm_mday = icaltime.day;
+diff -up openchange-openchange-2.3-VULCAN/libexchange2ical/ical2exchange_property.c.covscan openchange-openchange-2.3-VULCAN/libexchange2ical/ical2exchange_property.c
+--- openchange-openchange-2.3-VULCAN/libexchange2ical/ical2exchange_property.c.covscan 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/libexchange2ical/ical2exchange_property.c 2018-07-19 13:53:41.286450703 +0200
+@@ -147,7 +147,6 @@ void ical2exchange_property_CATEGORIES(s
+ struct StringArray_r *sArray;
+ char **stringArray = NULL;
+ char string[256];
+- char *value;
+ char *tok;
+ icalproperty *categoriesProp;
+ uint32_t i = 0;
+@@ -160,8 +159,10 @@ void ical2exchange_property_CATEGORIES(s
+ categoriesProp = icalcomponent_get_first_property(ical2exchange->categoriesEvent, ICAL_CATEGORIES_PROPERTY);
+ sArray->cValues = 0;
+ while(categoriesProp){
+-
+- value = strdup(icalproperty_get_categories(categoriesProp));
++ const char *categories = icalproperty_get_categories(categoriesProp);
++ char *value;
++
++ value = strdup(categories ? categories : "");
+ tok = strtok(value, ",");
+ while(tok){
+ if(!stringArray){
+@@ -185,6 +186,7 @@ void ical2exchange_property_CATEGORIES(s
+ }
+ categoriesProp = icalcomponent_get_next_property(ical2exchange->categoriesEvent, ICAL_CATEGORIES_PROPERTY);
+
++ free(value);
+ }
+ sArray->lppszA= (const char **) stringArray;
+
+@@ -519,6 +521,7 @@ void ical2exchange_property_RRULE_EXDATE
+
+ ritr = icalrecur_iterator_new(irt,dtstart);
+ next=icalrecur_iterator_next(ritr);
++ last = icaltime_null_time();
+
+ while (!icaltime_is_null_time(next)){
+ last = next;
+diff -up openchange-openchange-2.3-VULCAN/libmapi++/examples/foldertree.cpp.covscan openchange-openchange-2.3-VULCAN/libmapi++/examples/foldertree.cpp
+--- openchange-openchange-2.3-VULCAN/libmapi++/examples/foldertree.cpp.covscan 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/libmapi++/examples/foldertree.cpp 2018-07-19 13:53:41.286450703 +0200
+@@ -65,12 +65,12 @@ int main ()
+ }
+
+ }
+- catch (libmapipp::mapi_exception e) // Catch any MAPI exceptions
++ catch (libmapipp::mapi_exception &e) // Catch any MAPI exceptions
+ {
+ std::cout << "MAPI Exception in main: " << e.what()
+ << std::endl;
+ }
+- catch (std::runtime_error e) // Catch any other runtime exceptions
++ catch (std::runtime_error &e) // Catch any other runtime exceptions
+ {
+ std::cout << "std::runtime_error exception in main: "
+ << e.what() << std::endl;
+diff -up openchange-openchange-2.3-VULCAN/libmapi++/examples/messages.cpp.covscan openchange-openchange-2.3-VULCAN/libmapi++/examples/messages.cpp
+--- openchange-openchange-2.3-VULCAN/libmapi++/examples/messages.cpp.covscan 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/libmapi++/examples/messages.cpp 2018-07-19 13:53:41.286450703 +0200
+@@ -61,12 +61,12 @@ int main ()
+ }
+ }
+ }
+- catch (libmapipp::mapi_exception e) // Catch any MAPI exceptions
++ catch (libmapipp::mapi_exception &e) // Catch any MAPI exceptions
+ {
+ std::cout << "MAPI Exception in main: " << e.what()
+ << std::endl;
+ }
+- catch (std::runtime_error e) // Catch any other runtime exceptions
++ catch (std::runtime_error &e) // Catch any other runtime exceptions
+ {
+ std::cout << "std::runtime_error exception in main: "
+ << e.what() << std::endl;
+diff -up openchange-openchange-2.3-VULCAN/libmapi/FXICS.c.covscan openchange-openchange-2.3-VULCAN/libmapi/FXICS.c
+--- openchange-openchange-2.3-VULCAN/libmapi/FXICS.c.covscan 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/libmapi/FXICS.c 2018-07-19 13:53:41.286450703 +0200
+@@ -800,6 +800,7 @@ _PUBLIC_ enum MAPISTATUS FXGetBuffer(map
+ if ((retval = mapi_object_get_logon_id(obj_source_context, &logon_id)) != MAPI_E_SUCCESS)
+ return retval;
+
++ memset(&request, 0, sizeof(struct FastTransferSourceGetBuffer_req));
+ mem_ctx = talloc_named(session, 0, "FXGetBuffer");
+ size = 0;
+
+diff -up openchange-openchange-2.3-VULCAN/libmapi/idset.c.covscan openchange-openchange-2.3-VULCAN/libmapi/idset.c
+--- openchange-openchange-2.3-VULCAN/libmapi/idset.c.covscan 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/libmapi/idset.c 2018-07-19 13:53:41.286450703 +0200
+@@ -383,6 +383,7 @@ _PUBLIC_ struct idset *IDSET_parse(TALLO
+ total_bytes += 16;
+ }
+
++ byte_count = 0;
+ globset.length = buffer.length - 16;
+ globset.data = (uint8_t *) buffer.data + 16;
+ idset->ranges = GLOBSET_parse(idset, globset, &idset->range_count, &byte_count);
+@@ -1182,7 +1183,8 @@ _PUBLIC_ void RAWIDSET_push_eid(struct r
+ }
+ else {
+ glob_idset = RAWIDSET_make(rawidset->mem_ctx, true, rawidset->single);
+- last_glob_idset->next = glob_idset;
++ if (last_glob_idset)
++ last_glob_idset->next = glob_idset;
+ }
+ glob_idset->repl.id = eid_id;
+ }
+diff -up openchange-openchange-2.3-VULCAN/libmapi/IMAPIProp.c.covscan openchange-openchange-2.3-VULCAN/libmapi/IMAPIProp.c
+--- openchange-openchange-2.3-VULCAN/libmapi/IMAPIProp.c.covscan 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/libmapi/IMAPIProp.c 2018-07-19 13:53:41.287450703 +0200
+@@ -1122,6 +1122,7 @@ _PUBLIC_ enum MAPISTATUS QueryNamedPrope
+ return retval;
+
+ /* Initialization */
++ memset(&request, 0, sizeof(struct QueryNamedProperties_req));
+ mem_ctx = talloc_named(session, 0, "QueryNamesFromIDs");
+ size = 0;
+
+diff -up openchange-openchange-2.3-VULCAN/libmapi/IMAPISupport.c.covscan openchange-openchange-2.3-VULCAN/libmapi/IMAPISupport.c
+--- openchange-openchange-2.3-VULCAN/libmapi/IMAPISupport.c.covscan 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/libmapi/IMAPISupport.c 2018-07-19 13:53:41.287450703 +0200
+@@ -101,6 +101,7 @@ _PUBLIC_ enum MAPISTATUS Subscribe(mapi_
+ if ((retval = mapi_object_get_logon_id(obj, &logon_id)) != MAPI_E_SUCCESS)
+ return retval;
+
++ memset(&request, 0, sizeof(struct RegisterNotification_req));
+ mem_ctx = talloc_named(session, 0, "Subscribe");
+
+ /* Fill the Subscribe operation */
+diff -up openchange-openchange-2.3-VULCAN/libmapi/IMessage.c.covscan openchange-openchange-2.3-VULCAN/libmapi/IMessage.c
+--- openchange-openchange-2.3-VULCAN/libmapi/IMessage.c.covscan 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/libmapi/IMessage.c 2018-07-19 13:53:41.287450703 +0200
+@@ -499,6 +499,8 @@ _PUBLIC_ enum MAPISTATUS SetRecipientTyp
+ enum MAPISTATUS retval;
+ struct SPropValue lpProp;
+
++ memset(&lpProp, 0, sizeof(struct SPropValue));
++
+ lpProp.ulPropTag = PR_RECIPIENT_TYPE;
+ lpProp.value.l = RecipClass;
+
+@@ -1648,6 +1650,7 @@ _PUBLIC_ enum MAPISTATUS OpenEmbeddedMes
+ if ((retval = mapi_object_get_logon_id(obj_attach, &logon_id)) != MAPI_E_SUCCESS)
+ return retval;
+
++ memset(&lpProp, 0, sizeof(struct SPropValue));
+ mem_ctx = talloc_named(session, 0, "OpenEmbeddedMessage");
+
+ /* Fill the OpenEmbeddedMessage request */
+diff -up openchange-openchange-2.3-VULCAN/libmapi/IStoreFolder.c.covscan openchange-openchange-2.3-VULCAN/libmapi/IStoreFolder.c
+--- openchange-openchange-2.3-VULCAN/libmapi/IStoreFolder.c.covscan 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/libmapi/IStoreFolder.c 2018-07-19 13:53:41.287450703 +0200
+@@ -93,6 +93,7 @@ _PUBLIC_ enum MAPISTATUS OpenMessage(map
+ if ((retval = mapi_object_get_logon_id(obj_store, &logon_id)) != MAPI_E_SUCCESS)
+ return retval;
+
++ memset(&lpProp, 0, sizeof(struct SPropValue));
+ mem_ctx = talloc_named(session, 0, "OpenMessage");
+
+ /* Fill the OpenMessage operation */
+@@ -232,6 +233,7 @@ _PUBLIC_ enum MAPISTATUS ReloadCachedInf
+ if ((retval = mapi_object_get_logon_id(obj_message, &logon_id)) != MAPI_E_SUCCESS)
+ return retval;
+
++ memset(&lpProp, 0, sizeof(struct SPropValue));
+ mem_ctx = talloc_named(session, 0, "ReloadCachedInformation");
+
+ /* Fill the ReloadCachedInformation operation */
+diff -up openchange-openchange-2.3-VULCAN/libmapi/IStream.c.covscan openchange-openchange-2.3-VULCAN/libmapi/IStream.c
+--- openchange-openchange-2.3-VULCAN/libmapi/IStream.c.covscan 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/libmapi/IStream.c 2018-07-19 13:53:41.287450703 +0200
+@@ -183,6 +183,7 @@ _PUBLIC_ enum MAPISTATUS ReadStream(mapi
+ if ((retval = mapi_object_get_logon_id(obj_stream, &logon_id)) != MAPI_E_SUCCESS)
+ return retval;
+
++ memset(&request, 0, sizeof(struct ReadStream_req));
+ mem_ctx = talloc_named(session, 0, "ReadStream");
+
+ *ByteRead = 0;
+diff -up openchange-openchange-2.3-VULCAN/libmapi++/src/folder.cpp.covscan openchange-openchange-2.3-VULCAN/libmapi++/src/folder.cpp
+--- openchange-openchange-2.3-VULCAN/libmapi++/src/folder.cpp.covscan 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/libmapi++/src/folder.cpp 2018-07-19 13:53:41.287450703 +0200
+@@ -57,7 +57,7 @@ folder::message_container_type folder::f
+ message_container.push_back(message_shared_ptr(new message(m_session,
+ m_id,
+ row_set.aRow[i].lpProps[1].value.d)));
+- } catch(mapi_exception e) {
++ } catch(mapi_exception &e) {
+ mapi_object_release(&contents_table);
+ throw;
+ }
+@@ -102,7 +102,7 @@ folder::hierarchy_container_type folder:
+ try {
+ hierarchy_container.push_back(folder_shared_ptr(new folder(*this,
+ row_set.aRow[i].lpProps[0].value.d)));
+- } catch(mapi_exception e) {
++ } catch(mapi_exception &e) {
+ mapi_object_release(&hierarchy_table);
+ throw;
+ }
+diff -up openchange-openchange-2.3-VULCAN/libmapi++/src/message.cpp.covscan openchange-openchange-2.3-VULCAN/libmapi++/src/message.cpp
+--- openchange-openchange-2.3-VULCAN/libmapi++/src/message.cpp.covscan 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/libmapi++/src/message.cpp 2018-07-19 13:53:41.287450703 +0200
+@@ -50,7 +50,7 @@ message::attachment_container_type messa
+ try {
+ attachment_container.push_back(attachment_shared_ptr(new attachment(*this, row_set.aRow[i].lpProps[0].value.l)));
+ }
+- catch(mapi_exception e) {
++ catch(mapi_exception &e) {
+ mapi_object_release(&attachment_table);
+ throw;
+ }
+diff -up openchange-openchange-2.3-VULCAN/libmapi++/src/session.cpp.covscan openchange-openchange-2.3-VULCAN/libmapi++/src/session.cpp
+--- openchange-openchange-2.3-VULCAN/libmapi++/src/session.cpp.covscan 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/libmapi++/src/session.cpp 2018-07-19 13:53:41.287450703 +0200
+@@ -61,7 +61,7 @@ void session::login(const std::string& p
+ if (m_profile_name == "") { // if profile is not set, try to get default profile
+ try {
+ m_profile_name = profile_database().get_default_profile_name();
+- } catch(mapi_exception e) {
++ } catch(mapi_exception &e) {
+ uninitialize();
+ throw;
+ }
+@@ -74,7 +74,7 @@ void session::login(const std::string& p
+
+ try {
+ m_message_store->open(m_session);
+- } catch (mapi_exception e) {
++ } catch (mapi_exception &e) {
+ throw;
+ }
+ }
+diff -up openchange-openchange-2.3-VULCAN/libmapi++/tests/attach_test.cpp.covscan openchange-openchange-2.3-VULCAN/libmapi++/tests/attach_test.cpp
+--- openchange-openchange-2.3-VULCAN/libmapi++/tests/attach_test.cpp.covscan 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/libmapi++/tests/attach_test.cpp 2018-07-19 13:53:41.287450703 +0200
+@@ -84,11 +84,11 @@ int main()
+
+ print_folder_tree(top_folder, mapi_session);
+ }
+- catch (mapi_exception e) // Catch any mapi exceptions
++ catch (mapi_exception &e) // Catch any mapi exceptions
+ {
+ cout << "MAPI Exception @ main: " << e.what() << endl;
+ }
+- catch (std::runtime_error e) // Catch runtime exceptions
++ catch (std::runtime_error &e) // Catch runtime exceptions
+ {
+ cout << "std::runtime_error exception @ main: " << e.what() << endl;
+ }
+diff -up openchange-openchange-2.3-VULCAN/libmapi++/tests/exception_test.cpp.covscan openchange-openchange-2.3-VULCAN/libmapi++/tests/exception_test.cpp
+--- openchange-openchange-2.3-VULCAN/libmapi++/tests/exception_test.cpp.covscan 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/libmapi++/tests/exception_test.cpp 2018-07-19 13:53:41.287450703 +0200
+@@ -12,7 +12,7 @@ int main()
+ try {
+ dotest();
+ }
+- catch (libmapipp::mapi_exception e) {
++ catch (libmapipp::mapi_exception &e) {
+ std::cout << e.what() << std::endl;
+ }
+
+diff -up openchange-openchange-2.3-VULCAN/libmapi++/tests/profile_test.cpp.covscan openchange-openchange-2.3-VULCAN/libmapi++/tests/profile_test.cpp
+--- openchange-openchange-2.3-VULCAN/libmapi++/tests/profile_test.cpp.covscan 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/libmapi++/tests/profile_test.cpp 2018-07-19 13:53:41.287450703 +0200
+@@ -27,15 +27,18 @@
+ #define PROFILEDB_NAME_TEMPLATE "/tmp/mapidbXXXXXX"
+ int main ()
+ {
++ char *tmpname = NULL, *tmpname2 = NULL;
++
+ try {
+ libmapipp::profile_database db;
+
+ std::cout << "default profile name: " << db.get_default_profile_name() << std::endl;
+
+ {
+- char *tmpname = (char*) calloc(sizeof(PROFILEDB_NAME_TEMPLATE) + 1, sizeof(char));
+- strncpy(tmpname, PROFILEDB_NAME_TEMPLATE, sizeof(PROFILEDB_NAME_TEMPLATE));
+- int ret = mkstemp(tmpname);
++ int ret;
++
++ tmpname = strdup(PROFILEDB_NAME_TEMPLATE);
++ ret = mkstemp(tmpname);
+ if (ret < 0) {
+ std::cout << "failed to create temporary file: " << strerror(errno) << std::endl;
+ }
+@@ -45,12 +48,15 @@ int main ()
+ std::cout << "failed to create a temporary profile store" << std::endl;
+ }
+ unlink(tmpname);
++ free(tmpname);
++ tmpname = NULL;
+ }
+
+ {
+- char *tmpname2 = (char*) calloc(sizeof(PROFILEDB_NAME_TEMPLATE) + 1, sizeof(char));
+- strncpy(tmpname2, PROFILEDB_NAME_TEMPLATE, sizeof(PROFILEDB_NAME_TEMPLATE));
+- int ret = mkstemp(tmpname2);
++ int ret;
++
++ tmpname2 = strdup(PROFILEDB_NAME_TEMPLATE);
++ ret = mkstemp(tmpname2);
+ if (ret < 0) {
+ std::cout << "failed to create temporary file: " << strerror(errno) << std::endl;
+ }
+@@ -60,19 +66,33 @@ int main ()
+ std::cout << "failed to create a temporary profile store with std::string" << std::endl;
+ }
+ unlink(tmpname2);
++ free(tmpname2);
++ tmpname2 = NULL;
+ }
+
+ std::cout << "finished profile and profile database tests" << std::endl;
+ }
+- catch (libmapipp::mapi_exception e) // Catch any mapi exceptions
++ catch (libmapipp::mapi_exception &e) // Catch any mapi exceptions
+ {
+ std::cout << "MAPI Exception @ main: " << e.what() << std::endl;
+ }
+- catch (std::runtime_error e) // Catch runtime exceptions
++ catch (std::runtime_error &e) // Catch runtime exceptions
+ {
+ std::cout << "std::runtime_error exception @ main: " << e.what() << std::endl;
+
+ }
+
++ if (tmpname) {
++ unlink(tmpname);
++ free(tmpname);
++ tmpname = NULL;
++ }
++
++ if (tmpname2) {
++ unlink(tmpname2);
++ free(tmpname2);
++ tmpname2 = NULL;
++ }
++
+ return 0;
+ }
+diff -up openchange-openchange-2.3-VULCAN/libmapi++/tests/test.cpp.covscan openchange-openchange-2.3-VULCAN/libmapi++/tests/test.cpp
+--- openchange-openchange-2.3-VULCAN/libmapi++/tests/test.cpp.covscan 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/libmapi++/tests/test.cpp 2018-07-19 13:53:41.288450703 +0200
+@@ -126,11 +126,11 @@ int main ()
+
+ cout << "finished session" << endl;
+ }
+- catch (mapi_exception e) // Catch any mapi exceptions
++ catch (mapi_exception &e) // Catch any mapi exceptions
+ {
+ cout << "MAPI Exception @ main: " << e.what() << endl;
+ }
+- catch (std::runtime_error e) // Catch runtime exceptions
++ catch (std::runtime_error &e) // Catch runtime exceptions
+ {
+ cout << "std::runtime_error exception @ main: " << e.what() << endl;
+
+diff -up openchange-openchange-2.3-VULCAN/libocpf/ocpf_api.c.covscan openchange-openchange-2.3-VULCAN/libocpf/ocpf_api.c
+--- openchange-openchange-2.3-VULCAN/libocpf/ocpf_api.c.covscan 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/libocpf/ocpf_api.c 2018-07-19 13:53:41.288450703 +0200
+@@ -316,6 +316,8 @@ int ocpf_propvalue(struct ocpf_context *
+ if (!ocpf || !ocpf->mem_ctx) return OCPF_ERROR;
+ if (!ctx) return OCPF_ERROR;
+
++ memset(&lpProps, 0, sizeof(struct SPropValue));
++
+ switch (scope) {
+ case kw_PROPERTY:
+ /* Sanity check: do not insert the same property twice */
+diff -up openchange-openchange-2.3-VULCAN/libocpf/ocpf_public.c.covscan openchange-openchange-2.3-VULCAN/libocpf/ocpf_public.c
+--- openchange-openchange-2.3-VULCAN/libocpf/ocpf_public.c.covscan 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/libocpf/ocpf_public.c 2018-07-19 13:53:41.288450703 +0200
+@@ -537,6 +537,8 @@ static bool set_external_recipients(TALL
+ uint32_t last;
+ struct SPropValue SPropValue;
+
++ memset(&SPropValue, 0, sizeof(struct SPropValue));
++
+ SRowSet->aRow = talloc_realloc(mem_ctx, SRowSet->aRow, struct SRow, SRowSet->cRows + 2);
+ last = SRowSet->cRows;
+ SRowSet->aRow[last].cValues = 0;
+@@ -626,6 +628,8 @@ _PUBLIC_ enum MAPISTATUS ocpf_set_Recipi
+
+ MAPI_RETVAL_IF(!ctx->recipients->cRows, MAPI_E_NOT_FOUND, NULL);
+
++ memset(&SPropValue, 0, sizeof(struct SPropValue));
++
+ SPropTagArray = set_SPropTagArray(mem_ctx, 0x8,
+ PidTagObjectType,
+ PidTagDisplayName,
+diff -up openchange-openchange-2.3-VULCAN/ndr_mapi.c.covscan openchange-openchange-2.3-VULCAN/ndr_mapi.c
+--- openchange-openchange-2.3-VULCAN/ndr_mapi.c.covscan 2018-07-19 13:53:41.276450703 +0200
++++ openchange-openchange-2.3-VULCAN/ndr_mapi.c 2018-07-19 13:53:41.288450703 +0200
+@@ -1310,8 +1310,11 @@ _PUBLIC_ enum ndr_err_code ndr_pull_EcDo
+ NDR_PULL_ALLOC(ndr, r->out.pulTimeStamp);
+ *r->out.pulTimeStamp = *r->in.pulTimeStamp;
+ NDR_PULL_ALLOC(ndr, r->out.pcbAuxOut);
+- *r->out.pcbAuxOut = *r->in.pcbAuxOut;
+- }
++ if (r->in.pcbAuxOut)
++ *r->out.pcbAuxOut = *r->in.pcbAuxOut;
++ else
++ *r->out.pcbAuxOut = 0;
++ }
+
+ if (flags & NDR_OUT) {
+ if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+diff -up openchange-openchange-2.3-VULCAN/script/makepropslist.py.covscan openchange-openchange-2.3-VULCAN/script/makepropslist.py
+--- openchange-openchange-2.3-VULCAN/script/makepropslist.py.covscan 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/script/makepropslist.py 2018-07-19 13:53:41.288450703 +0200
+@@ -992,7 +992,7 @@ def check_duplicate_alternative_names():
+ if previous_alternative_names.has_key(altname):
+ print "\tIn section", entry["OXPROPS_Sect"], ", alternative name:", altname, "duplicates name in section", previous_alternative_names[altname]
+ if previous_canonical_names.has_key(altname):
+- print "\tIn section", entry["OXPROPS_Sect"], ", alternative name:", altname, "duplicates canonical name in section", previous_alternative_names[altname]
++ print "\tIn section", entry["OXPROPS_Sect"], ", alternative name:", altname, "duplicates canonical name in section", previous_canonical_names[altname]
+ previous_alternative_names[altname] = (entry["OXPROPS_Sect"])
+
+ def check_duplicate_propids():
+diff -up openchange-openchange-2.3-VULCAN/testprogs/test_asyncnotif.c.covscan openchange-openchange-2.3-VULCAN/testprogs/test_asyncnotif.c
+--- openchange-openchange-2.3-VULCAN/testprogs/test_asyncnotif.c.covscan 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/testprogs/test_asyncnotif.c 2018-07-19 13:53:41.288450703 +0200
+@@ -109,12 +109,16 @@ static int callback(uint16_t Notificatio
+ break;
+ case fnevMbit|fnevObjectDeleted:
+ OC_DEBUG(0, "[+] Message deleted");
++ break;
+ case fnevMbit|fnevObjectModified:
+ OC_DEBUG(0, "[+] Message modified");
++ break;
+ case fnevMbit|fnevObjectMoved:
+ OC_DEBUG(0, "[+] Message moved");
++ break;
+ case fnevMbit|fnevObjectCopied:
+ OC_DEBUG(0, "[+] Message copied");
++ break;
+ case fnevMbit|fnevTableModified:
+ ctable = (struct ContentsTableChange *) NotificationData;
+ switch (ctable->TableEvent) {
+@@ -143,6 +147,7 @@ static int callback(uint16_t Notificatio
+ break;
+ case fnevMbit|fnevSbit|fnevObjectModified:
+ OC_DEBUG(0, "[+] A property on a message in a search folder has changed");
++ break;
+ case fnevMbit|fnevSbit|fnevTableModified:
+ stable = (struct ContentsTableChange *) NotificationData;
+ switch (stable->TableEvent) {
+@@ -250,6 +255,7 @@ int main(int argc, const char *argv[])
+
+ retval = MAPIInitialize(&mapi_ctx, opt_profdb);
+ if (retval != MAPI_E_SUCCESS) {
++ talloc_free(mem_ctx);
+ mapi_errstr("MAPIInitialize", retval);
+ exit (1);
+ }
+@@ -261,6 +267,10 @@ int main(int argc, const char *argv[])
+ SetMAPIDebugLevel(mapi_ctx, atoi(opt_debug));
+ }
+
++ mapi_object_init(&obj_store);
++ mapi_object_init(&obj_inbox);
++ mapi_object_init(&obj_contentstable);
++
+ /* if no profile is supplied use the default one */
+ if (!opt_profname) {
+ retval = GetDefaultProfile(mapi_ctx, &opt_profname);
+@@ -280,7 +290,6 @@ int main(int argc, const char *argv[])
+ }
+
+ /* Open the default message store */
+- mapi_object_init(&obj_store);
+
+ retval = OpenMsgStore(session, &obj_store);
+ if (retval != MAPI_E_SUCCESS) {
+@@ -292,11 +301,9 @@ int main(int argc, const char *argv[])
+ retval = GetReceiveFolder(&obj_store, &fid, NULL);
+ MAPI_RETVAL_IF(retval, retval, mem_ctx);
+
+- mapi_object_init(&obj_inbox);
+ retval = OpenFolder(&obj_store, fid, &obj_inbox);
+ MAPI_RETVAL_IF(retval, retval, mem_ctx);
+
+- mapi_object_init(&obj_contentstable);
+ retval = GetContentsTable(&obj_inbox, &obj_contentstable, 0, &count);
+ printf("mailbox contains %i messages\n", count);
+
+diff -up openchange-openchange-2.3-VULCAN/utils/mapipropsdump.c.covscan openchange-openchange-2.3-VULCAN/utils/mapipropsdump.c
+--- openchange-openchange-2.3-VULCAN/utils/mapipropsdump.c.covscan 2018-07-19 13:53:41.276450703 +0200
++++ openchange-openchange-2.3-VULCAN/utils/mapipropsdump.c 2018-07-19 13:53:41.289450703 +0200
+@@ -79,21 +79,21 @@
+ */
+
+
+-static const const struct ndr_interface_table *load_exchange_emsmdb_dso(const char *plugin)
++static const struct ndr_interface_table *load_exchange_emsmdb_dso(const char *plugin, void **phandle)
+ {
+ const struct ndr_interface_table *p;
+- void *handle;
+
+- handle = dlopen(plugin, RTLD_NOW);
+- if (handle == NULL) {
++ *phandle = dlopen(plugin, RTLD_NOW);
++ if (*phandle == NULL) {
+ printf("%s: Unable to open: %s\n", plugin, dlerror());
+ return NULL;
+ }
+
+- p = (const struct ndr_interface_table *) dlsym(handle, "ndr_table_exchange_emsmdb");
++ p = (const struct ndr_interface_table *) dlsym(*phandle, "ndr_table_exchange_emsmdb");
+ if (!p) {
+ OC_DEBUG(0, "%s: Unable to find DCE/RPC interface table for 'ndr_table_exchange_emsmdb': %s", plugin, dlerror());
+- dlclose(handle);
++ dlclose(*phandle);
++ *phandle = NULL;
+ return NULL;
+ }
+
+@@ -409,6 +409,7 @@ int main(int argc, const char *argv[])
+ struct SPropTagArray *s;
+ const char *opt_reqfile = NULL;
+ const char *opt_replfile = NULL;
++ void *plhandle = NULL;
+ poptContext pc;
+ int opt;
+ int index = -1;
+@@ -442,7 +443,7 @@ int main(int argc, const char *argv[])
+ exit (1);
+ }
+
+- p = load_exchange_emsmdb_dso(PLUGIN);
++ p = load_exchange_emsmdb_dso(PLUGIN, &plhandle);
+ if (!p) {
+ exit (1);
+ }
+@@ -454,6 +455,7 @@ int main(int argc, const char *argv[])
+ s = process_request(mem_ctx, f, opt_reqfile, &opnum, &index);
+ if (!s) {
+ talloc_free(mem_ctx);
++ dlclose(plhandle);
+ exit (1);
+ }
+
+@@ -461,9 +463,12 @@ int main(int argc, const char *argv[])
+ ret = process_response(mem_ctx, f, opt_replfile, s, opnum, index);
+ if (ret == -1) {
+ talloc_free(mem_ctx);
++ dlclose(plhandle);
+ exit (1);
+ }
+
+ talloc_free(mem_ctx);
++ dlclose(plhandle);
++
+ return (0);
+ }
+diff -up openchange-openchange-2.3-VULCAN/utils/openchangeclient.c.covscan openchange-openchange-2.3-VULCAN/utils/openchangeclient.c
+--- openchange-openchange-2.3-VULCAN/utils/openchangeclient.c.covscan 2018-07-19 13:53:41.277450703 +0200
++++ openchange-openchange-2.3-VULCAN/utils/openchangeclient.c 2018-07-19 13:53:41.289450703 +0200
+@@ -629,6 +629,8 @@ static bool set_external_recipients(TALL
+ uint32_t last;
+ struct SPropValue SPropValue;
+
++ memset(&SPropValue, 0, sizeof(struct SPropValue));
++
+ SRowSet->aRow = talloc_realloc(mem_ctx, SRowSet->aRow, struct SRow, SRowSet->cRows + 1);
+ last = SRowSet->cRows;
+ SRowSet->aRow[last].cValues = 0;
+@@ -821,6 +823,8 @@ static enum MAPISTATUS openchangeclient_
+ mapi_object_init(&obj_outbox);
+ mapi_object_init(&obj_message);
+
++ memset(&SPropValue, 0, sizeof(struct SPropValue));
++
+ if (oclient->pf == true) {
+ retval = openchangeclient_getpfdir(mem_ctx, obj_store, &obj_outbox, oclient->folder);
+ if (retval != MAPI_E_SUCCESS) return retval;
diff --git a/openchange-2.3-disable-mysql.patch b/openchange-2.3-disable-mysql.patch
new file mode 100644
index 0000000..c072ff4
--- /dev/null
+++ b/openchange-2.3-disable-mysql.patch
@@ -0,0 +1,81 @@
+diff -up openchange-openchange-2.3-VULCAN/configure.ac.disable-mysql openchange-openchange-2.3-VULCAN/configure.ac
+--- openchange-openchange-2.3-VULCAN/configure.ac.disable-mysql 2018-02-19 17:21:16.683135863 +0100
++++ openchange-openchange-2.3-VULCAN/configure.ac 2018-02-19 17:23:26.313134071 +0100
+@@ -50,22 +50,22 @@ AC_SUBST(ENDIAN)
+ dnl #################################################################
+ dnl MySQL
+ dnl #################################################################
+-AC_PATH_PROG(MYSQL_CONFIG, mysql_config)
+-if test x"$MYSQL_CONFIG" = x""; then
+- AC_MSG_WARN([No version of mysql_config was found!])
+- AC_MSG_ERROR([Please install libmysqlclient-dev])
+-fi
+-AC_SUBST(MYSQL_CONFIG)
+-
+-AC_MSG_CHECKING(mysql cflags)
+-MYSQL_CFLAGS=`$MYSQL_CONFIG --cflags`
+-AC_MSG_RESULT($MYSQL_CFLAGS)
+-AC_SUBST(MYSQL_CFLAGS)
+-
+-AC_MSG_CHECKING(mysql libs)
+-MYSQL_LIBS=`$MYSQL_CONFIG --libs`
+-AC_MSG_RESULT($MYSQL_LIBS)
+-AC_SUBST(MYSQL_LIBS)
++dnl AC_PATH_PROG(MYSQL_CONFIG, mysql_config)
++dnl if test x"$MYSQL_CONFIG" = x""; then
++dnl AC_MSG_WARN([No version of mysql_config was found!])
++dnl AC_MSG_ERROR([Please install libmysqlclient-dev])
++dnl fi
++dnl AC_SUBST(MYSQL_CONFIG)
++dnl
++dnl AC_MSG_CHECKING(mysql cflags)
++dnl MYSQL_CFLAGS=`$MYSQL_CONFIG --cflags`
++dnl AC_MSG_RESULT($MYSQL_CFLAGS)
++dnl AC_SUBST(MYSQL_CFLAGS)
++dnl
++dnl AC_MSG_CHECKING(mysql libs)
++dnl MYSQL_LIBS=`$MYSQL_CONFIG --libs`
++dnl AC_MSG_RESULT($MYSQL_LIBS)
++dnl AC_SUBST(MYSQL_LIBS)
+
+ dnl #################################################################
+ dnl Check for OS dependent options
+@@ -409,22 +409,22 @@ AC_SUBST(pythondir)
+ dnl ----------------------------------------------------------------------------
+ dnl Check for MYSQL client libraries
+ dnl ----------------------------------------------------------------------------
+-AC_PATH_PROG(MYSQL_CONFIG, mysql_config)
+-if test x"$MYSQL_CONFIG" = x""; then
+- AC_MSG_WARN([No version of mysql_config was found!])
+- AC_MSG_ERROR([Please install libmysqlclient-dev])
+-fi
+-AC_SUBST(MYSQL_CONFIG)
+-
+-AC_MSG_CHECKING(mysql cflags)
+-MYSQL_CFLAGS=`$MYSQL_CONFIG --cflags`
+-AC_MSG_RESULT($MYSQL_CFLAGS)
+-AC_SUBST(MYSQL_CFLAGS)
+-
+-AC_MSG_CHECKING(mysql libs)
+-MYSQL_LIBS=`$MYSQL_CONFIG --libs`
+-AC_MSG_RESULT($MYSQL_LIBS)
+-AC_SUBST(MYSQL_LIBS)
++dnl AC_PATH_PROG(MYSQL_CONFIG, mysql_config)
++dnl if test x"$MYSQL_CONFIG" = x""; then
++dnl AC_MSG_WARN([No version of mysql_config was found!])
++dnl AC_MSG_ERROR([Please install libmysqlclient-dev])
++dnl fi
++dnl AC_SUBST(MYSQL_CONFIG)
++dnl
++dnl AC_MSG_CHECKING(mysql cflags)
++dnl MYSQL_CFLAGS=`$MYSQL_CONFIG --cflags`
++dnl AC_MSG_RESULT($MYSQL_CFLAGS)
++dnl AC_SUBST(MYSQL_CFLAGS)
++dnl
++dnl AC_MSG_CHECKING(mysql libs)
++dnl MYSQL_LIBS=`$MYSQL_CONFIG --libs`
++dnl AC_MSG_RESULT($MYSQL_LIBS)
++dnl AC_SUBST(MYSQL_LIBS)
+
+ dnl ----------------------------------------------------------------------------
+ dnl Check for memcached
diff --git a/openchange-2.3-disable-python3.patch b/openchange-2.3-disable-python3.patch
new file mode 100644
index 0000000..91afa76
--- /dev/null
+++ b/openchange-2.3-disable-python3.patch
@@ -0,0 +1,106 @@
+diff -up openchange-openchange-2.3-VULCAN/configure.ac.drop-python openchange-openchange-2.3-VULCAN/configure.ac
+--- openchange-openchange-2.3-VULCAN/configure.ac.drop-python 2018-04-17 12:59:29.738652248 +0200
++++ openchange-openchange-2.3-VULCAN/configure.ac 2018-04-17 13:00:36.006651332 +0200
+@@ -376,36 +376,42 @@ AC_SUBST(PIDL)
+ dnl ---------------------------------------------------------------------------
+ dnl Check for Python
+ dnl ---------------------------------------------------------------------------
++dnl
++dnl AC_PATH_PROG(PYTHON, python3)
++dnl if test x"$PYTHON" = x""; then
++dnl AC_MSG_WARN([No version of python3 was found!])
++dnl AC_MSG_ERROR([Please install python3])
++dnl fi
++dnl AC_SUBST(PYTHON)
++dnl
++dnl AC_PATH_PROG(PYTHON_CONFIG, python3-config)
++dnl if test x"$PYTHON_CONFIG" = x""; then
++dnl AC_MSG_WARN([No version of python3-config was found!])
++dnl AC_MSG_ERROR([Please install python3-dev 3.x])
++dnl fi
++dnl AC_SUBST(PYTHON_CONFIG)
++dnl
++dnl AC_MSG_CHECKING(python cflags)
++dnl PYTHON_CFLAGS=`$PYTHON_CONFIG --cflags`
++dnl AC_MSG_RESULT($PYTHON_CFLAGS)
++dnl AC_SUBST(PYTHON_CFLAGS)
++dnl
++dnl AC_MSG_CHECKING(python libs)
++dnl PYTHON_LIBS=`$PYTHON_CONFIG --libs`
++dnl AC_MSG_RESULT($PYTHON_LIBS)
++dnl AC_SUBST(PYTHON_LIBS)
++dnl
++dnl AC_MSG_CHECKING(python library directory)
++dnl pythondir=`$PYTHON -c "from distutils import sysconfig; print sysconfig.get_python_lib(1, 0, '\\${prefix}')"`
++dnl AC_MSG_RESULT($pythondir)
++dnl AC_SUBST(pythondir)
+
+-AC_PATH_PROG(PYTHON, python3)
+-if test x"$PYTHON" = x""; then
+- AC_MSG_WARN([No version of python3 was found!])
+- AC_MSG_ERROR([Please install python3])
+-fi
+-AC_SUBST(PYTHON)
+-
+-AC_PATH_PROG(PYTHON_CONFIG, python3-config)
+-if test x"$PYTHON_CONFIG" = x""; then
+- AC_MSG_WARN([No version of python3-config was found!])
+- AC_MSG_ERROR([Please install python3-dev 3.x])
+-fi
+-AC_SUBST(PYTHON_CONFIG)
+-
+-AC_MSG_CHECKING(python cflags)
+-PYTHON_CFLAGS=`$PYTHON_CONFIG --cflags`
+-AC_MSG_RESULT($PYTHON_CFLAGS)
++PYTHON_CFLAGS=
+ AC_SUBST(PYTHON_CFLAGS)
+
+-AC_MSG_CHECKING(python libs)
+-PYTHON_LIBS=`$PYTHON_CONFIG --libs`
+-AC_MSG_RESULT($PYTHON_LIBS)
++PYTHON_LIBS=
+ AC_SUBST(PYTHON_LIBS)
+
+-AC_MSG_CHECKING(python library directory)
+-pythondir=`$PYTHON -c "from distutils import sysconfig; print sysconfig.get_python_lib(1, 0, '\\${prefix}')"`
+-AC_MSG_RESULT($pythondir)
+-AC_SUBST(pythondir)
+-
+ dnl ----------------------------------------------------------------------------
+ dnl Check for MYSQL client libraries
+ dnl ----------------------------------------------------------------------------
+@@ -759,11 +765,11 @@ AC_SUBST(OC_SERVER_UNINSTALL)
+ dnl ##########################################################################
+ dnl mapiproxy server
+ dnl ##########################################################################
+-if test x$PYTHON != x; then
+- if test "x$SAMDB_LIBS" != x -a "x$SAMBASERVER_LIBS" != x ; then
+- mapiproxy=1
+- fi
+-fi
++dnl if test x$PYTHON != x; then
++dnl if test "x$SAMDB_LIBS" != x -a "x$SAMBASERVER_LIBS" != x ; then
++dnl mapiproxy=1
++dnl fi
++dnl fi
+ OC_RULE_ADD(mapiproxy, SERVER)
+
+ AC_ARG_WITH(modulesdir,
+@@ -780,14 +786,15 @@ AC_ARG_ENABLE(pyopenchange, AC_HELP_STRI
+ [build Python bindings for libmapi]),
+ enable_pyopenchange="$enableval",
+ enable_pyopenchange=no)
+-PYCDIR=`$PYTHON -c "import distutils.sysconfig; print distutils.sysconfig.get_python_lib(1, prefix='\\$(prefix)')"`
+-AC_SUBST(PYCDIR)
+
+ PYOPENCHANGEALL=
+ PYOPENCHANGEINSTALL=
+ PYOPENCHANGEUNINSTALL=
+
+ if test x$enable_pyopenchange = xyes ; then
++ PYCDIR=`$PYTHON -c "import distutils.sysconfig; print distutils.sysconfig.get_python_lib(1, prefix='\\$(prefix)')"`
++ AC_SUBST(PYCDIR)
++
+ dnl Enable pyopenchange by default
+ PYOPENCHANGEALL="$PYOPENCHANGEALL pyopenchange"
+ PYOPENCHANGEINSTALL="$PYOPENCHANGEALLINSTALL pyopenchange-install"
diff --git a/openchange-2.3-disable-server-tools-build.patch b/openchange-2.3-disable-server-tools-build.patch
new file mode 100644
index 0000000..96323e2
--- /dev/null
+++ b/openchange-2.3-disable-server-tools-build.patch
@@ -0,0 +1,41 @@
+diff -up openchange-openchange-2.3-VULCAN/configure.ac.disable-server-tools-build openchange-openchange-2.3-VULCAN/configure.ac
+--- openchange-openchange-2.3-VULCAN/configure.ac.disable-server-tools-build 2015-11-27 08:30:31.481874706 +0100
++++ openchange-openchange-2.3-VULCAN/configure.ac 2015-11-27 08:33:39.769867245 +0100
+@@ -284,7 +284,7 @@ AC_SUBST(COVERAGE_INIT)
+ dnl ---------------------------------------------------------------------------
+ dnl Check for check (unittest library)
+ dnl ---------------------------------------------------------------------------
+-PKG_CHECK_MODULES(CHECK, check, [testsuite=1], [AC_MSG_WARN(Conditions unmet for unit testing support)])
++#PKG_CHECK_MODULES(CHECK, check, [testsuite=1], [AC_MSG_WARN(Conditions unmet for unit testing support)])
+ AC_SUBST(CHECK_CFLAGS)
+ AC_SUBST(CHECK_LIBS)
+ OC_RULE_ADD(testsuite, TESTSUITE)
+@@ -292,7 +292,7 @@ OC_RULE_ADD(testsuite, TESTSUITE)
+ dnl ---------------------------------------------------------------------------
+ dnl Check for nanomsg library (server notification)
+ dnl ---------------------------------------------------------------------------
+-PKG_CHECK_MODULES(NANOMSG, libnanomsg, [], [AC_MSG_ERROR(Install nanomsg library >= 0.5)])
++#PKG_CHECK_MODULES(NANOMSG, libnanomsg, [], [AC_MSG_ERROR(Install nanomsg library >= 0.5)])
+ AC_SUBST(NANOMSG_CFLAGS)
+ AC_SUBST(NANO_LIBS)
+
+@@ -698,16 +698,16 @@ AC_SUBST(MAPISTORE_TEST)
+ OC_RULE_ADD(openchangeclient, TOOLS)
+ #OC_RULE_ADD(mapistore_fsocpf, MAPISTORE)
+ OC_RULE_ADD(mapipropsdump, TOOLS)
+-OC_RULE_ADD(ocnotify, TOOLS)
++#OC_RULE_ADD(ocnotify, TOOLS)
+ OC_RULE_ADD(exchange2ical, TOOLS)
+-OC_RULE_ADD(rpcextract, TOOLS)
++#OC_RULE_ADD(rpcextract, TOOLS)
+ OC_RULE_ADD(openchangepfadmin, TOOLS)
+ OC_RULE_ADD(mapitest, TOOLS)
+ OC_RULE_ADD(mapiprofile, TOOLS)
+ OC_RULE_ADD(openchangemapidump, TOOLS)
+ OC_RULE_ADD(schemaIDGUID, TOOLS)
+
+-OC_RULE_ADD(check_fasttransfer, TOOLS)
++#OC_RULE_ADD(check_fasttransfer, TOOLS)
+ OC_RULE_ADD(test_asyncnotif, TOOLS)
+
+
diff --git a/openchange-2.3-fix-connection-args.patch b/openchange-2.3-fix-connection-args.patch
new file mode 100644
index 0000000..bfb9718
--- /dev/null
+++ b/openchange-2.3-fix-connection-args.patch
@@ -0,0 +1,38 @@
+diff -up openchange-openchange-2.3-VULCAN/libmapi/IMSProvider.c.fix-connection-args openchange-openchange-2.3-VULCAN/libmapi/IMSProvider.c
+--- openchange-openchange-2.3-VULCAN/libmapi/IMSProvider.c.fix-connection-args 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/libmapi/IMSProvider.c 2016-04-07 19:10:30.340959912 +0200
+@@ -91,6 +91,7 @@ static char *build_binding_string(struct
+ struct mapi_profile *profile)
+ {
+ char *binding;
++ bool any_string_added = false;
+
+ /* Sanity Checks */
+ if (!profile) return NULL;
+@@ -101,15 +102,23 @@ static char *build_binding_string(struct
+
+ /* If dump-data option is enabled */
+ if (mapi_ctx->dumpdata == true) {
+- binding = talloc_strdup_append(binding, "print,");
++ binding = talloc_strdup_append(binding, "print");
++ any_string_added = true;
+ }
+ /* If seal option is enabled in the profile */
+ if (profile->seal == true) {
+- binding = talloc_strdup_append(binding, "seal,");
++ if (any_string_added) {
++ binding = talloc_strdup_append(binding, ",");
++ }
++ binding = talloc_strdup_append(binding, "seal");
++ any_string_added = true;
+ }
+ /* If localaddress parameter is available in the profile */
+ if (profile->localaddr) {
+- binding = talloc_asprintf_append(binding, "localaddress=%s,", profile->localaddr);
++ if (any_string_added) {
++ binding = talloc_strdup_append(binding, ",");
++ }
++ binding = talloc_asprintf_append(binding, "localaddress=%s", profile->localaddr);
+ }
+
+ binding = talloc_strdup_append(binding, "]");
diff --git a/openchange-2.3-libical-3.0.patch b/openchange-2.3-libical-3.0.patch
new file mode 100644
index 0000000..ec0bfa6
--- /dev/null
+++ b/openchange-2.3-libical-3.0.patch
@@ -0,0 +1,88 @@
+diff -up openchange-openchange-2.3-VULCAN/libexchange2ical/exchange2ical_property.c.libical-3.0 openchange-openchange-2.3-VULCAN/libexchange2ical/exchange2ical_property.c
+--- openchange-openchange-2.3-VULCAN/libexchange2ical/exchange2ical_property.c.libical-3.0 2017-11-08 14:45:06.494302213 +0100
++++ openchange-openchange-2.3-VULCAN/libexchange2ical/exchange2ical_property.c 2017-11-08 14:47:33.465300181 +0100
+@@ -515,7 +515,7 @@ void ical_property_EXDATE(struct exchang
+ icalproperty_add_parameter(prop, tzid);
+ } else {
+ /*Get time from dtstart*/
+- icaltime.is_utc = 1;
++ icaltime.zone = icaltimezone_get_utc_timezone ();
+ if (exchange2ical->apptEndWhole){
+ dttime = get_icaltime_from_FILETIME_UTC(exchange2ical->apptStartWhole);
+ icaltime.hour = dttime.hour;
+diff -up openchange-openchange-2.3-VULCAN/libexchange2ical/exchange2ical_utils.c.libical-3.0 openchange-openchange-2.3-VULCAN/libexchange2ical/exchange2ical_utils.c
+--- openchange-openchange-2.3-VULCAN/libexchange2ical/exchange2ical_utils.c.libical-3.0 2017-11-08 14:45:43.123301706 +0100
++++ openchange-openchange-2.3-VULCAN/libexchange2ical/exchange2ical_utils.c 2017-11-08 14:47:31.873300203 +0100
+@@ -241,10 +241,9 @@ struct icaltimetype get_icaltimetype_fro
+ tt.minute = tm->tm_min;
+ tt.second = tm->tm_sec;
+
+- tt.is_utc = 0;
+ tt.is_date = 0;
+ tt.is_daylight = 0;
+- tt.zone = 0;
++ tt.zone = icaltimezone_get_utc_timezone ();
+
+ return tt;
+ }
+@@ -254,7 +253,6 @@ struct icaltimetype get_icaltimetype_fro
+ struct icaltimetype tt;
+
+ tt = get_icaltimetype_from_tm(tm);
+- tt.is_utc = 1;
+
+ return tt;
+ }
+@@ -270,10 +268,8 @@ struct icaltimetype get_icaldate_from_tm
+ tt.minute = 0;
+ tt.second = 0;
+
+- tt.is_utc = 1;
+ tt.is_date = 1;
+ tt.is_daylight = 0;
+- tt.zone = NULL;
+
+ return tt;
+ }
+@@ -313,7 +309,6 @@ struct icaltimetype get_icaltime_from_FI
+ tt.minute = tm->tm_min;
+ tt.second = tm->tm_sec;
+ tt.is_date = 0;
+- tt.is_utc = 0;
+ tt.is_daylight = 0;
+ tt.zone = NULL;
+
+@@ -339,9 +334,8 @@ struct icaltimetype get_icaltime_from_FI
+ tt.minute = tm->tm_min;
+ tt.second = tm->tm_sec;
+ tt.is_date = 0;
+- tt.is_utc = 1;
+ tt.is_daylight = 0;
+- tt.zone = NULL;
++ tt.zone = icaltimezone_get_utc_timezone ();
+
+ return tt;
+ }
+@@ -371,9 +365,8 @@ struct icaltimetype get_icaldate_from_FI
+ tt.minute = 0;
+ tt.second = 0;
+ tt.is_date = 1;
+- tt.is_utc = 1;
+ tt.is_daylight = 0;
+- tt.zone = NULL;
++ tt.zone = icaltimezone_get_utc_timezone ();
+
+ return tt;
+ }
+@@ -390,10 +383,9 @@ struct icaltimetype get_icaldate_from_Gl
+ tt.minute = 0;
+ tt.second = 0;
+
+- tt.is_utc = 1;
+ tt.is_date = 1;
+ tt.is_daylight = 0;
+- tt.zone = NULL;
++ tt.zone = icaltimezone_get_utc_timezone ();
+
+ return tt;
+ }
diff --git a/openchange-2.3-no-yyunput.patch b/openchange-2.3-no-yyunput.patch
new file mode 100644
index 0000000..aaa2ac8
--- /dev/null
+++ b/openchange-2.3-no-yyunput.patch
@@ -0,0 +1,12 @@
+diff -up openchange-openchange-2.3-VULCAN/libocpf/lex.l.no-yyunput openchange-openchange-2.3-VULCAN/libocpf/lex.l
+--- openchange-openchange-2.3-VULCAN/libocpf/lex.l.no-yyunput 2016-04-07 21:57:52.155596453 +0200
++++ openchange-openchange-2.3-VULCAN/libocpf/lex.l 2016-04-07 21:58:19.397595467 +0200
+@@ -29,7 +29,7 @@
+ #include "libocpf/lex.h"
+
+ #define YY_EXTRA_TYPE struct ocpf_context *
+-#define YY_NO_UNPUT
++/*#define YY_NO_UNPUT*/
+
+ static void unterminated(struct ocpf_context *, const char *, unsigned int);
+
diff --git a/openchange-2.3-samba-4.10-macros.patch b/openchange-2.3-samba-4.10-macros.patch
new file mode 100644
index 0000000..0e8e2b9
--- /dev/null
+++ b/openchange-2.3-samba-4.10-macros.patch
@@ -0,0 +1,159 @@
+diff -up openchange-openchange-2.3-VULCAN/libmapiadmin/mapiadmin_user.c.samba-4.10-macros openchange-openchange-2.3-VULCAN/libmapiadmin/mapiadmin_user.c
+--- openchange-openchange-2.3-VULCAN/libmapiadmin/mapiadmin_user.c.samba-4.10-macros 2019-02-14 15:19:53.317769411 +0100
++++ openchange-openchange-2.3-VULCAN/libmapiadmin/mapiadmin_user.c 2019-02-14 15:19:53.331769410 +0100
+@@ -39,6 +39,8 @@
+
+ #include
+
++#include "libmapi/libmapi_private.h"
++
+ static ssize_t openchange_sys_read(int fd, void *buf, size_t count)
+ {
+ ssize_t ret;
+@@ -101,7 +103,7 @@ static enum ndr_err_code openchange_ndr_
+ NDR_CHECK(ndr_push_uint8(ndr, NDR_SCALARS, r->sid_rev_num));
+ NDR_CHECK(ndr_push_int8(ndr, NDR_SCALARS, r->num_auths));
+ NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->id_auth, 6));
+- if (r->num_auths < 0 || r->num_auths > ARRAY_SIZE(r->sub_auths)) {
++ if (r->num_auths < 0 || r->num_auths > OC_ARRAY_SIZE(r->sub_auths)) {
+ return ndr_push_error(ndr, NDR_ERR_RANGE, "value out of range");
+ }
+ for (cntr_sub_auths_0 = 0; cntr_sub_auths_0 < r->num_auths; cntr_sub_auths_0++) {
+@@ -659,7 +661,7 @@ again:
+
+ OC_DEBUG(3, "Setting account password '%s'", mapiadmin_ctx->password);
+
+- ZERO_STRUCT(u);
++ OC_ZERO_STRUCT(u);
+ s.in.user_handle = &mapiadmin_ctx->user_ctx->user_handle;
+ s.in.info = &u;
+ s.in.level = 24;
+@@ -687,7 +689,7 @@ again:
+ }
+ }
+
+- ZERO_STRUCT(u);
++ OC_ZERO_STRUCT(u);
+ s.in.user_handle = &mapiadmin_ctx->user_ctx->user_handle;
+ s.in.info = &u;
+ s.in.level = 21;
+diff -up openchange-openchange-2.3-VULCAN/libmapi/libmapi_private.h.samba-4.10-macros openchange-openchange-2.3-VULCAN/libmapi/libmapi_private.h
+--- openchange-openchange-2.3-VULCAN/libmapi/libmapi_private.h.samba-4.10-macros 2019-02-14 15:19:53.313769411 +0100
++++ openchange-openchange-2.3-VULCAN/libmapi/libmapi_private.h 2019-02-14 15:19:53.331769410 +0100
+@@ -141,6 +141,11 @@ const char *libmapi_iface_best_ip(struc
+ bool libmapi_iface_is_local(struct interface *, const char *);
+ bool libmapi_iface_same_net(const char *, const char *, const char *);
+
++#define OC_ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x))
++#define OC_ZERO_STRUCTP(x) do { if ((x) != NULL) memset((char *)(x), 0, sizeof(*(x))); } while(0)
++#define OC_ZERO_STRUCTPN(x) memset((char *)(x), 0, sizeof(*(x)))
++#define OC_ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
++
+ __END_DECLS
+
+ #undef _PRINTF_ATTRIBUTE
+diff -up openchange-openchange-2.3-VULCAN/libmapi/socket/interface.c.samba-4.10-macros openchange-openchange-2.3-VULCAN/libmapi/socket/interface.c
+--- openchange-openchange-2.3-VULCAN/libmapi/socket/interface.c.samba-4.10-macros 2019-02-14 15:19:53.318769411 +0100
++++ openchange-openchange-2.3-VULCAN/libmapi/socket/interface.c 2019-02-14 15:19:53.331769410 +0100
+@@ -70,7 +70,7 @@ static void add_interface(TALLOC_CTX *me
+ if (iface == NULL)
+ return;
+
+- ZERO_STRUCTPN(iface);
++ OC_ZERO_STRUCTPN(iface);
+
+ iface->ip = ip;
+ iface->nmask = nmask;
+diff -up openchange-openchange-2.3-VULCAN/mapiproxy/dcesrv_mapiproxy.c.samba-4.10-macros openchange-openchange-2.3-VULCAN/mapiproxy/dcesrv_mapiproxy.c
+--- openchange-openchange-2.3-VULCAN/mapiproxy/dcesrv_mapiproxy.c.samba-4.10-macros 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/mapiproxy/dcesrv_mapiproxy.c 2019-02-14 15:19:53.331769410 +0100
+@@ -703,7 +703,7 @@ NTSTATUS dcerpc_server_mapiproxy_init(vo
+ NTSTATUS ret;
+ struct dcesrv_endpoint_server ep_server;
+
+- ZERO_STRUCT(ep_server);
++ OC_ZERO_STRUCT(ep_server);
+
+ /* Fill in our name */
+ ep_server.name = "mapiproxy";
+diff -up openchange-openchange-2.3-VULCAN/ndr_mapi.c.samba-4.10-macros openchange-openchange-2.3-VULCAN/ndr_mapi.c
+--- openchange-openchange-2.3-VULCAN/ndr_mapi.c.samba-4.10-macros 2019-02-14 15:19:53.329769410 +0100
++++ openchange-openchange-2.3-VULCAN/ndr_mapi.c 2019-02-14 15:19:53.331769410 +0100
+@@ -921,7 +921,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_EcDo
+ TALLOC_CTX *_mem_save_length_0;
+
+ if (flags & NDR_IN) {
+- ZERO_STRUCT(r->out);
++ OC_ZERO_STRUCT(r->out);
+
+ if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+ NDR_PULL_ALLOC(ndr, r->in.handle);
+@@ -961,7 +961,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_EcDo
+ NDR_PULL_ALLOC(ndr, r->out.handle);
+ *r->out.handle = *r->in.handle;
+ NDR_PULL_ALLOC(ndr, r->out.mapi_response);
+- ZERO_STRUCTP(r->out.mapi_response);
++ OC_ZERO_STRUCTP(r->out.mapi_response);
+ NDR_PULL_ALLOC(ndr, r->out.length);
+ *r->out.length = *r->in.length;
+ }
+@@ -1235,7 +1235,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_EcDo
+ TALLOC_CTX *_mem_save_rgbAuxOut_1;
+
+ if (flags & NDR_IN) {
+- ZERO_STRUCT(r->out);
++ OC_ZERO_STRUCT(r->out);
+
+ NDR_CHECK(ndr_pull_array_size(ndr, &r->in.szUserDN));
+ NDR_CHECK(ndr_pull_array_length(ndr, &r->in.szUserDN));
+@@ -1294,19 +1294,19 @@ _PUBLIC_ enum ndr_err_code ndr_pull_EcDo
+ }
+ NDR_PULL_SET_MEM_CTX(ndr, _mem_save_pcbAuxOut_0, LIBNDR_FLAG_REF_ALLOC);
+ NDR_PULL_ALLOC(ndr, r->out.handle);
+- ZERO_STRUCTP(r->out.handle);
++ OC_ZERO_STRUCTP(r->out.handle);
+ NDR_PULL_ALLOC(ndr, r->out.pcmsPollsMax);
+- ZERO_STRUCTP(r->out.pcmsPollsMax);
++ OC_ZERO_STRUCTP(r->out.pcmsPollsMax);
+ NDR_PULL_ALLOC(ndr, r->out.pcRetry);
+- ZERO_STRUCTP(r->out.pcRetry);
++ OC_ZERO_STRUCTP(r->out.pcRetry);
+ NDR_PULL_ALLOC(ndr, r->out.pcmsRetryDelay);
+- ZERO_STRUCTP(r->out.pcmsRetryDelay);
++ OC_ZERO_STRUCTP(r->out.pcmsRetryDelay);
+ NDR_PULL_ALLOC(ndr, r->out.picxr);
+- ZERO_STRUCTP(r->out.picxr);
++ OC_ZERO_STRUCTP(r->out.picxr);
+ NDR_PULL_ALLOC(ndr, r->out.szDNPrefix);
+- ZERO_STRUCTP(r->out.szDNPrefix);
++ OC_ZERO_STRUCTP(r->out.szDNPrefix);
+ NDR_PULL_ALLOC(ndr, r->out.szDisplayName);
+- ZERO_STRUCTP(r->out.szDisplayName);
++ OC_ZERO_STRUCTP(r->out.szDisplayName);
+ NDR_PULL_ALLOC(ndr, r->out.pulTimeStamp);
+ *r->out.pulTimeStamp = *r->in.pulTimeStamp;
+ NDR_PULL_ALLOC(ndr, r->out.pcbAuxOut);
+diff -up openchange-openchange-2.3-VULCAN/testsuite/libmapi/mapi_property.c.samba-4.10-macros openchange-openchange-2.3-VULCAN/testsuite/libmapi/mapi_property.c
+--- openchange-openchange-2.3-VULCAN/testsuite/libmapi/mapi_property.c.samba-4.10-macros 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/testsuite/libmapi/mapi_property.c 2019-02-14 15:19:53.331769410 +0100
+@@ -280,7 +280,7 @@ static void _make_test_srow(TALLOC_CTX *
+ {
+ struct SPropValue prop_val;
+
+- ZERO_STRUCT(prop_val);
++ OC_ZERO_STRUCT(prop_val);
+ /* PT_I8 */
+ prop_val.ulPropTag = PR_FID;
+ prop_val.value.d = 0x0123456789ABCDEFul;
+diff -up openchange-openchange-2.3-VULCAN/testsuite/libmapiproxy/openchangedb_logger.c.samba-4.10-macros openchange-openchange-2.3-VULCAN/testsuite/libmapiproxy/openchangedb_logger.c
+--- openchange-openchange-2.3-VULCAN/testsuite/libmapiproxy/openchangedb_logger.c.samba-4.10-macros 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/testsuite/libmapiproxy/openchangedb_logger.c 2019-02-14 15:19:53.332769410 +0100
+@@ -638,7 +638,7 @@ static void ocdb_logger_setup(void)
+ ck_abort();
+ }
+
+- ZERO_STRUCT(functions_called);
++ OC_ZERO_STRUCT(functions_called);
+ }
+
+ static void ocdb_logger_teardown(void)
diff --git a/openchange-2.3-samba-4.11.2.patch b/openchange-2.3-samba-4.11.2.patch
new file mode 100644
index 0000000..d564d94
--- /dev/null
+++ b/openchange-2.3-samba-4.11.2.patch
@@ -0,0 +1,34 @@
+diff -up openchange-openchange-2.3-VULCAN/libmapiadmin/libmapiadmin.h.samba-4.12 openchange-openchange-2.3-VULCAN/libmapiadmin/libmapiadmin.h
+--- openchange-openchange-2.3-VULCAN/libmapiadmin/libmapiadmin.h.samba-4.12 2020-01-27 11:33:02.941846935 +0100
++++ openchange-openchange-2.3-VULCAN/libmapiadmin/libmapiadmin.h 2020-01-27 11:33:19.170846710 +0100
+@@ -103,7 +103,9 @@ __BEGIN_DECLS
+ struct ldb_dn *samdb_search_dn(struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, const char *, ...) _PRINTF_ATTRIBUTE(4,5);
+ struct dom_sid *dom_sid_add_rid(TALLOC_CTX *, const struct dom_sid *, uint32_t);
+ bool encode_pw_buffer(uint8_t buffer[516], const char *, int);
++#if 0 /* removed in samba 4.12 */
+ void arcfour_crypt_blob(uint8_t *, int, const DATA_BLOB *);
++#endif
+
+ /* The following public definitions come from libmapiadmin/mapiadmin.c */
+ struct mapiadmin_ctx *mapiadmin_init(struct mapi_session *);
+diff -up openchange-openchange-2.3-VULCAN/libmapiadmin/mapiadmin_user.c.samba-4.12 openchange-openchange-2.3-VULCAN/libmapiadmin/mapiadmin_user.c
+--- openchange-openchange-2.3-VULCAN/libmapiadmin/mapiadmin_user.c.samba-4.12 2020-01-27 11:25:31.398853179 +0100
++++ openchange-openchange-2.3-VULCAN/libmapiadmin/mapiadmin_user.c 2020-01-27 11:31:27.490848255 +0100
+@@ -592,6 +592,9 @@ _PUBLIC_ enum MAPISTATUS mapiadmin_user_
+ */
+ _PUBLIC_ enum MAPISTATUS mapiadmin_user_add(struct mapiadmin_ctx *mapiadmin_ctx)
+ {
++ OC_DEBUG(3, "mapiadmin_user_add(): is disabled");
++ return MAPI_E_UNABLE_TO_COMPLETE;
++#if 0 /* disable it, use samba function directly, if needed (no 'arcfour_crypt_blob' in samba 4.12) */
+ TALLOC_CTX *mem_ctx;
+ NTSTATUS status;
+ enum MAPISTATUS retval;
+@@ -732,6 +735,7 @@ again:
+
+ talloc_free(mem_ctx);
+ return MAPI_E_SUCCESS;
++#endif
+ }
+
+ /**
diff --git a/openchange-2.3-samba-4.11.patch b/openchange-2.3-samba-4.11.patch
new file mode 100644
index 0000000..b95a21f
--- /dev/null
+++ b/openchange-2.3-samba-4.11.patch
@@ -0,0 +1,41 @@
+diff -up openchange-openchange-2.3-VULCAN/exchange.idl.samba-4.11 openchange-openchange-2.3-VULCAN/exchange.idl
+--- openchange-openchange-2.3-VULCAN/exchange.idl.samba-4.11 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/exchange.idl 2019-08-30 07:23:02.172309353 +0200
+@@ -465,12 +465,12 @@ System Attendant Private Interface
+ would otherwise break the data alignment on wire operations.
+ However, they must be defined here as they make use of the same array types. */
+
+- typedef [nopush,nopull,noprint] struct {
++ typedef [public] struct {
+ [range(0,100000)] uint32 cValues;
+ [size_is(cValues)] hyper *lpui8;
+ } UI8Array_r;
+
+- typedef [switch_type(uint32),nopush,nopull,noprint] union {
++ typedef [switch_type(uint32)] union {
+ [case(PT_I2)] uint16 i;
+ [case(PT_LONG)] uint32 l;
+ [case(PT_DOUBLE)] double dbl;
+@@ -495,19 +495,19 @@ System Attendant Private Interface
+ [case(PT_OBJECT)] uint32 object;
+ } SPropValue_CTR;
+
+- typedef [public,noprint,nopush,nopull] struct {
++ typedef [public] struct {
+ MAPITAGS ulPropTag;
+ uint32 dwAlignPad;
+ [switch_is(ulPropTag & 0xFFFF)] SPropValue_CTR value;
+ } SPropValue;
+
+- typedef [public,noprint,nopush,nopull] struct {
++ typedef [public] struct {
+ uint32 ulAdrEntryPad;
+ [range(0,100000)] uint32 cValues;
+ [size_is(cValues)]SPropValue *lpProps;
+ } SRow;
+
+- typedef [public,noprint,nopush,nopull] struct {
++ typedef [public] struct {
+ [range(0,100000)] uint32 cRows;
+ [size_is(cRows)] SRow aRow[];
+ } SRowSet;
diff --git a/openchange-2.3-samba-4.12.patch b/openchange-2.3-samba-4.12.patch
new file mode 100644
index 0000000..cbd37d7
--- /dev/null
+++ b/openchange-2.3-samba-4.12.patch
@@ -0,0 +1,51 @@
+diff -up openchange-openchange-2.3-VULCAN/ndr_mapi.c.samba-4.12 openchange-openchange-2.3-VULCAN/ndr_mapi.c
+--- openchange-openchange-2.3-VULCAN/ndr_mapi.c.samba-4.12 2020-01-27 11:04:07.136870938 +0100
++++ openchange-openchange-2.3-VULCAN/ndr_mapi.c 2020-01-27 11:12:29.978863985 +0100
+@@ -2151,7 +2151,11 @@ enum ndr_err_code ndr_push_RestrictionVa
+ uint32_t _flags_save_STRUCT = ndr->flags;
+ ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN);
+ if (ndr_flags & NDR_SCALARS) {
+- int level = ndr_push_get_switch_value(ndr, r);
++ uint32_t level = 0;
++
++ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_push_steal_switch_value(ndr, r, &level)))
++ level = 0;
++
+ switch (level) {
+ case 0x0: {
+ break; }
+@@ -2165,7 +2169,9 @@ enum ndr_err_code ndr_push_RestrictionVa
+ }
+ }
+ if (ndr_flags & NDR_BUFFERS) {
+- int level = ndr_push_get_switch_value(ndr, r);
++ uint32_t level;
++ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_push_steal_switch_value(ndr, r, &level)))
++ level = 0;
+ switch (level) {
+ case 0x0:
+ break;
+@@ -2187,9 +2193,10 @@ enum ndr_err_code ndr_push_RestrictionVa
+
+ enum ndr_err_code ndr_pull_RestrictionVariable(struct ndr_pull *ndr, int ndr_flags, union RestrictionVariable *r)
+ {
+- int level;
++ uint32_t level;
+ TALLOC_CTX *_mem_save_res_0;
+- level = ndr_pull_get_switch_value(ndr, r);
++ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_pull_steal_switch_value(ndr, r, &level)))
++ level = 0;
+ {
+ uint32_t _flags_save_STRUCT = ndr->flags;
+ ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN);
+@@ -2237,8 +2244,8 @@ enum ndr_err_code ndr_pull_RestrictionV
+
+ _PUBLIC_ void ndr_print_RestrictionVariable(struct ndr_print *ndr, const char *name, const union RestrictionVariable *r)
+ {
+- int level;
+- level = ndr_print_get_switch_value(ndr, r);
++ uint32_t level;
++ level = ndr_print_steal_switch_value(ndr, r);
+ ndr_print_union(ndr, name, level, "RestrictionVariable");
+ switch (level) {
+ case 0x0:
diff --git a/openchange-2.3-samba-4.13.patch b/openchange-2.3-samba-4.13.patch
new file mode 100644
index 0000000..7f0c342
--- /dev/null
+++ b/openchange-2.3-samba-4.13.patch
@@ -0,0 +1,40 @@
+diff -up openchange-openchange-2.3-VULCAN/libmapi/IProfAdmin.c.samba-4.13 openchange-openchange-2.3-VULCAN/libmapi/IProfAdmin.c
+--- openchange-openchange-2.3-VULCAN/libmapi/IProfAdmin.c.samba-4.13 2020-11-13 13:37:00.953428673 +0100
++++ openchange-openchange-2.3-VULCAN/libmapi/IProfAdmin.c 2020-11-13 13:38:36.541453531 +0100
+@@ -753,7 +753,7 @@ _PUBLIC_ enum MAPISTATUS OpenProfile(str
+ _PUBLIC_ enum MAPISTATUS LoadProfile(struct mapi_context *mapi_ctx,
+ struct mapi_profile *profile)
+ {
+- enum credentials_use_kerberos use_krb = CRED_AUTO_USE_KERBEROS;
++ enum credentials_use_kerberos use_krb = CRED_USE_KERBEROS_DESIRED;
+
+ /* Sanity checks */
+ OPENCHANGE_RETVAL_IF(!mapi_ctx, MAPI_E_NOT_INITIALIZED, NULL);
+@@ -777,9 +777,9 @@ _PUBLIC_ enum MAPISTATUS LoadProfile(str
+ * another API in the profile */
+ if (profile->kerberos) {
+ if (!strncmp(profile->kerberos, "yes", 3)) {
+- use_krb = CRED_MUST_USE_KERBEROS;
++ use_krb = CRED_USE_KERBEROS_REQUIRED;
+ } else {
+- use_krb = CRED_DONT_USE_KERBEROS;
++ use_krb = CRED_USE_KERBEROS_DISABLED;
+ }
+ }
+ /* additionally, don't set the username in the ccache if kerberos
+@@ -787,13 +787,13 @@ _PUBLIC_ enum MAPISTATUS LoadProfile(str
+ * credentials. cli_credentials_guess probably gets the right
+ * thing anyway in the situations where kerberos is in use */
+ if (profile->username && *(profile->username)
+- && use_krb != CRED_MUST_USE_KERBEROS) {
++ && use_krb != CRED_USE_KERBEROS_REQUIRED) {
+ cli_credentials_set_username(profile->credentials, profile->username, CRED_SPECIFIED);
+ }
+ if (profile->password && *(profile->password)) {
+ cli_credentials_set_password(profile->credentials, profile->password, CRED_SPECIFIED);
+ }
+- if (use_krb != CRED_AUTO_USE_KERBEROS) {
++ if (use_krb != CRED_USE_KERBEROS_DESIRED) {
+ cli_credentials_set_kerberos_state(profile->credentials, use_krb);
+ }
+
diff --git a/openchange-2.3-samba-4.15.patch b/openchange-2.3-samba-4.15.patch
new file mode 100644
index 0000000..13550d8
--- /dev/null
+++ b/openchange-2.3-samba-4.15.patch
@@ -0,0 +1,103 @@
+diff -up openchange-openchange-2.3-VULCAN/libmapi/IProfAdmin.c.samba-4.15 openchange-openchange-2.3-VULCAN/libmapi/IProfAdmin.c
+--- openchange-openchange-2.3-VULCAN/libmapi/IProfAdmin.c.samba-4.15 2021-07-19 12:26:37.615770488 +0200
++++ openchange-openchange-2.3-VULCAN/libmapi/IProfAdmin.c 2021-07-19 12:26:39.640771957 +0200
+@@ -794,7 +794,7 @@ _PUBLIC_ enum MAPISTATUS LoadProfile(str
+ cli_credentials_set_password(profile->credentials, profile->password, CRED_SPECIFIED);
+ }
+ if (use_krb != CRED_USE_KERBEROS_DESIRED) {
+- cli_credentials_set_kerberos_state(profile->credentials, use_krb);
++ cli_credentials_set_kerberos_state(profile->credentials, use_krb, CRED_SPECIFIED);
+ }
+
+ return MAPI_E_SUCCESS;
+diff -up openchange-openchange-2.3-VULCAN/ndr_mapi.c.samba-4.15 openchange-openchange-2.3-VULCAN/ndr_mapi.c
+--- openchange-openchange-2.3-VULCAN/ndr_mapi.c.samba-4.15 2021-07-19 12:59:29.801210983 +0200
++++ openchange-openchange-2.3-VULCAN/ndr_mapi.c 2021-07-19 13:07:49.382594567 +0200
+@@ -1235,15 +1235,18 @@ _PUBLIC_ enum ndr_err_code ndr_pull_EcDo
+ TALLOC_CTX *_mem_save_rgbAuxOut_1;
+
+ if (flags & NDR_IN) {
++ uint32_t array_length = 0, array_size = 0;
+ OC_ZERO_STRUCT(r->out);
+
+ NDR_CHECK(ndr_pull_array_size(ndr, &r->in.szUserDN));
+ NDR_CHECK(ndr_pull_array_length(ndr, &r->in.szUserDN));
+- if (ndr_get_array_length(ndr, &r->in.szUserDN) > ndr_get_array_size(ndr, &r->in.szUserDN)) {
+- return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->in.szUserDN), ndr_get_array_length(ndr, &r->in.szUserDN));
++ NDR_CHECK(ndr_get_array_length(ndr, &r->in.szUserDN, &array_length));
++ NDR_CHECK(ndr_get_array_size(ndr, &r->in.szUserDN, &array_size));
++ if (array_length > array_size) {
++ return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", array_size, array_length);
+ }
+- NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->in.szUserDN), sizeof(uint8_t)));
+- NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.szUserDN, ndr_get_array_length(ndr, &r->in.szUserDN), sizeof(uint8_t), CH_DOS));
++ NDR_CHECK(ndr_check_string_terminator(ndr, array_length, sizeof(uint8_t)));
++ NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.szUserDN, array_length, sizeof(uint8_t), CH_DOS));
+ NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.ulFlags));
+ NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.ulConMod));
+ NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.cbLimit));
+@@ -1317,6 +1320,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_EcDo
+ }
+
+ if (flags & NDR_OUT) {
++ uint32_t array_length = 0, array_size = 0;
+ if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+ NDR_PULL_ALLOC(ndr, r->out.handle);
+ }
+@@ -1366,11 +1370,13 @@ _PUBLIC_ enum ndr_err_code ndr_pull_EcDo
+ NDR_PULL_SET_MEM_CTX(ndr, *r->out.szDNPrefix, 0);
+ NDR_CHECK(ndr_pull_array_size(ndr, r->out.szDNPrefix));
+ NDR_CHECK(ndr_pull_array_length(ndr, r->out.szDNPrefix));
+- if (ndr_get_array_length(ndr, r->out.szDNPrefix) > ndr_get_array_size(ndr, r->out.szDNPrefix)) {
+- return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, r->out.szDNPrefix), ndr_get_array_length(ndr, r->out.szDNPrefix));
++ NDR_CHECK(ndr_get_array_length(ndr, r->out.szDNPrefix, &array_length));
++ NDR_CHECK(ndr_get_array_size(ndr, r->out.szDNPrefix, &array_size));
++ if (array_length > array_size) {
++ return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", array_size, array_length);
+ }
+- NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, r->out.szDNPrefix), sizeof(uint8_t)));
+- NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, r->out.szDNPrefix, ndr_get_array_length(ndr, r->out.szDNPrefix), sizeof(uint8_t), CH_DOS));
++ NDR_CHECK(ndr_check_string_terminator(ndr, array_length, sizeof(uint8_t)));
++ NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, r->out.szDNPrefix, array_length, sizeof(uint8_t), CH_DOS));
+ NDR_PULL_SET_MEM_CTX(ndr, _mem_save_szDNPrefix_1, 0);
+ }
+ NDR_PULL_SET_MEM_CTX(ndr, _mem_save_szDNPrefix_0, LIBNDR_FLAG_REF_ALLOC);
+@@ -1391,11 +1397,13 @@ _PUBLIC_ enum ndr_err_code ndr_pull_EcDo
+ NDR_PULL_SET_MEM_CTX(ndr, *r->out.szDisplayName, 0);
+ NDR_CHECK(ndr_pull_array_size(ndr, r->out.szDisplayName));
+ NDR_CHECK(ndr_pull_array_length(ndr, r->out.szDisplayName));
+- if (ndr_get_array_length(ndr, r->out.szDisplayName) > ndr_get_array_size(ndr, r->out.szDisplayName)) {
+- return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, r->out.szDisplayName), ndr_get_array_length(ndr, r->out.szDisplayName));
++ NDR_CHECK(ndr_get_array_length(ndr, r->out.szDisplayName, &array_length));
++ NDR_CHECK(ndr_get_array_size(ndr, r->out.szDisplayName, &array_size));
++ if (array_length > array_size) {
++ return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", array_size, array_length);
+ }
+- NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, r->out.szDisplayName), sizeof(uint8_t)));
+- NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, r->out.szDisplayName, ndr_get_array_length(ndr, r->out.szDisplayName), sizeof(uint8_t), CH_DOS));
++ NDR_CHECK(ndr_check_string_terminator(ndr, array_length, sizeof(uint8_t)));
++ NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, r->out.szDisplayName, array_length, sizeof(uint8_t), CH_DOS));
+ NDR_PULL_SET_MEM_CTX(ndr, _mem_save_szDisplayName_1, 0);
+ }
+ NDR_PULL_SET_MEM_CTX(ndr, _mem_save_szDisplayName_0, LIBNDR_FLAG_REF_ALLOC);
+@@ -1415,14 +1423,16 @@ _PUBLIC_ enum ndr_err_code ndr_pull_EcDo
+ NDR_PULL_SET_MEM_CTX(ndr, _mem_save_pulTimeStamp_0, LIBNDR_FLAG_REF_ALLOC);
+ NDR_CHECK(ndr_pull_array_size(ndr, &r->out.rgbAuxOut));
+ NDR_CHECK(ndr_pull_array_length(ndr, &r->out.rgbAuxOut));
+- if (ndr_get_array_length(ndr, &r->out.rgbAuxOut) > ndr_get_array_size(ndr, &r->out.rgbAuxOut)) {
+- return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->out.rgbAuxOut), ndr_get_array_length(ndr, &r->out.rgbAuxOut));
++ NDR_CHECK(ndr_get_array_length(ndr, &r->out.rgbAuxOut, &array_length));
++ NDR_CHECK(ndr_get_array_size(ndr, &r->out.rgbAuxOut, &array_size));
++ if (array_length > array_size) {
++ return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", array_size, array_length);
+ }
+ if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+- NDR_PULL_ALLOC_N(ndr, r->out.rgbAuxOut, ndr_get_array_size(ndr, &r->out.rgbAuxOut));
++ NDR_PULL_ALLOC_N(ndr, r->out.rgbAuxOut, array_size);
+ }
+ /* Only try to pull rgbAuxOut if the fake array size is > 0 */
+- if (ndr_get_array_size(ndr, &r->out.rgbAuxOut)) {
++ if (array_size) {
+ _mem_save_rgbAuxOut_1 = NDR_PULL_GET_MEM_CTX(ndr);
+ NDR_PULL_SET_MEM_CTX(ndr, r->out.rgbAuxOut, 0);
+ NDR_CHECK(ndr_pull_mapi2k7_AuxInfo(ndr, NDR_SCALARS, r->out.rgbAuxOut));
diff --git a/openchange-2.3-samba-4.4.patch b/openchange-2.3-samba-4.4.patch
new file mode 100644
index 0000000..20b9061
--- /dev/null
+++ b/openchange-2.3-samba-4.4.patch
@@ -0,0 +1,1077 @@
+diff -up openchange-openchange-2.3-VULCAN/configure.ac.samba44 openchange-openchange-2.3-VULCAN/configure.ac
+--- openchange-openchange-2.3-VULCAN/configure.ac.samba44 2016-02-09 11:51:31.089982153 +0100
++++ openchange-openchange-2.3-VULCAN/configure.ac 2016-02-09 12:04:55.985948047 +0100
+@@ -657,10 +657,11 @@ AC_CHECK_LIB([popt], [poptFreeContext],
+ enable_libpopt="no"
+ ])
+
++mapitest=0
+ if test x"$enable_libpopt" = x"yes"; then
+ if test x"$enable_libmapiadmin" = x"yes"; then
+ openchangepfadmin=1
+- mapitest=1
++ mapitest=0
+ fi
+
+ if test x"$enable_libocpf" = x"yes"; then
+@@ -692,7 +693,7 @@ OC_RULE_ADD(mapipropsdump, TOOLS)
+ OC_RULE_ADD(exchange2ical, TOOLS)
+ #OC_RULE_ADD(rpcextract, TOOLS)
+ OC_RULE_ADD(openchangepfadmin, TOOLS)
+-OC_RULE_ADD(mapitest, TOOLS)
++#OC_RULE_ADD(mapitest, TOOLS)
+ OC_RULE_ADD(mapiprofile, TOOLS)
+ OC_RULE_ADD(openchangemapidump, TOOLS)
+ OC_RULE_ADD(schemaIDGUID, TOOLS)
+diff -up openchange-openchange-2.3-VULCAN/libexchange2ical/exchange2ical_property.c.samba44 openchange-openchange-2.3-VULCAN/libexchange2ical/exchange2ical_property.c
+--- openchange-openchange-2.3-VULCAN/libexchange2ical/exchange2ical_property.c.samba44 2016-02-09 11:46:45.211994266 +0100
++++ openchange-openchange-2.3-VULCAN/libexchange2ical/exchange2ical_property.c 2016-02-09 12:04:07.330950109 +0100
+@@ -22,6 +22,37 @@
+ #include "libexchange2ical/libexchange2ical.h"
+ #include
+
++static void openchange_all_string_sub(char *s,const char *pattern,const char *insert, size_t len)
++{
++ char *p;
++ ssize_t ls,lp,li;
++
++ if (!insert || !pattern || !s)
++ return;
++
++ ls = (ssize_t)strlen(s);
++ lp = (ssize_t)strlen(pattern);
++ li = (ssize_t)strlen(insert);
++
++ if (!*pattern)
++ return;
++
++ if (len == 0)
++ len = ls + 1; /* len is number of *bytes* */
++
++ while (lp <= ls && (p = strstr_m(s,pattern))) {
++ if (ls + (li-lp) >= len) {
++ break;
++ }
++ if (li != lp) {
++ memmove(p+li,p+lp,strlen(p+lp)+1);
++ }
++ memcpy(p, insert, li);
++ s = p + li;
++ ls += (li-lp);
++ }
++}
++
+ struct RRULE_byday {
+ uint16_t DayOfWeek;
+ const char *DayName;
+@@ -1019,7 +1050,7 @@ void ical_property_RESOURCES(struct exch
+ if (!exchange2ical->NonSendableBcc) return;
+
+ NonSendableBcc = talloc_strdup(exchange2ical->mem_ctx, exchange2ical->NonSendableBcc);
+- all_string_sub(NonSendableBcc, ";", ",", 0);
++ openchange_all_string_sub(NonSendableBcc, ";", ",", 0);
+ prop = icalproperty_new_resources(NonSendableBcc);
+ icalcomponent_add_property(exchange2ical->vevent, prop);
+ talloc_free(NonSendableBcc);
+diff -up openchange-openchange-2.3-VULCAN/libmapiadmin/mapiadmin_user.c.samba44 openchange-openchange-2.3-VULCAN/libmapiadmin/mapiadmin_user.c
+--- openchange-openchange-2.3-VULCAN/libmapiadmin/mapiadmin_user.c.samba44 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/libmapiadmin/mapiadmin_user.c 2016-02-08 22:19:17.750956440 +0100
+@@ -24,19 +24,251 @@
+ along with this program. If not, see .
+ */
+
++#include
++
+ #include "libmapiadmin/libmapiadmin.h"
+
+ #include
+ #include
++#include
+ #include
+ #include
+-#include
+
+ #include
+ #include
+
+ #include
+
++static ssize_t openchange_sys_read(int fd, void *buf, size_t count)
++{
++ ssize_t ret;
++
++ do {
++ ret = read(fd, buf, count);
++ } while (ret == -1 && (errno == EINTR || errno == EAGAIN ||
++ errno == EWOULDBLOCK));
++
++ return ret;
++}
++
++static ssize_t openchange_read_data(int fd, void *buffer, size_t n)
++{
++ ssize_t nread;
++
++ nread = 0;
++
++ while (nread < n) {
++ ssize_t ret;
++ ret = openchange_sys_read(fd, ((char *)buffer) + nread, n - nread);
++ if (ret <= 0) {
++ return ret;
++ }
++ nread += ret;
++ }
++
++ return nread;
++}
++
++static int openchange_urand_fd = -1;
++static void openchange_open_urandom(void)
++{
++ if (openchange_urand_fd != -1) {
++ return;
++ }
++ openchange_urand_fd = open( "/dev/urandom", O_RDONLY,0);
++ if (openchange_urand_fd == -1) {
++ abort();
++ }
++}
++
++static void openchange_generate_random_buffer(uint8_t *out, int len)
++{
++ ssize_t rw_ret;
++
++ openchange_open_urandom();
++
++ rw_ret = openchange_read_data(openchange_urand_fd, out, len);
++ if (rw_ret != len) {
++ abort();
++ }
++}
++
++static enum ndr_err_code openchange_ndr_push_dom_sid(struct ndr_push *ndr, int ndr_flags, const struct dom_sid *r)
++{
++ uint32_t cntr_sub_auths_0;
++ if (ndr_flags & NDR_SCALARS) {
++ NDR_CHECK(ndr_push_align(ndr, 4));
++ NDR_CHECK(ndr_push_uint8(ndr, NDR_SCALARS, r->sid_rev_num));
++ NDR_CHECK(ndr_push_int8(ndr, NDR_SCALARS, r->num_auths));
++ NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->id_auth, 6));
++ if (r->num_auths < 0 || r->num_auths > ARRAY_SIZE(r->sub_auths)) {
++ return ndr_push_error(ndr, NDR_ERR_RANGE, "value out of range");
++ }
++ for (cntr_sub_auths_0 = 0; cntr_sub_auths_0 < r->num_auths; cntr_sub_auths_0++) {
++ NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->sub_auths[cntr_sub_auths_0]));
++ }
++ }
++ return NDR_ERR_SUCCESS;
++}
++
++static char *openchange_ldap_encode_ndr_dom_sid(TALLOC_CTX *mem_ctx, const struct dom_sid *sid)
++{
++#undef ldb_val
++ DATA_BLOB blob;
++ struct ldb_val val;
++ enum ndr_err_code ndr_err;
++ char *ret;
++ ndr_err = ndr_push_struct_blob(&blob, mem_ctx, sid,
++ (ndr_push_flags_fn_t)openchange_ndr_push_dom_sid);
++ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
++ return NULL;
++ }
++ val.data = blob.data;
++ val.length = blob.length;
++ ret = ldb_binary_encode(mem_ctx, val);
++ data_blob_free(&blob);
++ return ret;
++}
++
++static bool openchange_check_password_quality(const char *pwd)
++{
++ size_t ofs = 0;
++ size_t num_chars = 0;
++ size_t num_digits = 0;
++ size_t num_upper = 0;
++ size_t num_lower = 0;
++ size_t num_nonalpha = 0;
++ size_t num_unicode = 0;
++ size_t num_categories = 0;
++
++ if (pwd == NULL) {
++ return false;
++ }
++
++ while (true) {
++ const char *s = &pwd[ofs];
++ size_t len = 0;
++ codepoint_t c;
++
++ c = next_codepoint(s, &len);
++ if (c == INVALID_CODEPOINT) {
++ return false;
++ } else if (c == 0) {
++ break;
++ }
++ ofs += len;
++ num_chars += 1;
++
++ if (len == 1) {
++ const char *na = "~!@#$%^&*_-+=`|\\(){}[]:;\"'<>,.?/";
++
++ if (isdigit(c)) {
++ num_digits += 1;
++ continue;
++ }
++
++ if (isupper(c)) {
++ num_upper += 1;
++ continue;
++ }
++
++ if (islower(c)) {
++ num_lower += 1;
++ continue;
++ }
++
++ if (strchr(na, c)) {
++ num_nonalpha += 1;
++ continue;
++ }
++
++ /*
++ * the rest does not belong to
++ * a category.
++ */
++ continue;
++ }
++
++ if (isupper_m(c)) {
++ num_upper += 1;
++ continue;
++ }
++
++ if (islower_m(c)) {
++ num_lower += 1;
++ continue;
++ }
++
++ /*
++ * Note: for now do not check if the unicode category is
++ * alphabetic character
++ *
++ * We would have to import the details from
++ * ftp://ftp.unicode.org/Public/6.3.0/ucd/UnicodeData-6.3.0d1.txt
++ */
++ num_unicode += 1;
++ continue;
++ }
++
++ if (num_digits > 0) {
++ num_categories += 1;
++ }
++ if (num_upper > 0) {
++ num_categories += 1;
++ }
++ if (num_lower > 0) {
++ num_categories += 1;
++ }
++ if (num_nonalpha > 0) {
++ num_categories += 1;
++ }
++ if (num_unicode > 0) {
++ num_categories += 1;
++ }
++
++ if (num_categories >= 3) {
++ return true;
++ }
++
++ return false;
++}
++
++static char *openchange_generate_random_str_list(TALLOC_CTX *mem_ctx, size_t len, const char *list)
++{
++ size_t i;
++ size_t list_len = strlen(list);
++
++ char *retstr = talloc_array(mem_ctx, char, len + 1);
++ if (!retstr) return NULL;
++
++ openchange_generate_random_buffer((uint8_t *)retstr, len);
++ for (i = 0; i < len; i++) {
++ retstr[i] = list[retstr[i] % list_len];
++ }
++ retstr[i] = '\0';
++
++ return retstr;
++}
++
++static char *openchange_generate_random_str(TALLOC_CTX *mem_ctx, size_t len)
++{
++ char *retstr;
++ const char *c_list = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+_-#.,";
++
++again:
++ retstr = openchange_generate_random_str_list(mem_ctx, len, c_list);
++ if (!retstr) return NULL;
++
++ /* we need to make sure the random string passes basic quality tests
++ or it might be rejected by windows as a password */
++ if (len >= 7 && !openchange_check_password_quality(retstr)) {
++ talloc_free(retstr);
++ goto again;
++ }
++
++ return retstr;
++}
++
+ /**
+ \file
+ User management functions for mapiadmin
+@@ -232,10 +464,10 @@ _PUBLIC_ enum MAPISTATUS mapiadmin_user_
+ /* Search the user_dn */
+ account_dn = samdb_search_dn(remote_ldb, mem_ctx, NULL,
+ "(&(objectSid=%s)(objectClass=user))",
+- ldap_encode_ndr_dom_sid(mem_ctx, dom_sid));
++ openchange_ldap_encode_ndr_dom_sid(mem_ctx, dom_sid));
+
+ ret = ldb_search(remote_ldb, mem_ctx, &res, account_dn, LDB_SCOPE_SUBTREE, dom_attrs, "(objectSid=%s)",
+- ldap_encode_ndr_dom_sid(mem_ctx, dom_sid));
++ openchange_ldap_encode_ndr_dom_sid(mem_ctx, dom_sid));
+ MAPI_RETVAL_IF(ret != LDB_SUCCESS, MAPI_E_NOT_FOUND, mem_ctx);
+ MAPI_RETVAL_IF(res->count != 1, MAPI_E_NOT_FOUND, mem_ctx);
+
+@@ -422,7 +654,7 @@ again:
+ }
+
+ if (!mapiadmin_ctx->password) {
+- mapiadmin_ctx->password = generate_random_str(mapiadmin_ctx->user_ctx, MAX(8, policy_min_pw_len));
++ mapiadmin_ctx->password = openchange_generate_random_str(mapiadmin_ctx->user_ctx, MAX(8, policy_min_pw_len));
+ }
+
+ OC_DEBUG(3, "Setting account password '%s'", mapiadmin_ctx->password);
+diff -up openchange-openchange-2.3-VULCAN/libmapi/mapidump.c.samba44 openchange-openchange-2.3-VULCAN/libmapi/mapidump.c
+--- openchange-openchange-2.3-VULCAN/libmapi/mapidump.c.samba44 2016-02-09 11:03:18.565104717 +0100
++++ openchange-openchange-2.3-VULCAN/libmapi/mapidump.c 2016-02-09 11:03:29.508104254 +0100
+@@ -119,7 +119,7 @@ _PUBLIC_ void mapidump_SPropValue(struct
+ data = get_SPropValue_data(&lpProp);
+ if (data) {
+ printf("%s%s:\n", sep?sep:"", proptag);
+- dump_data(0, ((const struct Binary_r *)data)->lpb, ((const struct Binary_r *)data)->cb);
++ oc_dump_data(0, ((const struct Binary_r *)data)->lpb, ((const struct Binary_r *)data)->cb);
+ } else {
+ printf("%s%s: (NULL)\n", sep?sep:"", proptag);
+ }
+@@ -153,7 +153,7 @@ _PUBLIC_ void mapidump_SPropValue(struct
+ printf("%s%s: ARRAY(%d)\n", sep?sep:"", proptag, BinaryArray_r->cValues);
+ for (i = 0; i < BinaryArray_r->cValues; i++) {
+ printf("\tPT_MV_BINARY [%d]:\n", i);
+- dump_data(0, BinaryArray_r->lpbin[i].lpb, BinaryArray_r->lpbin[i].cb);
++ oc_dump_data(0, BinaryArray_r->lpbin[i].lpb, BinaryArray_r->lpbin[i].cb);
+ }
+ break;
+ default:
+diff -up openchange-openchange-2.3-VULCAN/libmapi/mapi_object.c.samba44 openchange-openchange-2.3-VULCAN/libmapi/mapi_object.c
+--- openchange-openchange-2.3-VULCAN/libmapi/mapi_object.c.samba44 2016-02-09 11:02:57.062105628 +0100
++++ openchange-openchange-2.3-VULCAN/libmapi/mapi_object.c 2016-02-09 11:03:01.012105461 +0100
+@@ -412,7 +412,7 @@ _PUBLIC_ enum MAPISTATUS mapi_object_boo
+ while (bookmark) {
+ OC_DEBUG(0, "mapi_object_bookmark {");
+ OC_DEBUG(0, ".index == %u", bookmark->index);
+- dump_data(0, bookmark->bin.lpb, bookmark->bin.cb);
++ oc_dump_data(0, bookmark->bin.lpb, bookmark->bin.cb);
+ OC_DEBUG(0, "};");
+
+ bookmark = bookmark->next;
+diff -up openchange-openchange-2.3-VULCAN/libmapi/oc_log.c.samba44 openchange-openchange-2.3-VULCAN/libmapi/oc_log.c
+--- openchange-openchange-2.3-VULCAN/libmapi/oc_log.c.samba44 2016-02-09 10:49:20.292140237 +0100
++++ openchange-openchange-2.3-VULCAN/libmapi/oc_log.c 2016-02-09 11:30:13.912036271 +0100
+@@ -21,6 +21,12 @@
+
+ #include "libmapi/libmapi.h"
+ #include
++#include
++#include
++
++#ifndef MIN
++#define MIN(a,b) ((a)<(b)?(a):(b))
++#endif
+
+ int _oc_log_samba_level = 0;
+
+@@ -84,3 +90,119 @@ void oc_log_init_server(const char *prog
+ {
+ setup_logging(progname, DEBUG_FILE);
+ }
++
++void oc_panic(const char *why)
++{
++ if (why) {
++ fprintf(stderr, "PANIC: %s\n", why);
++ fflush(stderr);
++ }
++
++ abort();
++}
++static void oc_debugadd_cb(const char *buf, void *private_data)
++{
++ int *plevel = (int *)private_data;
++ if (plevel && *plevel <= _oc_log_samba_level) {
++ printf ("%s", buf);
++ }
++}
++
++static void oc_print_asc_cb(const uint8_t *buf, int len,
++ void (*cb)(const char *buf, void *private_data),
++ void *private_data)
++{
++ int i;
++ char s[2];
++ s[1] = 0;
++
++ for (i=0; i 0) &&
++ (len > i+16) &&
++ (memcmp(&buf[i], &empty, 16) == 0))
++ {
++ i +=16;
++ continue;
++ }
++
++ if (i i+16) &&
++ (memcmp(&buf[i], &empty, 16) == 0)) {
++ if (!skipped) {
++ cb("skipping zero buffer bytes\n",
++ private_data);
++ skipped = true;
++ }
++ }
++ }
++ }
++
++ if (i%16) {
++ int n;
++ n = 16 - (i%16);
++ cb(" ", private_data);
++ if (n>8) {
++ cb(" ", private_data);
++ }
++ while (n--) {
++ cb(" ", private_data);
++ }
++ n = MIN(8,i%16);
++ oc_print_asc_cb(&buf[i-(i%16)], n, cb, private_data);
++ cb(" ", private_data);
++ n = (i%16) - n;
++ if (n>0) {
++ oc_print_asc_cb(&buf[i-n], n, cb, private_data);
++ }
++ cb("\n", private_data);
++ }
++
++}
++
++void oc_dump_data(int level, const uint8_t *buf,int len)
++{
++ if (_oc_log_samba_level < level || !buf || !len)
++ return;
++
++ oc_dump_data_cb(buf, len, false, oc_debugadd_cb, &level);
++}
+diff -up openchange-openchange-2.3-VULCAN/libmapi/oc_log.h.samba44 openchange-openchange-2.3-VULCAN/libmapi/oc_log.h
+--- openchange-openchange-2.3-VULCAN/libmapi/oc_log.h.samba44 2016-02-09 10:49:16.132140414 +0100
++++ openchange-openchange-2.3-VULCAN/libmapi/oc_log.h 2016-02-09 10:51:57.121133592 +0100
+@@ -79,4 +79,7 @@ void oc_log_init_server(const char *prog
+
+ extern int _oc_log_samba_level; /* Private, do not change it other than by SetMAPIDebugLevel() */
+
++void oc_panic(const char *why);
++void oc_dump_data(int level, const uint8_t *buf,int len);
++
+ #endif /* _OC_LOG_H_ */
+diff -up openchange-openchange-2.3-VULCAN/libmapi/property.c.samba44 openchange-openchange-2.3-VULCAN/libmapi/property.c
+--- openchange-openchange-2.3-VULCAN/libmapi/property.c.samba44 2016-02-09 10:46:51.040146561 +0100
++++ openchange-openchange-2.3-VULCAN/libmapi/property.c 2016-02-09 10:48:47.626141621 +0100
+@@ -777,7 +777,7 @@ _PUBLIC_ void mapi_copy_spropvalues(TALL
+ // TODO: Replace this with OC_PANIC() macro when it gets visible in libmapi too
+ OC_DEBUG(0, "Unexpected multi-value property type: %s.",
+ get_proptag_name(source_value->ulPropTag));
+- smb_panic("Unexpected multi-value property type while copying 'struct SPropValue'");
++ oc_panic("Unexpected multi-value property type while copying 'struct SPropValue'");
+ }
+ }
+ }
+diff -up openchange-openchange-2.3-VULCAN/libmapi/socket/interface.c.samba44 openchange-openchange-2.3-VULCAN/libmapi/socket/interface.c
+--- openchange-openchange-2.3-VULCAN/libmapi/socket/interface.c.samba44 2016-02-09 11:09:43.147088421 +0100
++++ openchange-openchange-2.3-VULCAN/libmapi/socket/interface.c 2016-02-09 11:31:47.664032298 +0100
+@@ -90,6 +90,213 @@ static void add_interface(TALLOC_CTX *me
+ OC_DEBUG(2, "added interface ip=%s nmask=%s", iface->ip_s, iface->nmask_s);
+ }
+
++enum oc_protocol_types {
++ PROTOCOL_DEFAULT=-1,
++ PROTOCOL_NONE=0,
++ PROTOCOL_CORE,
++ PROTOCOL_COREPLUS,
++ PROTOCOL_LANMAN1,
++ PROTOCOL_LANMAN2,
++ PROTOCOL_NT1,
++ PROTOCOL_SMB2_02,
++ PROTOCOL_SMB2_10,
++ PROTOCOL_SMB2_22,
++ PROTOCOL_SMB2_24,
++ PROTOCOL_SMB3_00,
++ PROTOCOL_SMB3_02,
++ PROTOCOL_SMB3_10,
++ PROTOCOL_SMB3_11
++};
++
++static int openchange_null_match(const char *p)
++{
++ for (;*p;p++) {
++ if (*p != '*' &&
++ *p != '<' &&
++ *p != '"' &&
++ *p != '>') return -1;
++ }
++ return 0;
++}
++
++/*
++ the max_n structure is purely for efficiency, it doesn't contribute
++ to the matching algorithm except by ensuring that the algorithm does
++ not grow exponentially
++*/
++struct max_n {
++ const char *predot;
++ const char *postdot;
++};
++
++
++/*
++ p and n are the pattern and string being matched. The max_n array is
++ an optimisation only. The ldot pointer is NULL if the string does
++ not contain a '.', otherwise it points at the last dot in 'n'.
++*/
++static int openchange_ms_fnmatch_core(const char *p, const char *n,
++ struct max_n *max_n, const char *ldot)
++{
++ codepoint_t c, c2;
++ int i;
++ size_t size, size_n;
++
++ while ((c = next_codepoint(p, &size))) {
++ p += size;
++
++ switch (c) {
++ case '*':
++ /* a '*' matches zero or more characters of any type */
++ if (max_n->predot && max_n->predot <= n) {
++ return openchange_null_match(p);
++ }
++ for (i=0; n[i]; i += size_n) {
++ next_codepoint(n+i, &size_n);
++ if (openchange_ms_fnmatch_core(p, n+i, max_n+1, ldot) == 0) {
++ return 0;
++ }
++ }
++ if (!max_n->predot || max_n->predot > n) max_n->predot = n;
++ return openchange_null_match(p);
++
++ case '<':
++ /* a '<' matches zero or more characters of
++ any type, but stops matching at the last
++ '.' in the string. */
++ if (max_n->predot && max_n->predot <= n) {
++ return openchange_null_match(p);
++ }
++ if (max_n->postdot && max_n->postdot <= n && n <= ldot) {
++ return -1;
++ }
++ for (i=0; n[i]; i += size_n) {
++ next_codepoint(n+i, &size_n);
++ if (openchange_ms_fnmatch_core(p, n+i, max_n+1, ldot) == 0) return 0;
++ if (n+i == ldot) {
++ if (openchange_ms_fnmatch_core(p, n+i+size_n, max_n+1, ldot) == 0) return 0;
++ if (!max_n->postdot || max_n->postdot > n) max_n->postdot = n;
++ return -1;
++ }
++ }
++ if (!max_n->predot || max_n->predot > n) max_n->predot = n;
++ return openchange_null_match(p);
++
++ case '?':
++ /* a '?' matches any single character */
++ if (! *n) {
++ return -1;
++ }
++ next_codepoint(n, &size_n);
++ n += size_n;
++ break;
++
++ case '>':
++ /* a '?' matches any single character, but
++ treats '.' specially */
++ if (n[0] == '.') {
++ if (! n[1] && openchange_null_match(p) == 0) {
++ return 0;
++ }
++ break;
++ }
++ if (! *n) return openchange_null_match(p);
++ next_codepoint(n, &size_n);
++ n += size_n;
++ break;
++
++ case '"':
++ /* a bit like a soft '.' */
++ if (*n == 0 && openchange_null_match(p) == 0) {
++ return 0;
++ }
++ if (*n != '.') return -1;
++ next_codepoint(n, &size_n);
++ n += size_n;
++ break;
++
++ default:
++ c2 = next_codepoint(n, &size_n);
++ if (c != c2 && codepoint_cmpi(c, c2) != 0) {
++ return -1;
++ }
++ n += size_n;
++ break;
++ }
++ }
++
++ if (! *n) {
++ return 0;
++ }
++
++ return -1;
++}
++
++static int openchange_ms_fnmatch_protocol(const char *pattern, const char *string, int protocol)
++{
++ int ret, count, i;
++ struct max_n *max_n = NULL;
++
++ if (strcmp(string, "..") == 0) {
++ string = ".";
++ }
++
++ if (strpbrk(pattern, "<>*?\"") == NULL) {
++ /* this is not just an optimisation - it is essential
++ for LANMAN1 correctness */
++ return strcasecmp_m(pattern, string);
++ }
++
++ if (protocol <= PROTOCOL_LANMAN2) {
++ char *p = talloc_strdup(NULL, pattern);
++ if (p == NULL) {
++ return -1;
++ }
++ /*
++ for older negotiated protocols it is possible to
++ translate the pattern to produce a "new style"
++ pattern that exactly matches w2k behaviour
++ */
++ for (i=0;p[i];i++) {
++ if (p[i] == '?') {
++ p[i] = '>';
++ } else if (p[i] == '.' &&
++ (p[i+1] == '?' ||
++ p[i+1] == '*' ||
++ p[i+1] == 0)) {
++ p[i] = '"';
++ } else if (p[i] == '*' &&
++ p[i+1] == '.') {
++ p[i] = '<';
++ }
++ }
++ ret = openchange_ms_fnmatch_protocol(p, string, PROTOCOL_NT1);
++ talloc_free(p);
++ return ret;
++ }
++
++ for (count=i=0;pattern[i];i++) {
++ if (pattern[i] == '*' || pattern[i] == '<') count++;
++ }
++
++ max_n = talloc_zero_array(NULL, struct max_n, count);
++ if (max_n == NULL) {
++ return -1;
++ }
++
++ ret = openchange_ms_fnmatch_core(pattern, string, max_n, strrchr(string, '.'));
++
++ talloc_free(max_n);
++
++ return ret;
++}
++
++
++/** a generic fnmatch function - uses for non-CIFS pattern matching */
++static int openchange_gen_fnmatch(const char *pattern, const char *string)
++{
++ return openchange_ms_fnmatch_protocol(pattern, string, PROTOCOL_NT1);
++}
+
+
+ /**
+@@ -119,7 +326,7 @@ static void interpret_interface(TALLOC_C
+
+ /* first check if it is an interface name */
+ for (i=0;i
+-
+ /* Expose samdb_connect prototype */
+ struct ldb_context *samdb_connect(TALLOC_CTX *, struct tevent_context *,
+ struct loadparm_context *,
+diff -up openchange-openchange-2.3-VULCAN/ndr_mapi.c.samba44 openchange-openchange-2.3-VULCAN/ndr_mapi.c
+--- openchange-openchange-2.3-VULCAN/ndr_mapi.c.samba44 2016-02-09 11:04:30.054101688 +0100
++++ openchange-openchange-2.3-VULCAN/ndr_mapi.c 2016-02-09 11:04:49.763100853 +0100
+@@ -1616,7 +1616,7 @@ _PUBLIC_ void ndr_print_EcDoRpcExt(struc
+ if (ndr_pull_mapi2k7_request(ndr_pull, NDR_SCALARS|NDR_BUFFERS, mapi_request) == NDR_ERR_SUCCESS) {
+ ndr_print_mapi2k7_request(ndr, "mapi_request", (const struct mapi2k7_request *)mapi_request);
+ } else {
+- dump_data(0, ndr_pull->data + ndr_pull->offset, ndr_pull->data_size - ndr_pull->offset);
++ oc_dump_data(0, ndr_pull->data + ndr_pull->offset, ndr_pull->data_size - ndr_pull->offset);
+ talloc_free(mapi_request);
+ break;
+ }
+@@ -1662,7 +1662,7 @@ _PUBLIC_ void ndr_print_EcDoRpcExt(struc
+ if (ndr_pull_mapi2k7_response(ndr_pull, NDR_SCALARS|NDR_BUFFERS, mapi_response) == NDR_ERR_SUCCESS) {
+ ndr_print_mapi2k7_response(ndr, "mapi_response", (const struct mapi2k7_response *)mapi_response);
+ } else {
+- dump_data(0, ndr_pull->data + ndr_pull->offset, ndr_pull->data_size - ndr_pull->offset);
++ oc_dump_data(0, ndr_pull->data + ndr_pull->offset, ndr_pull->data_size - ndr_pull->offset);
+ talloc_free(mapi_response);
+ break;
+ }
+@@ -1735,7 +1735,7 @@ _PUBLIC_ void ndr_print_EcDoRpcExt2(stru
+ if (ndr_pull_mapi2k7_request(ndr_pull, NDR_SCALARS|NDR_BUFFERS, mapi_request) == NDR_ERR_SUCCESS) {
+ ndr_print_mapi2k7_request(ndr, "mapi_request", (const struct mapi2k7_request *)mapi_request);
+ } else {
+- dump_data(0, ndr_pull->data + ndr_pull->offset, ndr_pull->data_size - ndr_pull->offset);
++ oc_dump_data(0, ndr_pull->data + ndr_pull->offset, ndr_pull->data_size - ndr_pull->offset);
+ talloc_free(mapi_request);
+ return;
+ }
+@@ -1786,7 +1786,7 @@ _PUBLIC_ void ndr_print_EcDoRpcExt2(stru
+ if (ndr_pull_mapi2k7_response(ndr_pull, NDR_SCALARS|NDR_BUFFERS, mapi_response) == NDR_ERR_SUCCESS) {
+ ndr_print_mapi2k7_response(ndr, "mapi_response", (const struct mapi2k7_response *)mapi_response);
+ } else {
+- dump_data(0, ndr_pull->data + ndr_pull->offset, ndr_pull->data_size - ndr_pull->offset);
++ oc_dump_data(0, ndr_pull->data + ndr_pull->offset, ndr_pull->data_size - ndr_pull->offset);
+ talloc_free(mapi_response);
+ break;
+ }
+@@ -2041,7 +2041,7 @@ _PUBLIC_ void ndr_print_SBinary_short(st
+ uint32_t _flags_save_STRUCT = ndr->flags;
+ ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN);
+ ndr->depth++;
+- dump_data(0, r->lpb, r->cb);
++ oc_dump_data(0, r->lpb, r->cb);
+ ndr->depth--;
+ ndr->flags = _flags_save_STRUCT;
+ }
+@@ -2054,7 +2054,7 @@ _PUBLIC_ void ndr_print_Binary_r(struct
+ uint32_t _flags_save_STRUCT = ndr->flags;
+ ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN);
+ ndr->depth++;
+- dump_data(0, r->lpb, r->cb);
++ oc_dump_data(0, r->lpb, r->cb);
+ ndr->depth--;
+ ndr->flags = _flags_save_STRUCT;
+ }
+diff -up openchange-openchange-2.3-VULCAN/utils/mapipropsdump.c.samba44 openchange-openchange-2.3-VULCAN/utils/mapipropsdump.c
+--- openchange-openchange-2.3-VULCAN/utils/mapipropsdump.c.samba44 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/utils/mapipropsdump.c 2016-02-09 10:35:42.207174902 +0100
+@@ -24,6 +24,9 @@
+ #include "gen_ndr/ndr_exchange.h"
+ #include
+ #include
++#include
++#include
++#include
+
+ #define PLUGIN "libmapi.so"
+ #define FUNCTION 0xB
+@@ -97,6 +100,51 @@ static const const struct ndr_interface_
+ return p;
+ }
+
++static char *openchange_fd_load(int fd, size_t *psize, size_t maxsize, TALLOC_CTX *mem_ctx)
++{
++ struct stat sbuf;
++ char *p;
++ size_t size;
++
++ if (fstat(fd, &sbuf) != 0) return NULL;
++
++ size = sbuf.st_size;
++
++ if (maxsize) {
++ size = size < maxsize ? size : maxsize;
++ }
++
++ p = (char *)talloc_size(mem_ctx, size+1);
++ if (!p) return NULL;
++
++ if (read(fd, p, size) != size) {
++ talloc_free(p);
++ return NULL;
++ }
++ p[size] = 0;
++
++ if (psize) *psize = size;
++
++ return p;
++}
++
++static char *openchange_file_load(const char *fname, size_t *size, size_t maxsize, TALLOC_CTX *mem_ctx)
++{
++ int fd;
++ char *p;
++
++ if (!fname || !*fname) return NULL;
++
++ fd = open(fname,O_RDONLY);
++ if (fd == -1) return NULL;
++
++ p = openchange_fd_load(fd, size, maxsize, mem_ctx);
++
++ close(fd);
++
++ return p;
++}
++
+ static struct SPropTagArray *process_request(TALLOC_CTX *mem_ctx,
+ const struct ndr_interface_call *f,
+ const char *filename,
+@@ -123,7 +171,7 @@ static struct SPropTagArray *process_req
+ return NULL;
+ }
+
+- data = (uint8_t *) file_load(filename, &size, 0, mem_ctx);
++ data = (uint8_t *) openchange_file_load(filename, &size, 0, mem_ctx);
+ if (!data) {
+ perror(filename);
+ return NULL;
+@@ -224,7 +272,7 @@ static int process_response(TALLOC_CTX *
+ return -1;
+ }
+
+- data = (uint8_t *) file_load(filename, &size, 0, mem_ctx);
++ data = (uint8_t *) openchange_file_load(filename, &size, 0, mem_ctx);
+ if (!data) {
+ perror(filename);
+ return -1;
+diff -up openchange-openchange-2.3-VULCAN/utils/mapitest/modules/module_lzxpress.c.samba44 openchange-openchange-2.3-VULCAN/utils/mapitest/modules/module_lzxpress.c
+--- openchange-openchange-2.3-VULCAN/utils/mapitest/modules/module_lzxpress.c.samba44 2016-02-09 11:06:00.717097846 +0100
++++ openchange-openchange-2.3-VULCAN/utils/mapitest/modules/module_lzxpress.c 2016-02-09 11:48:38.200989479 +0100
+@@ -19,11 +19,61 @@
+ along with this program. If not, see .
+ */
+
++#include
++#include
++#include
++
+ #include "utils/mapitest/mapitest.h"
+ #include "utils/mapitest/proto.h"
+ #include "gen_ndr/ndr_exchange.h"
++#include "libmapi/libmapi.h"
+ #include "libmapi/libmapi_private.h"
+
++static char *openchange_fd_load(int fd, size_t *psize, size_t maxsize, TALLOC_CTX *mem_ctx)
++{
++ struct stat sbuf;
++ char *p;
++ size_t size;
++
++ if (fstat(fd, &sbuf) != 0) return NULL;
++
++ size = sbuf.st_size;
++
++ if (maxsize) {
++ size = size < maxsize ? size : maxsize;
++ }
++
++ p = (char *)talloc_size(mem_ctx, size+1);
++ if (!p) return NULL;
++
++ if (read(fd, p, size) != size) {
++ talloc_free(p);
++ return NULL;
++ }
++ p[size] = 0;
++
++ if (psize) *psize = size;
++
++ return p;
++}
++
++static char *openchange_file_load(const char *fname, size_t *size, size_t maxsize, TALLOC_CTX *mem_ctx)
++{
++ int fd;
++ char *p;
++
++ if (!fname || !*fname) return NULL;
++
++ fd = open(fname,O_RDONLY);
++ if (fd == -1) return NULL;
++
++ p = openchange_fd_load(fd, size, maxsize, mem_ctx);
++
++ close(fd);
++
++ return p;
++}
++
+ /**
+ \file module_lzxpress.c
+
+@@ -51,7 +101,7 @@ _PUBLIC_ bool mapitest_lzxpress_validate
+ /* Step 1. Load Test File 001_Outlook_2007_in_ModifyRecipients_comp.dat */
+ filename = talloc_asprintf(mt->mem_ctx, "%s/001_Outlook_2007_in_ModifyRecipients_comp.dat", LZXPRESS_DATADIR);
+ /* filename = talloc_asprintf(mt->mem_ctx, "%s/002_Outlook_2007_in_Tables_operations_comp.dat", LZXPRESS_DATADIR); */
+- data = (uint8_t *)file_load(filename, &size, 0, mt->mem_ctx);
++ data = (uint8_t *)openchange_file_load(filename, &size, 0, mt->mem_ctx);
+ if (!data) {
+ perror(filename);
+ mapitest_print_retval_fmt(mt, "lzxpress_validate", "Error while loading %s", filename);
+@@ -137,12 +187,12 @@ _PUBLIC_ bool mapitest_lzxpress_validate
+
+ mapitest_print(mt, "Compressed rgbIn by Outlook\n");
+ mapitest_print(mt, "==============================\n");
+- dump_data(0, r.in.rgbIn, r.in.cbIn);
++ oc_dump_data(0, r.in.rgbIn, r.in.cbIn);
+ mapitest_print(mt, "==============================\n");
+
+ mapitest_print(mt, "Compressed rgbIn by OpenChange\n");
+ mapitest_print(mt, "==============================\n");
+- dump_data(0, ndr_rgbIn->data, ndr_rgbIn->offset);
++ oc_dump_data(0, ndr_rgbIn->data, ndr_rgbIn->offset);
+ mapitest_print(mt, "==============================\n");
+
+ talloc_free(ndr_rgbIn);
+diff -up openchange-openchange-2.3-VULCAN/utils/openchangeclient.c.samba44 openchange-openchange-2.3-VULCAN/utils/openchangeclient.c
+--- openchange-openchange-2.3-VULCAN/utils/openchangeclient.c.samba44 2015-05-16 17:22:04.000000000 +0200
++++ openchange-openchange-2.3-VULCAN/utils/openchangeclient.c 2016-02-08 22:24:59.212942206 +0100
+@@ -97,6 +97,52 @@ static void init_oclient(struct oclient
+ oclient->ocpf_dump = NULL;
+ }
+
++static char **openchange_str_list_make(TALLOC_CTX *mem_ctx, const char *string, const char *sep)
++{
++ int num_elements = 0;
++ char **ret = NULL;
++
++ if (sep == NULL) {
++ sep = " \t,\n\r";
++ }
++
++ ret = talloc_array(mem_ctx, char *, 1);
++ if (ret == NULL) {
++ return NULL;
++ }
++
++ while (string && *string) {
++ size_t len = strcspn(string, sep);
++ char **ret2;
++
++ if (len == 0) {
++ string += strspn(string, sep);
++ continue;
++ }
++
++ ret2 = talloc_realloc(mem_ctx, ret, char *,
++ num_elements+2);
++ if (ret2 == NULL) {
++ talloc_free(ret);
++ return NULL;
++ }
++ ret = ret2;
++
++ ret[num_elements] = talloc_strndup(ret, string, len);
++ if (ret[num_elements] == NULL) {
++ talloc_free(ret);
++ return NULL;
++ }
++
++ num_elements++;
++ string += len;
++ }
++
++ ret[num_elements] = NULL;
++
++ return ret;
++}
++
+ static enum MAPISTATUS openchangeclient_getdir(TALLOC_CTX *mem_ctx,
+ mapi_object_t *obj_container,
+ mapi_object_t *obj_child,
+@@ -115,7 +161,7 @@ static enum MAPISTATUS openchangeclient_
+ uint32_t i;
+
+ /* Step 1. Extract the folder list from full path */
+- folder = str_list_make(mem_ctx, path, "/");
++ folder = openchange_str_list_make(mem_ctx, path, "/");
+ mapi_object_copy(&obj_folder, obj_container);
+
+ for (i = 0; folder[i]; i++) {
diff --git a/openchange-2.3-switch-to-python3.patch b/openchange-2.3-switch-to-python3.patch
new file mode 100644
index 0000000..b781f5e
--- /dev/null
+++ b/openchange-2.3-switch-to-python3.patch
@@ -0,0 +1,27 @@
+diff -up openchange-openchange-2.3-VULCAN/configure.ac.switch-to-python3 openchange-openchange-2.3-VULCAN/configure.ac
+--- openchange-openchange-2.3-VULCAN/configure.ac.switch-to-python3 2018-04-17 13:51:55.977608741 +0200
++++ openchange-openchange-2.3-VULCAN/configure.ac 2018-04-17 13:54:21.958606722 +0200
+@@ -377,17 +377,17 @@ dnl ------------------------------------
+ dnl Check for Python
+ dnl ---------------------------------------------------------------------------
+
+-AC_PATH_PROG(PYTHON, python)
++AC_PATH_PROG(PYTHON, python3)
+ if test x"$PYTHON" = x""; then
+- AC_MSG_WARN([No version of python was found!])
+- AC_MSG_ERROR([Please install python])
++ AC_MSG_WARN([No version of python3 was found!])
++ AC_MSG_ERROR([Please install python3])
+ fi
+ AC_SUBST(PYTHON)
+
+-AC_PATH_PROG(PYTHON_CONFIG, python-config)
++AC_PATH_PROG(PYTHON_CONFIG, python3-config)
+ if test x"$PYTHON_CONFIG" = x""; then
+- AC_MSG_WARN([No version of python-config was found!])
+- AC_MSG_ERROR([Please install python-dev 2.7])
++ AC_MSG_WARN([No version of python3-config was found!])
++ AC_MSG_ERROR([Please install python3-dev 3.x])
+ fi
+ AC_SUBST(PYTHON_CONFIG)
+
diff --git a/openchange.spec b/openchange.spec
new file mode 100644
index 0000000..e27839f
--- /dev/null
+++ b/openchange.spec
@@ -0,0 +1,655 @@
+%global samba_version 4.2.0-2
+%global talloc_version 2.0.5
+%global nickname VULCAN
+
+# the python subpackage doesn't work, due to hard disable in patches for build requirements
+%global build_python_package 0
+%global built_mapitest 0
+
+%if 0%{?rhel}
+%global build_server_package 0
+%else
+# currently disabled also for rawhide (f18), due to samba4 changes
+%global build_server_package 0
+%endif
+
+%if %{build_python_package}
+%{!?python_sitearch: %global python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(1)")}
+%endif
+
+### Abstract ###
+
+# Licensing Note: The code is GPLv3+ and the IDL files are public domain.
+
+Name: openchange
+Version: 2.3
+Release: 29%{?dist}
+Group: Applications/System
+Summary: Provides access to Microsoft Exchange servers using native protocols
+License: GPLv3+ and Public Domain
+URL: http://www.openchange.org/
+Source0: https://github.com/openchange/openchange/archive/openchange-%{version}-%{nickname}.tar.gz
+Source1: doxygen_to_devhelp.xsl
+
+### Build Dependencies ###
+
+BuildRequires: autoconf
+BuildRequires: automake
+BuildRequires: bison
+BuildRequires: doxygen
+BuildRequires: file-devel
+BuildRequires: flex
+BuildRequires: gcc
+BuildRequires: gcc-c++
+BuildRequires: libical-devel
+BuildRequires: libldb-devel
+BuildRequires: libmemcached-devel
+BuildRequires: libtalloc-devel >= %{talloc_version}
+BuildRequires: libtdb-devel
+BuildRequires: pkgconfig
+BuildRequires: libxslt
+BuildRequires: popt-devel
+%if %{build_python_package}
+BuildRequires: python3-devel
+%endif
+BuildRequires: samba-common >= %{samba_version}
+BuildRequires: samba-devel >= %{samba_version}
+BuildRequires: samba-libs >= %{samba_version}
+BuildRequires: samba-pidl >= %{samba_version}
+BuildRequires: sqlite-devel
+BuildRequires: zlib-devel
+
+# Certain versions of libtevent have incorrect
+# internal ABI versions
+Conflicts: libtevent < 0.9.13
+
+### Patches ###
+
+# OpenChange's libmapi conflicts with Zarafa's libmapi.
+# Zarafa is older than OpenChange, so it wins.
+Patch0: libmapi-0.8.2-libmapi-conflict.patch
+
+# RH bug #552984
+Patch1: openchange-0.9-generate-xml-doc.patch
+
+# Do not build server and python parts
+Patch2: openchange-1.0-OC_RULE_ADD-fix.patch
+
+# RH-bug #1028698
+Patch4: openchange-1.0-symbol-clash.patch
+
+Patch5: openchange-2.2-samba-4.2.0-rc2.patch
+Patch6: openchange-2.3-disable-server-tools-build.patch
+Patch7: openchange-2.3-samba-4.4.patch
+Patch8: openchange-2.3-fix-connection-args.patch
+Patch9: openchange-2.3-no-yyunput.patch
+Patch10: openchange-2.3-libical-3.0.patch
+Patch11: openchange-2.3-disable-mysql.patch
+Patch12: openchange-2.3-switch-to-python3.patch
+%if !%{build_python_package}
+Patch13: openchange-2.3-disable-python3.patch
+%endif
+Patch14: openchange-2.3-covscan.patch
+Patch15: openchange-2.3-samba-4.10-macros.patch
+Patch16: openchange-2.3-samba-4.11.patch
+Patch17: openchange-2.3-samba-4.11.2.patch
+Patch18: openchange-2.3-samba-4.12.patch
+Patch19: openchange-2.3-samba-4.13.patch
+Patch20: openchange-2.3-samba-4.15.patch
+
+%description
+OpenChange provides libraries to access Microsoft Exchange servers
+using native protocols.
+
+%package devel
+Summary: Developer tools for OpenChange libraries
+Group: Development/Libraries
+Requires: openchange = %{version}-%{release}
+%if %{build_server_package}
+Requires: openchange-server = %{version}-%{release}
+%endif
+
+%description devel
+This package provides the development tools and headers for
+OpenChange, providing libraries to access Microsoft Exchange servers
+using native protocols.
+
+%package devel-docs
+Summary: Developer documentation for OpenChange libraries
+Group: Development/Libraries
+Requires: devhelp
+Requires: openchange = %{version}-%{release}
+BuildArch: noarch
+
+%description devel-docs
+This package contains developer documentation for Openchange.
+
+%package client
+Summary: User tools for OpenChange libraries
+Group: Applications/System
+Requires: openchange = %{version}-%{release}
+
+%description client
+This package provides the user tools for OpenChange, providing access to
+Microsoft Exchange servers using native protocols.
+
+%if %{build_python_package}
+%package python
+Summary: Python bindings for OpenChange libraries
+Group: Development/Libraries
+Requires: openchange = %{version}-%{release}
+
+%description python
+This module contains a wrapper that allows the use of OpenChange via Python.
+%endif
+
+%if %{build_server_package}
+%package server
+Summary: Server-side modules for OpenChange
+Group: Applications/System
+Requires: openchange = %{version}-%{release}
+Requires: sqlite
+
+%description server
+This package provides the server elements for OpenChange.
+%endif
+
+%prep
+%setup -q -n openchange-%{name}-%{version}-%{nickname}
+%patch0 -p1 -b .libmapi-conflict
+%patch1 -p1 -b .generate-xml-doc
+%patch2 -p1 -b .OC_RULE_ADD-fix
+%patch4 -p1 -b .symbol-clash
+%patch5 -p1 -b .samba-4.2.0-rc2
+%patch6 -p1 -b .disable-server-tools-build
+%patch7 -p1 -b .samba-4.4
+%patch8 -p1 -b .fix-connection-args
+%patch9 -p1 -b .no-yyunput
+%patch10 -p1 -b .libical-3.0
+%patch11 -p1 -b .disable-mysql
+%patch12 -p1 -b .switch-to-python3
+%if !%{build_python_package}
+%patch13 -p1 -b .disable-python3
+%endif
+%patch14 -p1 -b .covscan
+%patch15 -p1 -b .samba-4.10-macros
+%patch16 -p1 -b .samba-4.11
+%patch17 -p1 -b .samba-4.11.2
+%patch18 -p1 -b .samba-4.12
+%patch19 -p1 -b .samba-4.13
+%patch20 -p1 -b .samba-4.15
+
+%build
+./autogen.sh
+%configure \
+%if %{build_python_package}
+ --enable-pymapi \
+%endif
+ --with-modulesdir=%{_libdir}/samba/modules
+
+# Parallel builds prohibited by makefile
+make
+if test -d apidocs ; then
+ rm -r apidocs
+fi
+make doxygen
+
+xsltproc -o openchange-libmapi.devhelp --stringparam "booktitle" "MAPI client library (libmapi)" --stringparam "bookpart" "libmapi" %{SOURCE1} apidocs/xml/libmapi/index.xml
+xsltproc -o openchange-libmapiadmin.devhelp --stringparam "booktitle" "MAPI administration libraries (libmapiadmin)" --stringparam "bookpart" "libmapiadmin" %{SOURCE1} apidocs/xml/libmapiadmin/index.xml
+xsltproc -o openchange-libocpf.devhelp --stringparam "booktitle" "OpenChange Property Files (libocpf)" --stringparam "bookpart" "libocpf" %{SOURCE1} apidocs/xml/libocpf/index.xml
+%if %{built_mapitest}
+xsltproc -o openchange-mapitest.devhelp --stringparam "booktitle" "MA regression test framework (mapitest)" --stringparam "bookpart" "mapitest" %{SOURCE1} apidocs/xml/mapitest/index.xml
+%endif
+xsltproc -o openchange-mapiproxy.devhelp --stringparam "booktitle" "MAPIProxy project (mapiproxy)" --stringparam "bookpart" "mapiproxy" %{SOURCE1} apidocs/xml/mapiproxy/index.xml
+xsltproc -o openchange-libmapi++.devhelp --stringparam "booktitle" "C++ bindings for libmapi (libmapi++)" --stringparam "bookpart" "libmapi++" %{SOURCE1} apidocs/xml/libmapi++/index.xml
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+make install DESTDIR=$RPM_BUILD_ROOT
+
+# This makes the right links, as rpmlint requires that the
+# ldconfig-created links be recorded in the RPM.
+/sbin/ldconfig -N -n $RPM_BUILD_ROOT/%{_libdir}
+
+mkdir $RPM_BUILD_ROOT%{_mandir}
+cp -r doc/man/man1 $RPM_BUILD_ROOT%{_mandir}
+
+# Skip man3 for now, it doesn't work anyway
+# cp -r apidocs/man/man3 $RPM_BUILD_ROOT%{_mandir}
+rm -r apidocs/man/man3
+
+#%if ! %{build_python_package}
+#rm -r $RPM_BUILD_ROOT%{python3_sitearch}/openchange
+#%endif
+
+%if ! %{build_server_package}
+# XXX OC_RULE_ADD patch disables build of this, no need to delete it.
+#rm $RPM_BUILD_ROOT%{_libdir}/libmapiserver.so.*
+#rm -r $RPM_BUILD_ROOT%{_libdir}/samba/modules/*
+#rm $RPM_BUILD_ROOT%{_libdir}/samba/dcerpc_server/dcesrv_mapiproxy.so
+rm $RPM_BUILD_ROOT%{_libdir}/nagios/check_exchange
+rm -r $RPM_BUILD_ROOT%{_datadir}/setup/*
+%endif
+
+#%if !%{build_python_package} && !%{build_server_package}
+#rm $RPM_BUILD_ROOT%{_bindir}/check_fasttransfer
+#%endif
+
+mkdir -p $RPM_BUILD_ROOT%{_datadir}/devhelp/books/openchange-libmapi
+cp openchange-libmapi.devhelp $RPM_BUILD_ROOT%{_datadir}/devhelp/books/openchange-libmapi
+cp -r apidocs/html/libmapi/* $RPM_BUILD_ROOT%{_datadir}/devhelp/books/openchange-libmapi
+
+mkdir -p $RPM_BUILD_ROOT%{_datadir}/devhelp/books/openchange-libmapiadmin
+cp openchange-libmapiadmin.devhelp $RPM_BUILD_ROOT%{_datadir}/devhelp/books/openchange-libmapiadmin
+cp -r apidocs/html/libmapiadmin/* $RPM_BUILD_ROOT%{_datadir}/devhelp/books/openchange-libmapiadmin
+
+mkdir -p $RPM_BUILD_ROOT%{_datadir}/devhelp/books/openchange-libocpf
+cp openchange-libocpf.devhelp $RPM_BUILD_ROOT%{_datadir}/devhelp/books/openchange-libocpf
+cp -r apidocs/html/libocpf/* $RPM_BUILD_ROOT%{_datadir}/devhelp/books/openchange-libocpf
+
+%if %{built_mapitest}
+mkdir -p $RPM_BUILD_ROOT%{_datadir}/devhelp/books/openchange-mapitest
+cp openchange-mapitest.devhelp $RPM_BUILD_ROOT%{_datadir}/devhelp/books/openchange-mapitest
+cp -r apidocs/html/mapitest/* $RPM_BUILD_ROOT%{_datadir}/devhelp/books/openchange-mapitest
+%endif
+
+mkdir -p $RPM_BUILD_ROOT%{_datadir}/devhelp/books/openchange-mapiproxy
+cp openchange-mapiproxy.devhelp $RPM_BUILD_ROOT%{_datadir}/devhelp/books/openchange-mapiproxy
+cp -r apidocs/html/mapiproxy/* $RPM_BUILD_ROOT%{_datadir}/devhelp/books/openchange-mapiproxy
+
+mkdir -p $RPM_BUILD_ROOT%{_datadir}/devhelp/books/openchange-libmapi++
+cp openchange-libmapi++.devhelp $RPM_BUILD_ROOT%{_datadir}/devhelp/books/openchange-libmapi++
+cp -r apidocs/html/libmapi++/* $RPM_BUILD_ROOT%{_datadir}/devhelp/books/openchange-libmapi++
+
+%post -p /sbin/ldconfig
+
+%postun -p /sbin/ldconfig
+
+%if %{build_server_package}
+%post server -p /sbin/ldconfig
+
+%postun server -p /sbin/ldconfig
+%endif
+
+%files
+%doc COPYING IDL_LICENSE.txt VERSION
+%{_libdir}/libmapi-openchange.so.0
+%{_libdir}/libmapi-openchange.so.2.3
+%{_libdir}/libmapiadmin.so.0
+%{_libdir}/libmapiadmin.so.2.3
+%{_libdir}/libmapipp.so.0
+%{_libdir}/libmapipp.so.2.3
+%if %{build_server_package}
+%{_libdir}/libmapiproxy.so.0
+%{_libdir}/libmapiproxy.so.2.3
+%{_libdir}/libmapistore.so.0
+%{_libdir}/libmapistore.so.2.3
+%endif
+%{_libdir}/libocpf.so.0
+%{_libdir}/libocpf.so.2.3
+
+%files devel
+%{_includedir}/*
+%{_libdir}/*.so
+%{_libdir}/pkgconfig/*
+
+%files devel-docs
+#%%{_mandir}/man3/*
+%doc %{_datadir}/devhelp/books/*
+%doc apidocs/html/libmapi
+%doc apidocs/html/libocpf
+%doc apidocs/html/overview
+%doc apidocs/html/index.html
+
+%files client
+%{_bindir}/*
+%{_mandir}/man1/*
+%if %{built_mapitest}
+%{_datadir}/mapitest/*
+%endif
+
+%if %{build_python_package}
+%files python
+%{python3_sitearch}/openchange
+%endif
+
+%if %{build_server_package}
+%files server
+%{_libdir}/libmapiserver.so.*
+%{_libdir}/samba/dcerpc_server/dcesrv_mapiproxy.so
+%{_libdir}/samba/modules/*
+%if !0%{?rhel}
+%{_libdir}/nagios/check_exchange
+%endif
+%{_datadir}/setup/*
+%endif
+
+%changelog
+* Thu Nov 25 2021 Milan Crha - 2.3-29
+- Related: #2013596 - Rebuild for samba rebase to 4.15.x
+
+* Wed May 12 2021 Milan Crha - 2.3-28
+- Related: #1944657 - Rebuild for samba rebase to 4.14.4
+
+* Fri Nov 13 2020 Milan Crha - 2.3-27
+- Rebuild for newer samba
+
+* Mon Jun 08 2020 Milan Crha - 2.3-26
+- Add patch to build against samba 4.12
+
+* Mon Apr 20 2020 Milan Crha - 2.3-25
+- Add patch to build against samba 4.11.2
+
+* Mon Dec 02 2019 Milan Crha - 2.3-24
+- Rebuild for newer samba and libldb
+
+* Thu Jul 19 2018 Milan Crha - 2.3-23
+- Address some of the Coverity Scan and clang issues
+
+* Tue Apr 17 2018 Milan Crha - 2.3-22
+- Switch to python3 (partly) and disable python3 build dependency by default
+
+* Wed Mar 07 2018 Milan Crha - 2.3-21
+- Do not copy content of libmapi++/ into includedir (RH bug #1548719)
+
+* Mon Feb 19 2018 Milan Crha - 2.3-20
+- Remove unneeded build dependency on mariadb-connector-c-devel
+
+* Thu Feb 08 2018 Fedora Release Engineering - 2.3-19
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
+
+* Wed Nov 08 2017 Milan Crha - 2.3-18
+- Rebuild for newer libical
+
+* Fri Sep 22 2017 Milan Crha - 2.3-17
+- Use mariadb-connector-c-devel instead of community-mysql-devel (RH bug #1494307)
+
+* Thu Aug 03 2017 Fedora Release Engineering - 2.3-16
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild
+
+* Thu Jul 27 2017 Fedora Release Engineering - 2.3-15
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
+
+* Sat Feb 11 2017 Fedora Release Engineering - 2.3-14
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
+
+* Fri Apr 15 2016 David Tardon - 2.3-13
+- rebuild for ICU 57.1
+
+* Thu Apr 07 2016 Milan Crha - 2.3-12
+- Add patch to fix connection string for samba
+- Add patch to be able to build with flex 2.6.0
+
+* Tue Feb 09 2016 Milan Crha - 2.3-11
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
+- Add patch to build against new samba
+
+* Mon Jan 18 2016 Milan Crha - 2.3-10
+- Rebuild against newer libical
+
+* Thu Dec 03 2015 Milan Crha - 2.3-9
+- Do not depend on libsamba-debug private library
+
+* Mon Oct 26 2015 Milan Crha - 2.3-8
+- Rebuild against newer samba
+
+* Mon Sep 14 2015 Milan Crha - 2.3-7
+- Rebuild against newer samba
+
+* Mon Sep 07 2015 Milan Crha - 2.3-6
+- Rebuild against newer samba
+
+* Tue Sep 01 2015 Milan Crha - 2.3-5
+- Rebuild against newer samba
+
+* Mon Jul 20 2015 Milan Crha - 2.3-4
+- Rebuild against newer samba
+
+* Wed Jun 17 2015 Fedora Release Engineering - 2.3-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
+
+* Fri Jun 05 2015 Milan Crha - 2.3-2
+- Rebuild against newer samba
+
+* Mon May 18 2015 Milan Crha - 2.3-1
+- Update to 2.3
+
+* Thu Apr 23 2015 Milan Crha - 2.2-6
+- Rebuild against newer samba
+
+* Tue Apr 07 2015 Milan Crha - 2.2-5
+- Rebuild against newer samba with a patch for samba 4.2.0 update
+
+* Tue Jan 27 2015 Dan HorĂ¡k - 2.2-4
+- Rebuild again for newer samba to workaround samba-4.2.0-0.1.rc3.fc22 < samba-4.2.0-0.2.rc2.fc22 situation in secondary koji
+
+* Tue Jan 06 2015 Milan Crha - 2.2-3
+- Rebuild against newer samba
+
+* Mon Nov 24 2014 Milan Crha - 2.2-2
+- Add a patch to be able to build against samba 4.2.0-rc2
+
+* Thu Aug 21 2014 Matthew Barnes - 2.2-1
+- Update to OpenChange 2.2
+
+* Sun Aug 17 2014 Fedora Release Engineering - 2.1-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
+
+* Sat Jun 07 2014 Fedora Release Engineering - 2.1-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
+
+* Mon Apr 28 2014 Milan Crha - 2.1-1
+- Update to OpenChange 2.1
+
+* Thu Nov 21 2013 Milan Crha - 2.0-6
+- Rebuild for new libical (RH bug #1023020)
+
+* Mon Nov 11 2013 Milan Crha - 2.0-5
+- Add patch for RH bug #1028698 (Symbol collision with NSS)
+
+* Thu Sep 19 2013 Milan Crha - 2.0-4
+- Add patch to fix multilib issue in libmapi/version.h
+- Move devel-docs subpackage to noarch
+
+* Sat Aug 03 2013 Fedora Release Engineering - 2.0-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
+
+* Fri May 24 2013 Rex Dieter 2.0-2
+- rebuild (libical)
+
+* Thu Feb 14 2013 Milan Crha - 2.0-1
+- Update to OpenChange 2.0
+
+* Thu Feb 14 2013 Fedora Release Engineering - 1.0-13
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild
+
+* Fri Oct 26 2012 Milan Crha - 1.0-12
+- Add patch for Gnome bug #682449 (WriteStream fails)
+
+* Mon Aug 06 2012 Milan Crha - 1.0-11
+- Add patch for Red Hat bug #845618 (incorrect symbol resolution)
+
+* Thu Jul 26 2012 Milan Crha - 1.0-10
+- Remove check_fasttransfer from openchange-client, if not building server package
+
+* Fri Jul 20 2012 Fedora Release Engineering - 1.0-9
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
+* Tue Jul 10 2012 Milan Crha - 1.0-8
+- Add patch for OpenChange bug #397 (crash under MAPIUninitialize)
+- Disable build of python and mapiproxy
+
+* Fri Jun 01 2012 Milan Crha - 1.0-7
+- Add patch to use system's popt.h
+- Add patch to compile only certain parts of the package
+- Disable openchange-server for rawhide too (due to samba4 changes)
+
+* Thu May 17 2012 Matthew Barnes -1.0-6
+- Do not build openchange-server in RHEL.
+ (And make disabling the subpackage actually work.)
+
+* Wed May 02 2012 Milan Crha - 1.0-5
+- Do not include nagios/check_exchange in RHEL
+
+* Tue Apr 24 2012 Milan Crha - 1.0-4
+- Bump samba4 dependency
+
+* Thu Apr 19 2012 Matthew Barnes - 1.0-3
+- Add BR: libical-devel (RH bug #803640).
+
+* Wed Apr 18 2012 Milan Crha - 1.0-2
+- Bump samba4 dependency
+
+* Tue Apr 03 2012 Milan Crha - 1.0-1
+- Update to 1.0
+- Enable packages for server part and python bindings
+- Skip man3 pages, which are generated incomplete (use devhelp instead)
+
+* Fri Jan 13 2012 Fedora Release Engineering - 0.11-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
+
+* Tue Aug 30 2011 Milan Crha - 0.11-3
+- Fix package version number
+
+* Mon Aug 29 2011 Stephen Gallagher - 0.11-2.1
+- Rebuild against fixed libtevent version
+
+* Mon Aug 29 2011 Milan Crha - 0.11-2
+- Sync version and changes with Fedora 16 package
+
+* Thu Aug 11 2011 Milan Crha - 0.11-1
+- Update to OpenChange 0.11 Transporter upstream release
+- Remove unnecessary build modification patches.
+- Add patch to not use mapi_ctx->session as a TALLOC_CTX (OpenChange issue #366)
+- Add patch to read/write PidNameKeywords (OpenChange issue #367)
+
+* Wed Apr 6 2011 Matthew Barnes - 0.10.9-4
+- OpenChange relies on a private Samba 4 library (libsamba-util-common).
+ Add extra linker flags to libmapi.pc to compensate.
+
+* Wed Apr 6 2011 Matthew Barnes - 0.10.9-3
+- Move libmapiproxy.so, libmapistore.so and mapistore backend libraries
+ to the main package so the client subpackage is installable.
+
+* Fri Mar 25 2011 Simo Sorce - 0.10.9-2
+- New snapshot that avoid bison issues.
+- Also add patch that fix build (previously erroneously preapplied in the
+ snapshot tarball)
+- Fix timestamps in tarball
+- Fix specfile's install and files section to cope with newer version changes
+
+* Fri Mar 25 2011 Simo Sorce - 0.10.9-1
+- Upgrade to a 0.11 development snapshot.
+- Required by the new samba4 packages.
+
+* Mon Feb 21 2011 Milan Crha - 0.9-14
+- Rebuild against newer libldb
+
+* Tue Feb 08 2011 Fedora Release Engineering - 0.9-13
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
+
+* Wed Feb 02 2011 Milan Crha - 0.9-12
+- Add patch for message sending, found by Gianluca Cecchi (RH bug #674034)
+
+* Thu Dec 16 2010 Matthew Barnes - 0.9-11
+- Re-fix man-pages file conflict (RH bug #654729).
+
+* Thu Dec 02 2010 Milan Crha - 0.9-10
+- Add patch for talloc abort in FindGoodServer, found by Jeff Raber (RH bug #602661)
+
+* Wed Sep 29 2010 jkeating - 0.9-9
+- Rebuilt for gcc bug 634757
+
+* Mon Sep 13 2010 Matthew Barnes - 0.9-8
+- Backport unicode and properties support (RH bug #605364).
+
+* Wed Jul 21 2010 David Malcolm - 0.9-7
+- Rebuilt for https://fedoraproject.org/wiki/Features/Python_2.7/MassRebuild
+
+* Thu Jun 24 2010 Matthew Barnes - 0.9-6
+- Disable python and server subpackages until they're needed.
+
+* Wed Jun 23 2010 Matthew Barnes - 0.9-5
+- More spec file cleanups.
+
+* Fri Jun 18 2010 Matthew Barnes - 0.9-4
+- Spec file cleanups.
+
+* Mon May 24 2010 Matthew Barnes - 0.9-3
+- Avoid a file conflict with man-pages package.
+
+* Sat Jan 09 2010 Matthew Barnes - 0.9-2
+- Add a devel-docs subpackage (RH bug #552984).
+
+* Sat Dec 26 2009 Matthew Barnes - 0.9-1
+- Update to 0.9 (COCHRANE)
+- Bump samba4 requirement to alpha10.
+
+* Wed Sep 23 2009 Matthew Barnes - 0.8.2-5
+- Rebuild.
+
+* Sat Jul 25 2009 Fedora Release Engineering - 0.8.2-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
+
+* Mon Jun 29 2009 Matthew Barnes - 0.8.2-3
+- Rename libmapi so as not to conflict with Zarafa (RH bug #505783).
+
+* Thu May 07 2009 Matthew Barnes - 0.8.2-2
+- Do not own the pkgconfig directory (RH bug #499655).
+
+* Tue Mar 31 2009 Matthew Barnes - 0.8.2-1
+- Update to 0.8.2
+- Add a server subpackage.
+- Add BuildRequires: sqlite-devel (for server)
+
+* Sun Mar 08 2009 Matthew Barnes - 0.8-6
+- Fix build breakage.
+- Explicitly require libldb-devel.
+- Bump samba4 requirement to alpha7.
+
+* Wed Feb 25 2009 Matthew Barnes - 0.8-5
+- Rebuild with correct tarball.
+
+* Wed Feb 25 2009 Matthew Barnes - 0.8-4
+- Formal package review cleanups.
+
+* Wed Feb 25 2009 Matthew Barnes - 0.8-3
+- Add documentation files.
+
+* Thu Feb 19 2009 Matthew Barnes - 0.8-2
+- Add some missing build requirements.
+
+* Tue Jan 20 2009 Matthew Barnes - 0.8-1
+- Update to 0.8 (ROMULUS)
+
+* Sat Jan 17 2009 Matthew Barnes - 0.8-0.7.svn949
+- Add missing BuildRequires: zlib-devel
+
+* Sat Dec 27 2008 Matthew Barnes - 0.8-0.6.svn949
+- Update to SVN revision 949.
+
+* Mon Dec 15 2008 Matthew Barnes - 0.8-0.5.svn909
+- Package review feedback (RH bug #453395).
+
+* Fri Dec 12 2008 Matthew Barnes - 0.8-0.4.svn909
+- Update to SVN revision 909.
+- Bump the samba4 requirement.
+
+* Fri Aug 29 2008 Andrew Bartlett - 0:0.8-0.3.svn960.fc9
+- Bump version
+- Don't make the Samba4 version distro-dependent
+
+* Sat Jul 26 2008 Brad Hards - 0:0.8-0.2.svnr674.fc10
+- Bump version
+- Install documentation / man pages correctly
+- Remove epoch (per https://bugzilla.redhat.com/show_bug.cgi?id=453395)
+- Remove %%post and %%postun (per https://bugzilla.redhat.com/show_bug.cgi?id=453395)
+- Remove talloc dependency (per https://bugzilla.redhat.com/show_bug.cgi?id=453395)
+- Take out libmapiproxy, because we aren't up to server side yet.
+
+* Sat Jul 12 2008 Andrew Bartlett - 0:0.7-0.2.svnr627.fc9
+- Add popt-devel BR
+
+* Mon Jun 30 2008 Andrew Bartlett - 0:0.7-0.1.svnr627.fc9
+- Initial package of OpenChange for Fedora
diff --git a/sources b/sources
new file mode 100644
index 0000000..22e2125
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+SHA512 (openchange-2.3-VULCAN.tar.gz) = e157699e04836c5ff52250480ca94834052e4e1848c843495b8e5af4926bdf17a15f0e0e08b71aadaf6502b5af4b8725ce6bb08193cece5a80ecdb7af6ab574b