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