other things
Joe Little
jlittle at open-it.org
Sat May 26 05:18:53 CEST 2001
included are ldap/lber swig files (uses swig 1.3a5 or whatever the latest
snapshot is..). They _compile_ against both OpenLDAP 2.0.x and mozilla
ldap sdk 5.0. They only match Sascha's current swig files and do not as
yet address other API needs. It is a work in progress, but I wnated to
post it. You can grap Sasha's swig-ldap package and replace the
ldap/lber.i files (remember to erase *_swap.c!) and then "make" it.
On Fri, 25 May 2001, Michael Ströder wrote:
> Joe Little wrote:
> >
> > I do understand that openldap 1.x is being maintained by OpenLDAP, but the
> > distribution sets no longer maintain such. Thus any software created with
> > the hope for inclusion in a distro (like my management software ideas)
> > need to be on the current build set.
>
> I disagree. E.g. recent S.u.S.E. Linux 7.1 ships with both libs and
> python-ldap 1.10a3. I think Red Hat does also. Not sure about
> Debian.
>
> Believe me I have exactly the same problems with 1st-level-support
> for web2ldap.
>
> > I'll need to look further into the 2.x thread-safe issues. It would appear
> > from various notes/code that OpenLDAP 2.0.7 and beyond is now thread-safe.
>
> No, it isn't.
>
> > I saw your message from before. Is there anything more current that
> > confirms/refutes that?
>
> This message by Kurt Zeilenga was at the time 2.0.7 was already out.
> Please re-read it. Note that there are still significant changes
> with the OpenLDAP 2.0.x releases. You can't stick to 2.0.7 (2.0.11
> was released yesterday).
>
> Regarding re-entrant LDAP libs Kurt mentioned ldap_r which provides
> sort of a re-entrant lib but not without taking special care in the
> LDAP application's C code. It might be a solution to wrap this into
> a low-level API and write a thread-safe wrapper class around it.
>
> > I also DLed the newly minted ldapsdk5.0 for mozilla, and will work on the
> > SWIG stuff there.
>
> According to various messages by Kurt Zeilenga and others this is
> the only thread-safe LDAP lib.
>
> -------- Original Message --------
> Subject: Re: [ldap] LDAP C SDK's thread-safe?
> Date: Tue, 08 May 2001 09:08:29 -0400
> From: mcs at netscape.com (Mark C Smith)
> Organization: iPlanet E-Commerce Solutions
> To: michael at stroeder.com
>
> Just found this in my overflowing inbox... the Netscape/Mozilla SDK
> is
> multithread safe, although in older versions you must write and
> install
> some callback functions to allow for safe sharing of one LDAP *
> session
> handle among multiple threads. This is documented.
>
> -Mark
> -----------------------------------
>
> > The OpenLDAP 2.x include files give swig indigestion. My
> > current approach to this whole mess is the get a passable swig module for
> > some LDAP v3 library working, and then work with python-ldap (ie you?) to
> > build toward a stable solution.
>
> Feel free to send me code for testing. Please mention the SWIG
> version it requires. I have currently installed swig-1.3a5.
>
> > Once we have a working v3 backend to
> > python-ldap, it will be easier to code for the differences in each SDK.
> > This is why I DLed the mozilla one, since it was one you felt was most
> > complete. If we can move on that, we have something to work with.
>
> I'd suggest to write low-level SWIG-wrappers around each LDAP C SDK
> and write a nice Python class API for common use above it. So you
> don't have to deal with the dirty details at the C level. Just wrap
> 1:1 *everything* in libldap and libber and let me do the
> higher-level abstraction.
>
> > At the same time, I'll be using the current python-ldap w/ openldap 2.x
> > patches to work on the ZopeLDAP adaptor and that code. I hope to get the
> > sdk bit done this weekend, and devote a good week to the Zope code.
>
> I'm pretty sure Jens will catch up quickly and modify the ZopeLDAP
> stuff if there's a new usable API. Leave that part up to him.
>
> > That is where I stand, and I hope its agreeable to you. My hand is
> > "raised" on the maintenance issue, I am still just unsure of how best to
> > tackle the problem.
>
> Since you are able to produce the SWIG wrapper code simply stick to
> that. Leave the Python part to me and the Zope part to Jens. Is that
> clear enough?
>
> Ciao, Michael.
>
-------------- next part --------------
%module ldap
%include lber.i
%include pointer.i
%include array.i
%include typemaps.i
%{
#include "/opt/ldapsdk/include/lber.h"
#include "/opt/ldapsdk/include/ldap.h"
#include "version.h"
// #include <dmalloc.h>
%}
%include "constants.h"
%include "version.h"
%inline %{
// global variables
LDAPMessage *res;
%}
%typemap(python,out) char * {
if ($source==NULL){
Py_INCREF(Py_None);
$target = Py_None;
} else {
$target = PyString_FromString($source);
}
}
%inline %{
static PyObject *version(){
return PyString_FromString(SWIG_LDAP_VERSION);
}
static PyObject *build_date(){
return PyString_FromString(SWIG_LDAP_BUILD_DATE);
}
%}
%name(abandon) extern int ldap_abandon ( LDAP *ld, int msgid );
/*
* in add.c:
*/
%name(add) extern int ldap_add ( LDAP *ld, const char *dn, LDAPMod **attrs );
%name(add_s) extern int ldap_add_s ( LDAP *ld, const char *dn, LDAPMod **attrs );
/*
* in bind.c:
*/
%name(bind) extern int ldap_bind ( LDAP *ld, const char *who, const char *passwd, int authmethod );
%name(bind_s) extern int ldap_bind_s ( LDAP *ld, const char *who, const char *cred, int method );
/*
* in sbind.c:
*/
%name(simple_bind) extern int ldap_simple_bind ( LDAP *ld, const char *who, const char *passwd );
%name(simple_bind_s) extern int ldap_simple_bind_s ( LDAP *ld, const char *who, const char *passwd );
/*
* in cache.c
*/
//%name(enable_cache) extern int ldap_enable_cache ( LDAP *ld, long timeout, long maxmem );
//%name(disable_cache) extern void ldap_disable_cache ( LDAP *ld );
//%name(set_cache_options) extern void ldap_set_cache_options ( LDAP *ld, unsigned long opts );
//%name(destroy_cache) extern void ldap_destroy_cache ( LDAP *ld );
//%name(flush_cache) extern void ldap_flush_cache ( LDAP *ld );
//%name(uncache_entry) extern void ldap_uncache_entry ( LDAP *ld, char *dn );
//%name(uncache_request) extern void ldap_uncache_request ( LDAP *ld, int msgid );
/*
* in compare.c:
*/
%name(compare) extern int ldap_compare ( LDAP *ld, const char *dn, const char *attr, const char *value );
%name(compare_s) extern int ldap_compare_s ( LDAP *ld, const char *dn, const char *attr, const char *value );
/*
* in delete.c:
*/
%name(delete) extern int ldap_delete ( LDAP *ld, const char *dn );
%name(delete_s) extern int ldap_delete_s ( LDAP *ld, const char *dn );
/*
* in error.c:
*/
%name(result2error) extern int ldap_result2error ( LDAP *ld, LDAPMessage *r, int freeit );
%name(err2string) extern char *ldap_err2string ( int err );
%name(perror) extern void ldap_perror ( LDAP *ld, const char *s );
/*
* in modify.c:
*/
%name(modify) extern int ldap_modify ( LDAP *ld, const char *dn, LDAPMod **mods );
%name(modify_s) extern int ldap_modify_s ( LDAP *ld, const char *dn, LDAPMod **mods );
/*
* in modrdn.c:
*/
%name(modrdn) extern int ldap_modrdn ( LDAP *ld, const char *dn, const char *newrdn );
%name(modrdn_s) extern int ldap_modrdn_s ( LDAP *ld, const char *dn, const char *newrdn );
%name(modrdn2) extern int ldap_modrdn2 ( LDAP *ld, const char *dn, const char *newrdn, int deleteoldrdn );
%name(modrdn2_s)extern int ldap_modrdn2_s ( LDAP *ld, const char *dn, const char *newrdn, int deleteoldrdn);
/*
* in open.c:
*/
%name(open) extern LDAP* ldap_open ( const char *host, int port );
%name(init) extern LDAP* ldap_init ( const char *defhost, int defport );
/*
* in getentry.c:
*/
%name(first_entry) extern LDAPMessage *ldap_first_entry ( LDAP *ld, LDAPMessage *res );
%name(next_entry) extern LDAPMessage *ldap_next_entry ( LDAP *ld, LDAPMessage *res );
%name(count_entries) extern int ldap_count_entries ( LDAP *ld, LDAPMessage *res );
/*
* in addentry.c
*/
%name(delete_result_entry) extern LDAPMessage *ldap_delete_result_entry ( LDAPMessage **list,LDAPMessage *e );
%name(add_result_entry) extern void ldap_add_result_entry ( LDAPMessage **list, LDAPMessage *e );
/*
* in getdn.c
*/
%name(get_dn) extern char *ldap_get_dn ( LDAP *ld, LDAPMessage *entry );
%name(dn2ufn) extern char *ldap_dn2ufn ( const char *dn );
%name(explode_dn) extern char **ldap_explode_dn ( const char *dn, const int notypes );
%name(explode_dns) extern char **ldap_explode_dns ( const char *dn );
%name(is_dns_dn) extern int ldap_is_dns_dn ( const char *dn );
/*
* in getattr.c
*/
%name(first_attribute) extern char *ldap_first_attribute ( LDAP *ld, LDAPMessage *entry, BerElement **berptr );
%name(next_attribute) extern char *ldap_next_attribute ( LDAP *ld, LDAPMessage *entry, BerElement *berptr );
%inline %{
BerElement ** makeBerElementPtrPtr(){
BerElement **ptrptr;
ptrptr = PyMem_NEW(BerElement *,sizeof(BerElement*));
return (BerElement **)ptrptr;
}
BerElement * derefBerElementPtrPtr(BerElement **p){
return *p;
}
%}
/*
* in getvalues.c
*/
%name(get_values) extern char **ldap_get_values ( LDAP *ld, LDAPMessage *entry, const char *target );
%name(get_values_len) extern struct berval **ldap_get_values_len ( LDAP *ld, LDAPMessage *entry,const char *target );
%name(count_values) extern int ldap_count_values ( char **vals );
%name(count_values_len) extern int ldap_count_values_len ( struct berval **vals );
%name(value_free) extern void ldap_value_free ( char **vals );
%name(value_free_len) extern void ldap_value_free_len ( struct berval **vals );
/*
* in result.c:
*/
%name(result) extern int ldap_result ( LDAP *ld, int msgid, int all,
struct timeval *timeout, LDAPMessage **result );
%name(msgfree) extern int ldap_msgfree (LDAPMessage *res);
//%name(msgdelete) extern int ldap_msgdelete ( LDAP *ld, int msgid );
/*
* in search.c:
*/
%name(search) extern int ldap_search ( LDAP *ld, const char *base, int scope, const char *filter,
char **attrs, int attrsonly );
%name(search_s) extern int ldap_search_s ( LDAP *ld, const char *base, int scope, const char *filter,
char **attrs, int attrsonly, LDAPMessage **res );
%inline %{
LDAPMessage ** makeLDAPMessagePtrPtr(){
return (LDAPMessage **)&res;
}
LDAPMessage * derefLDAPMessagePtrPtr(LDAPMessage **p){
return *p;
}
%}
/*
* in ufn.c
*/
/*
* in unbind.c
*/
%name(unbind) extern int ldap_unbind ( LDAP *ld );
%name(unbind_s) extern int ldap_unbind_s ( LDAP *ld );
/*
* in getfilter.c
*/
%name(init_getfilter) extern LDAPFiltDesc *ldap_init_getfilter ( char *fname );
%name(init_getfilter_buf) extern LDAPFiltDesc *ldap_init_getfilter_buf ( char *buf, long buflen );
%name(getfirstfilter) extern LDAPFiltInfo *ldap_getfirstfilter ( LDAPFiltDesc *lfdp, char *tagpat,char *value );
%name(getnextfilter) extern LDAPFiltInfo *ldap_getnextfilter ( LDAPFiltDesc *lfdp );
%name(setfilteraffixes) extern void ldap_setfilteraffixes ( LDAPFiltDesc *lfdp, char *prefix, char *suffix );
%name(build_filter) extern void ldap_build_filter ( char *buf, unsigned long buflen,char *pattern, char *prefix, char *suffix, char *attr,char *value, char **valwords );
/*
* in free.c
*/
%name(getfilter_free) extern void ldap_getfilter_free ( LDAPFiltDesc *lfdp );
%name(mods_free) extern void ldap_mods_free ( LDAPMod **mods, int freemods );
/*
* in friendly.c
*/
%name(friendly_name) extern char *ldap_friendly_name ( char *filename, char *uname,
FriendlyMap *map );
%name(free_friendlymap) extern void ldap_free_friendlymap ( FriendlyMap *map );
/*
* in url.c
*/
%name(is_ldap_url) extern int ldap_is_ldap_url ( const char *url );
%name(url_parse) extern int ldap_url_parse ( const char *url, LDAPURLDesc **ludpp );
%name(free_urldesc) extern void ldap_free_urldesc ( LDAPURLDesc *ludp );
%name(url_search) extern int ldap_url_search ( LDAP *ld, const char *url, int attrsonly );
%name(url_search_s) extern int ldap_url_search_s ( LDAP *ld, const char *url, int attrsonly,
LDAPMessage **res );
%name(url_search_st) extern int ldap_url_search_st ( LDAP *ld, const char *url, int attrsonly,
struct timeval *timeout, LDAPMessage **res );
/*
* in msdos/winsock/wsa.c
*
* void ldap_memfree ( void *p );
*/
-------------- next part --------------
%module lber
%{
#include "/opt/ldapsdk/include/lber.h"
%}
extern int lber_debug;
/*
* in bprint.c:
*/
extern void lber_bprint ( char *data, int len );
/*
* in decode.c:
*/
extern unsigned long ber_get_tag ( BerElement *ber );
extern unsigned long ber_skip_tag ( BerElement *ber, unsigned long *len );
extern unsigned long ber_peek_tag ( BerElement *ber, unsigned long *len );
extern unsigned long ber_get_int ( BerElement *ber, long *num );
extern unsigned long ber_get_stringb ( BerElement *ber, char *buf,
unsigned long *len );
extern unsigned long ber_get_stringa ( BerElement *ber, char **buf );
extern unsigned long ber_get_stringal ( BerElement *ber, struct berval **bv );
extern unsigned long ber_get_bitstringa ( BerElement *ber, char **buf,
unsigned long *len );
extern unsigned long ber_get_null ( BerElement *ber );
extern unsigned long ber_get_boolean ( BerElement *ber, int *boolval );
extern unsigned long ber_first_element ( BerElement *ber, unsigned long *len,
char **last );
extern unsigned long ber_next_element ( BerElement *ber, unsigned long *len,
char *last );
/* Variable length arguments not supported - sascha at free.de
extern unsigned long ber_scanf ( BerElement *ber, char *fmt, ... );
*/
extern void ber_bvfree ( struct berval *bv );
extern void ber_bvecfree ( struct berval **bv );
extern struct berval *ber_bvdup ( const struct berval *bv );
/* not yet
extern void ber_set_string_translators ( BerElement *ber,
BERTranslateProc encode_proc, BERTranslateProc decode_proc );
*/
/*
* in encode.c
*/
extern int ber_put_enum ( BerElement *ber, long num, unsigned long tag );
extern int ber_put_int ( BerElement *ber, long num, unsigned long tag );
extern int ber_put_ostring ( BerElement *ber, char *str, unsigned long len,
unsigned long tag );
extern int ber_put_string ( BerElement *ber, char *str, unsigned long tag );
extern int ber_put_bitstring ( BerElement *ber, char *str,
unsigned long bitlen, unsigned long tag );
extern int ber_put_null ( BerElement *ber, unsigned long tag );
extern int ber_put_boolean ( BerElement *ber, int boolval,
unsigned long tag );
extern int ber_start_seq ( BerElement *ber, unsigned long tag );
extern int ber_start_set ( BerElement *ber, unsigned long tag );
extern int ber_put_seq ( BerElement *ber );
extern int ber_put_set ( BerElement *ber );
/* Variable length arguments not supported - sascha at free.de
extern int ber_printf ( BerElement *ber, char *fmt, ... );
*/
/*
* in io.c:
*/
extern long ber_read ( BerElement *ber, char *buf, unsigned long len );
extern long ber_write ( BerElement *ber, char *buf, unsigned long len,
int nosos );
extern void ber_free ( BerElement *ber, int freebuf );
extern int ber_flush ( Sockbuf *sb, BerElement *ber, int freeit );
extern BerElement *ber_alloc ( void );
extern BerElement *der_alloc ( void );
extern BerElement *ber_alloc_t ( int options );
extern BerElement *ber_dup ( BerElement *ber );
extern void ber_dump ( BerElement *ber, int inout );
//extern void ber_sos_dump ( Seqorset *sos );
extern unsigned long ber_get_next ( Sockbuf *sb, unsigned long *len,
BerElement *ber );
extern BerElement *ber_init ( const struct berval *bv );
extern void ber_reset ( BerElement *ber, int was_writing );
More information about the python-ldap
mailing list