From 3abfd8a890e9a6e8aad222ef85c5339fdd33d6a1 Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Mon, 29 Aug 2005 09:33:16 +0000 Subject: [PATCH] Implement ldap_extended_operation* and ldap_close_extended_op. --- dlls/wldap32/Makefile.in | 1 + dlls/wldap32/extended.c | 223 +++++++++++++++++++++++++++++++++++++++++ dlls/wldap32/winldap_private.h | 7 ++ dlls/wldap32/wldap32.spec | 12 +-- 4 files changed, 237 insertions(+), 6 deletions(-) create mode 100644 dlls/wldap32/extended.c diff --git a/dlls/wldap32/Makefile.in b/dlls/wldap32/Makefile.in index 76b3f47283d..77d0c8d1f18 100644 --- a/dlls/wldap32/Makefile.in +++ b/dlls/wldap32/Makefile.in @@ -15,6 +15,7 @@ C_SRCS = \ delete.c \ dn.c \ error.c \ + extended.c \ init.c \ main.c \ misc.c \ diff --git a/dlls/wldap32/extended.c b/dlls/wldap32/extended.c new file mode 100644 index 00000000000..cbb440dd00a --- /dev/null +++ b/dlls/wldap32/extended.c @@ -0,0 +1,223 @@ +/* + * WLDAP32 - LDAP support for Wine + * + * Copyright 2005 Hans Leidekker + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" + +#include "wine/port.h" +#include "wine/debug.h" + +#include + +#include "windef.h" +#include "winbase.h" +#include "winnls.h" + +#ifdef HAVE_LDAP_H +#include +#else +#define LDAP_SUCCESS 0x00 +#define LDAP_NOT_SUPPORTED 0x5c +#endif + +#include "winldap_private.h" +#include "wldap32.h" + +WINE_DEFAULT_DEBUG_CHANNEL(wldap32); + +ULONG ldap_close_extended_op( WLDAP32_LDAP *ld, ULONG msgid ) +{ + TRACE( "(%p, 0x%08lx)\n", ld, msgid ); + + if (!ld) return WLDAP32_LDAP_PARAM_ERROR; + return LDAP_SUCCESS; +} + +ULONG ldap_extended_operationA( WLDAP32_LDAP *ld, PCHAR oid, struct WLDAP32_berval *data, + PLDAPControlA *serverctrls, PLDAPControlA *clientctrls, ULONG *message ) +{ + ULONG ret = LDAP_NOT_SUPPORTED; +#ifdef HAVE_LDAP + WCHAR *oidW = NULL; + LDAPControlW **serverctrlsW = NULL, **clientctrlsW = NULL; + + ret = WLDAP32_LDAP_NO_MEMORY; + + TRACE( "(%p, %s, %p, %p, %p, %p)\n", ld, debugstr_a(oid), data, serverctrls, + clientctrls, message ); + + if (!ld || !message) return WLDAP32_LDAP_PARAM_ERROR; + + if (oid) { + oidW = strAtoW( oid ); + if (!oidW) goto exit; + } + if (serverctrls) { + serverctrlsW = controlarrayAtoW( serverctrls ); + if (!serverctrlsW) goto exit; + } + if (clientctrls) { + clientctrlsW = controlarrayAtoW( clientctrls ); + if (!clientctrlsW) goto exit; + } + + ret = ldap_extended_operationW( ld, oidW, data, serverctrlsW, clientctrlsW, message ); + +exit: + strfreeW( oidW ); + controlarrayfreeW( serverctrlsW ); + controlarrayfreeW( clientctrlsW ); + +#endif + return ret; +} + +ULONG ldap_extended_operationW( WLDAP32_LDAP *ld, PWCHAR oid, struct WLDAP32_berval *data, + PLDAPControlW *serverctrls, PLDAPControlW *clientctrls, ULONG *message ) +{ + ULONG ret = LDAP_NOT_SUPPORTED; +#ifdef HAVE_LDAP + char *oidU = NULL; + LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL; + + ret = WLDAP32_LDAP_NO_MEMORY; + + TRACE( "(%p, %s, %p, %p, %p, %p)\n", ld, debugstr_w(oid), data, serverctrls, + clientctrls, message ); + + if (!ld || !message) return WLDAP32_LDAP_PARAM_ERROR; + + if (oid) { + oidU = strWtoU( oid ); + if (!oidU) goto exit; + } + if (serverctrls) { + serverctrlsU = controlarrayWtoU( serverctrls ); + if (!serverctrlsU) goto exit; + } + if (clientctrls) { + clientctrlsU = controlarrayWtoU( clientctrls ); + if (!clientctrlsU) goto exit; + } + + ret = ldap_extended_operation( ld, oid ? oidU : "", (struct berval *)data, + serverctrlsU, clientctrlsU, (int *)message ); + +exit: + strfreeU( oidU ); + controlarrayfreeU( serverctrlsU ); + controlarrayfreeU( clientctrlsU ); + +#endif + return ret; +} + +ULONG ldap_extended_operation_sA( WLDAP32_LDAP *ld, PCHAR oid, struct WLDAP32_berval *data, + PLDAPControlA *serverctrls, PLDAPControlA *clientctrls, PCHAR *retoid, + struct WLDAP32_berval **retdata ) +{ + ULONG ret = LDAP_NOT_SUPPORTED; +#ifdef HAVE_LDAP + WCHAR *oidW = NULL, *retoidW = NULL; + LDAPControlW **serverctrlsW = NULL, **clientctrlsW = NULL; + + ret = WLDAP32_LDAP_NO_MEMORY; + + TRACE( "(%p, %s, %p, %p, %p, %p, %p)\n", ld, debugstr_a(oid), data, serverctrls, + clientctrls, retoid, retdata ); + + if (!ld) return WLDAP32_LDAP_PARAM_ERROR; + + if (oid) { + oidW = strAtoW( oid ); + if (!oidW) goto exit; + } + if (serverctrls) { + serverctrlsW = controlarrayAtoW( serverctrls ); + if (!serverctrlsW) goto exit; + } + if (clientctrls) { + clientctrlsW = controlarrayAtoW( clientctrls ); + if (!clientctrlsW) goto exit; + } + + ret = ldap_extended_operation_sW( ld, oidW, data, serverctrlsW, clientctrlsW, + &retoidW, retdata ); + + if (retoid && retoidW) { + *retoid = strWtoA( retoidW ); + if (!*retoid) ret = WLDAP32_LDAP_NO_MEMORY; + ldap_memfreeW( retoidW ); + } + +exit: + strfreeW( oidW ); + controlarrayfreeW( serverctrlsW ); + controlarrayfreeW( clientctrlsW ); + +#endif + return ret; +} + +ULONG ldap_extended_operation_sW( WLDAP32_LDAP *ld, PWCHAR oid, struct WLDAP32_berval *data, + PLDAPControlW *serverctrls, PLDAPControlW *clientctrls, PWCHAR *retoid, + struct WLDAP32_berval **retdata ) +{ + ULONG ret = LDAP_NOT_SUPPORTED; +#ifdef HAVE_LDAP + char *oidU = NULL, *retoidU = NULL; + LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL; + + ret = WLDAP32_LDAP_NO_MEMORY; + + TRACE( "(%p, %s, %p, %p, %p, %p, %p)\n", ld, debugstr_w(oid), data, serverctrls, + clientctrls, retoid, retdata ); + + if (!ld) return WLDAP32_LDAP_PARAM_ERROR; + + if (oid) { + oidU = strWtoU( oid ); + if (!oidU) goto exit; + } + if (serverctrls) { + serverctrlsU = controlarrayWtoU( serverctrls ); + if (!serverctrlsU) goto exit; + } + if (clientctrls) { + clientctrlsU = controlarrayWtoU( clientctrls ); + if (!clientctrlsU) goto exit; + } + + ret = ldap_extended_operation_s( ld, oid ? oidU : "", (struct berval *)data, serverctrlsU, + clientctrlsU, &retoidU, (struct berval **)retdata ); + + if (retoid && retoidU) { + *retoid = strUtoW( retoidU ); + if (!*retoid) ret = WLDAP32_LDAP_NO_MEMORY; + ldap_memfree( retoidU ); + } + +exit: + strfreeU( oidU ); + controlarrayfreeU( serverctrlsU ); + controlarrayfreeU( clientctrlsU ); + +#endif + return ret; +} diff --git a/dlls/wldap32/winldap_private.h b/dlls/wldap32/winldap_private.h index 26ab7490e38..1c4c04bf824 100644 --- a/dlls/wldap32/winldap_private.h +++ b/dlls/wldap32/winldap_private.h @@ -250,6 +250,7 @@ ULONG ldap_bind_sW(WLDAP32_LDAP*,PWCHAR,PWCHAR,ULONG); ULONG ldap_check_filterA(WLDAP32_LDAP*,PCHAR); ULONG ldap_check_filterW(WLDAP32_LDAP*,PWCHAR); ULONG ldap_cleanup(HANDLE); +ULONG ldap_close_extended_op(WLDAP32_LDAP*,ULONG); ULONG ldap_compareA(WLDAP32_LDAP*,PCHAR,PCHAR,PCHAR); ULONG ldap_compareW(WLDAP32_LDAP*,PWCHAR,PWCHAR,PWCHAR); ULONG ldap_compare_extA(WLDAP32_LDAP*,PCHAR,PCHAR,PCHAR,struct WLDAP32_berval*,PLDAPControlA*,PLDAPControlA*,ULONG*); @@ -274,6 +275,12 @@ PCHAR ldap_err2stringA(ULONG); PWCHAR ldap_err2stringW(ULONG); PCHAR *ldap_explode_dnA(PCHAR,ULONG); PWCHAR *ldap_explode_dnW(PWCHAR,ULONG); +ULONG ldap_extended_operationA(WLDAP32_LDAP*,PCHAR,struct WLDAP32_berval*,PLDAPControlA*,PLDAPControlA*,ULONG*); +ULONG ldap_extended_operationW(WLDAP32_LDAP*,PWCHAR,struct WLDAP32_berval*,PLDAPControlW*,PLDAPControlW*,ULONG*); +ULONG ldap_extended_operation_sA(WLDAP32_LDAP*,PCHAR,struct WLDAP32_berval*,PLDAPControlA*, PLDAPControlA*, + PCHAR*,struct WLDAP32_berval**); +ULONG ldap_extended_operation_sW(WLDAP32_LDAP*,PWCHAR,struct WLDAP32_berval*,PLDAPControlW*, PLDAPControlW*, + PWCHAR*,struct WLDAP32_berval**); PCHAR ldap_get_dnA(WLDAP32_LDAP*,WLDAP32_LDAPMessage*); PWCHAR ldap_get_dnW(WLDAP32_LDAP*,WLDAP32_LDAPMessage*); ULONG ldap_get_optionA(WLDAP32_LDAP*,int,void*); diff --git a/dlls/wldap32/wldap32.spec b/dlls/wldap32/wldap32.spec index 26e302cb950..9ed572bf66c 100644 --- a/dlls/wldap32/wldap32.spec +++ b/dlls/wldap32/wldap32.spec @@ -40,7 +40,7 @@ @ cdecl ldap_check_filterA(ptr str) @ cdecl ldap_check_filterW(ptr wstr) @ cdecl ldap_cleanup(long) -@ stub ldap_close_extended_op +@ cdecl ldap_close_extended_op(ptr long) @ cdecl ldap_compare(ptr str str str) ldap_compareA @ cdecl ldap_compareA(ptr str str str) @ cdecl ldap_compareW(ptr wstr wstr wstr) @@ -101,11 +101,11 @@ @ cdecl ldap_explode_dn(str long) ldap_explode_dnA @ cdecl ldap_explode_dnA(str long) @ cdecl ldap_explode_dnW(wstr long) -@ stub ldap_extended_operation -@ stub ldap_extended_operationA -@ stub ldap_extended_operationW -@ stub ldap_extended_operation_sA -@ stub ldap_extended_operation_sW +@ cdecl ldap_extended_operation(ptr str ptr ptr ptr ptr) ldap_extended_operationA +@ cdecl ldap_extended_operationA(ptr str ptr ptr ptr ptr) +@ cdecl ldap_extended_operationW(ptr wstr ptr ptr ptr ptr) +@ cdecl ldap_extended_operation_sA(ptr str ptr ptr ptr ptr ptr) +@ cdecl ldap_extended_operation_sW(ptr wstr ptr ptr ptr ptr ptr) @ stub ldap_first_attribute @ stub ldap_first_attributeA @ stub ldap_first_attributeW -- 2.11.4.GIT