From 02b372a7081b7d1ac396224980b4fabe199a65ba Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Mon, 15 Aug 2005 09:43:00 +0000 Subject: [PATCH] Implement ldap_modify* functions. --- dlls/wldap32/Makefile.in | 1 + dlls/wldap32/modify.c | 353 +++++++++++++++++++++++++++++++++ dlls/wldap32/winldap_private.h | 8 + dlls/wldap32/wldap32.spec | 24 +-- 4 files changed, 374 insertions(+), 12 deletions(-) create mode 100644 dlls/wldap32/modify.c diff --git a/dlls/wldap32/Makefile.in b/dlls/wldap32/Makefile.in index e2c43835ba6..dc1b335871a 100644 --- a/dlls/wldap32/Makefile.in +++ b/dlls/wldap32/Makefile.in @@ -18,6 +18,7 @@ C_SRCS = \ init.c \ main.c \ misc.c \ + modify.c \ option.c \ search.c diff --git a/dlls/wldap32/modify.c b/dlls/wldap32/modify.c new file mode 100644 index 00000000000..2747a5af1ca --- /dev/null +++ b/dlls/wldap32/modify.c @@ -0,0 +1,353 @@ +/* + * 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 +static LDAPMod *nullmods[] = { NULL }; +#else +#define LDAP_NOT_SUPPORTED 0x5c +#endif + +#include "winldap_private.h" +#include "wldap32.h" + +WINE_DEFAULT_DEBUG_CHANNEL(wldap32); + +ULONG ldap_modifyA( WLDAP32_LDAP *ld, PCHAR dn, LDAPModA *mods[] ) +{ + ULONG ret = LDAP_NOT_SUPPORTED; +#ifdef HAVE_LDAP + WCHAR *dnW = NULL; + LDAPModW **modsW = NULL; + + ret = WLDAP32_LDAP_NO_MEMORY; + + TRACE( "(%p, %s, %p)\n", ld, debugstr_a(dn), mods ); + + if (!ld) return ~0UL; + + if (dn) { + dnW = strAtoW( dn ); + if (!dnW) goto exit; + } + if (mods) { + modsW = modarrayAtoW( mods ); + if (!modsW) goto exit; + } + + ret = ldap_modifyW( ld, dnW, modsW ); + +exit: + strfreeW( dnW ); + modarrayfreeW( modsW ); + +#endif + return ret; +} + +ULONG ldap_modifyW( WLDAP32_LDAP *ld, PWCHAR dn, LDAPModW *mods[] ) +{ + ULONG ret = LDAP_NOT_SUPPORTED; +#ifdef HAVE_LDAP + char *dnU = NULL; + LDAPMod **modsU = NULL; + + ret = WLDAP32_LDAP_NO_MEMORY; + + TRACE( "(%p, %s, %p)\n", ld, debugstr_w(dn), mods ); + + if (!ld) return WLDAP32_LDAP_PARAM_ERROR; + + if (dn) { + dnU = strWtoU( dn ); + if (!dnU) goto exit; + } + if (mods) { + modsU = modarrayWtoU( mods ); + if (!modsU) goto exit; + } + + ret = ldap_modify( ld, dn ? dnU : "", mods ? modsU : nullmods ); + +exit: + strfreeU( dnU ); + modarrayfreeU( modsU ); + +#endif + return ret; +} + +ULONG ldap_modify_extA( WLDAP32_LDAP *ld, PCHAR dn, LDAPModA *mods[], + PLDAPControlA *serverctrls, PLDAPControlA *clientctrls, ULONG *message ) +{ + ULONG ret = LDAP_NOT_SUPPORTED; +#ifdef HAVE_LDAP + WCHAR *dnW = NULL; + LDAPModW **modsW = NULL; + LDAPControlW **serverctrlsW = NULL, **clientctrlsW = NULL; + + ret = WLDAP32_LDAP_NO_MEMORY; + + TRACE( "(%p, %s, %p, %p, %p, %p)\n", ld, debugstr_a(dn), mods, + serverctrls, clientctrls, message ); + + if (!ld) return ~0UL; + + if (dn) { + dnW = strAtoW( dn ); + if (!dnW) goto exit; + } + if (mods) { + modsW = modarrayAtoW( mods ); + if (!modsW) goto exit; + } + if (serverctrls) { + serverctrlsW = controlarrayAtoW( serverctrls ); + if (!serverctrlsW) goto exit; + } + if (clientctrls) { + clientctrlsW = controlarrayAtoW( clientctrls ); + if (!clientctrlsW) goto exit; + } + + ret = ldap_modify_extW( ld, dnW, modsW, serverctrlsW, clientctrlsW, message ); + +exit: + strfreeW( dnW ); + modarrayfreeW( modsW ); + controlarrayfreeW( serverctrlsW ); + controlarrayfreeW( clientctrlsW ); + +#endif + return ret; +} + +ULONG ldap_modify_extW( WLDAP32_LDAP *ld, PWCHAR dn, LDAPModW *mods[], + PLDAPControlW *serverctrls, PLDAPControlW *clientctrls, ULONG *message ) +{ + ULONG ret = LDAP_NOT_SUPPORTED; +#ifdef HAVE_LDAP + char *dnU = NULL; + LDAPMod **modsU = NULL; + LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL; + int dummy; + + ret = WLDAP32_LDAP_NO_MEMORY; + + TRACE( "(%p, %s, %p, %p, %p, %p)\n", ld, debugstr_w(dn), mods, + serverctrls, clientctrls, message ); + + if (!ld) return ~0UL; + + if (dn) { + dnU = strWtoU( dn ); + if (!dnU) goto exit; + } + if (mods) { + modsU = modarrayWtoU( mods ); + if (!modsU) goto exit; + } + if (serverctrls) { + serverctrlsU = controlarrayWtoU( serverctrls ); + if (!serverctrlsU) goto exit; + } + if (clientctrls) { + clientctrlsU = controlarrayWtoU( clientctrls ); + if (!clientctrlsU) goto exit; + } + + ret = ldap_modify_ext( ld, dn ? dnU : "", mods ? modsU : nullmods, serverctrlsU, + clientctrlsU, message ? (int *)message : &dummy ); + +exit: + strfreeU( dnU ); + modarrayfreeU( modsU ); + controlarrayfreeU( serverctrlsU ); + controlarrayfreeU( clientctrlsU ); + +#endif + return ret; +} + +ULONG ldap_modify_ext_sA( WLDAP32_LDAP *ld, PCHAR dn, LDAPModA *mods[], + PLDAPControlA *serverctrls, PLDAPControlA *clientctrls ) +{ + ULONG ret = LDAP_NOT_SUPPORTED; +#ifdef HAVE_LDAP + WCHAR *dnW = NULL; + LDAPModW **modsW = NULL; + LDAPControlW **serverctrlsW = NULL, **clientctrlsW = NULL; + + ret = WLDAP32_LDAP_NO_MEMORY; + + TRACE( "(%p, %s, %p, %p, %p)\n", ld, debugstr_a(dn), mods, + serverctrls, clientctrls ); + + if (!ld) return WLDAP32_LDAP_PARAM_ERROR; + + if (dn) { + dnW = strAtoW( dn ); + if (!dnW) goto exit; + } + if (mods) { + modsW = modarrayAtoW( mods ); + if (!modsW) goto exit; + } + if (serverctrls) { + serverctrlsW = controlarrayAtoW( serverctrls ); + if (!serverctrlsW) goto exit; + } + if (clientctrls) { + clientctrlsW = controlarrayAtoW( clientctrls ); + if (!clientctrlsW) goto exit; + } + + ret = ldap_modify_ext_sW( ld, dnW, modsW, serverctrlsW, clientctrlsW ); + +exit: + strfreeW( dnW ); + modarrayfreeW( modsW ); + controlarrayfreeW( serverctrlsW ); + controlarrayfreeW( clientctrlsW ); + +#endif + return ret; +} + +ULONG ldap_modify_ext_sW( WLDAP32_LDAP *ld, PWCHAR dn, LDAPModW *mods[], + PLDAPControlW *serverctrls, PLDAPControlW *clientctrls ) +{ + ULONG ret = LDAP_NOT_SUPPORTED; +#ifdef HAVE_LDAP + char *dnU = NULL; + LDAPMod **modsU = NULL; + LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL; + + ret = WLDAP32_LDAP_NO_MEMORY; + + TRACE( "(%p, %s, %p, %p, %p)\n", ld, debugstr_w(dn), mods, + serverctrls, clientctrls ); + + if (!ld) return WLDAP32_LDAP_PARAM_ERROR; + + if (dn) { + dnU = strWtoU( dn ); + if (!dnU) goto exit; + } + if (mods) { + modsU = modarrayWtoU( mods ); + if (!modsU) goto exit; + } + if (serverctrls) { + serverctrlsU = controlarrayWtoU( serverctrls ); + if (!serverctrlsU) goto exit; + } + if (clientctrls) { + clientctrlsU = controlarrayWtoU( clientctrls ); + if (!clientctrlsU) goto exit; + } + + ret = ldap_modify_ext_s( ld, dn ? dnU : "", mods ? modsU : nullmods, + serverctrlsU, clientctrlsU ); + +exit: + strfreeU( dnU ); + modarrayfreeU( modsU ); + controlarrayfreeU( serverctrlsU ); + controlarrayfreeU( clientctrlsU ); + +#endif + return ret; +} + +ULONG ldap_modify_sA( WLDAP32_LDAP *ld, PCHAR dn, LDAPModA *mods[] ) +{ + ULONG ret = LDAP_NOT_SUPPORTED; +#ifdef HAVE_LDAP + WCHAR *dnW = NULL; + LDAPModW **modsW = NULL; + + ret = WLDAP32_LDAP_NO_MEMORY; + + TRACE( "(%p, %s, %p)\n", ld, debugstr_a(dn), mods ); + + if (!ld) return WLDAP32_LDAP_PARAM_ERROR; + + if (dn) { + dnW = strAtoW( dn ); + if (!dnW) goto exit; + } + if (mods) { + modsW = modarrayAtoW( mods ); + if (!modsW) goto exit; + } + + ret = ldap_modify_sW( ld, dnW, modsW ); + +exit: + strfreeW( dnW ); + modarrayfreeW( modsW ); + +#endif + return ret; +} + +ULONG ldap_modify_sW( WLDAP32_LDAP *ld, PWCHAR dn, LDAPModW *mods[] ) +{ + ULONG ret = LDAP_NOT_SUPPORTED; +#ifdef HAVE_LDAP + char *dnU = NULL; + LDAPMod **modsU = NULL; + + ret = WLDAP32_LDAP_NO_MEMORY; + + TRACE( "(%p, %s, %p)\n", ld, debugstr_w(dn), mods ); + + if (!ld) return WLDAP32_LDAP_PARAM_ERROR; + + if (dn) { + dnU = strWtoU( dn ); + if (!dnU) goto exit; + } + if (mods) { + modsU = modarrayWtoU( mods ); + if (!modsU) goto exit; + } + + ret = ldap_modify_s( ld, dn ? dnU : "", mods ? modsU : nullmods ); + +exit: + strfreeU( dnU ); + modarrayfreeU( modsU ); + +#endif + return ret; +} diff --git a/dlls/wldap32/winldap_private.h b/dlls/wldap32/winldap_private.h index 92d1e4c0ead..8de81d128c3 100644 --- a/dlls/wldap32/winldap_private.h +++ b/dlls/wldap32/winldap_private.h @@ -274,6 +274,14 @@ WLDAP32_LDAP *ldap_initA(const PCHAR,ULONG); WLDAP32_LDAP *ldap_initW(const PWCHAR,ULONG); void ldap_memfreeA(PCHAR); void ldap_memfreeW(PWCHAR); +ULONG ldap_modifyA(WLDAP32_LDAP*,PCHAR,LDAPModA*[]); +ULONG ldap_modifyW(WLDAP32_LDAP*,PWCHAR,LDAPModW*[]); +ULONG ldap_modify_extA(WLDAP32_LDAP*,PCHAR,LDAPModA*[],PLDAPControlA*,PLDAPControlA*,ULONG*); +ULONG ldap_modify_extW(WLDAP32_LDAP*,PWCHAR,LDAPModW*[],PLDAPControlW*,PLDAPControlW*,ULONG*); +ULONG ldap_modify_ext_sA(WLDAP32_LDAP*,PCHAR,LDAPModA*[],PLDAPControlA*,PLDAPControlA*); +ULONG ldap_modify_ext_sW(WLDAP32_LDAP*,PWCHAR,LDAPModW*[],PLDAPControlW*,PLDAPControlW*); +ULONG ldap_modify_sA(WLDAP32_LDAP*,PCHAR,LDAPModA*[]); +ULONG ldap_modify_sW(WLDAP32_LDAP*,PWCHAR,LDAPModW*[]); WLDAP32_LDAP *ldap_openA(PCHAR,ULONG); WLDAP32_LDAP *ldap_openW(PWCHAR,ULONG); void WLDAP32_ldap_perror(WLDAP32_LDAP*,const PCHAR); diff --git a/dlls/wldap32/wldap32.spec b/dlls/wldap32/wldap32.spec index ed40bdf2b5e..0896b2ff959 100644 --- a/dlls/wldap32/wldap32.spec +++ b/dlls/wldap32/wldap32.spec @@ -135,18 +135,18 @@ @ cdecl ldap_memfree(ptr) ldap_memfreeA @ cdecl ldap_memfreeA(ptr) @ cdecl ldap_memfreeW(ptr) -@ stub ldap_modify -@ stub ldap_modifyA -@ stub ldap_modifyW -@ stub ldap_modify_ext -@ stub ldap_modify_extA -@ stub ldap_modify_extW -@ stub ldap_modify_ext_s -@ stub ldap_modify_ext_sA -@ stub ldap_modify_ext_sW -@ stub ldap_modify_s -@ stub ldap_modify_sA -@ stub ldap_modify_sW +@ cdecl ldap_modify(ptr str ptr) ldap_modifyA +@ cdecl ldap_modifyA(ptr str ptr) +@ cdecl ldap_modifyW(ptr wstr ptr) +@ cdecl ldap_modify_ext(ptr str ptr ptr ptr ptr) ldap_modify_extA +@ cdecl ldap_modify_extA(ptr str ptr ptr ptr ptr) +@ cdecl ldap_modify_extW(ptr wstr ptr ptr ptr ptr) +@ cdecl ldap_modify_ext_s(ptr str ptr ptr ptr) ldap_modify_ext_sA +@ cdecl ldap_modify_ext_sA(ptr str ptr ptr ptr) +@ cdecl ldap_modify_ext_sW(ptr wstr ptr ptr ptr) +@ cdecl ldap_modify_s(ptr str ptr) ldap_modify_sA +@ cdecl ldap_modify_sA(ptr str ptr) +@ cdecl ldap_modify_sW(ptr wstr ptr) @ stub ldap_modrdn @ stub ldap_modrdn2 @ stub ldap_modrdn2A