[Date Prev][Date Next] [Chronological] [Thread] [Top]

EBCDIC API



Hi,

I have started to write an EBCDIC API for OpenLDAP.
On EBCDIC machines OpenLDAP is compiled with all strings in ASCII. The side effect is that the client API is not usable in programs that have strings in EBCDIC (that is most of the existing code on such machines).


I am converting all the attributes values from ASCII to EBCDIC because I am not yet able to find whether an attribute is binary or a string.

Find enclosed the patch for ldap.h and the source file that contains the code to do the conversions.

Before expanding the API I would like to have some comments about my code.
Could someone make comments or give hints?

Cheers

Jean-Frederic
Index: ./include/ldap.h
===================================================================
RCS file: /repo/OpenLDAP/pkg/ldap/include/ldap.h,v
retrieving revision 1.208
diff -u -r1.208 ldap.h
--- ./include/ldap.h	1 May 2003 21:39:29 -0000	1.208
+++ ./include/ldap.h	31 Jul 2003 12:29:58 -0000
@@ -602,6 +602,24 @@
 #define LDAP_URL_ERR_BADFILTER	0x09	/* bad or missing filter */
 #define LDAP_URL_ERR_BADEXTS	0x0a	/* bad or missing extensions */
 
+#if defined(_OSD_POSIX) && ('A' == '\xC1')
+#define USE_EBCDIC_API
+#endif
+
+/* ebcdic API (in ldap_ebcdic.c) */
+#ifdef USE_EBCDIC_API
+#define ldap_init ldap_init_ebcdic
+#define ldap_initialize ldap_initialize_ebcdic
+#define ldap_simple_bind ldap_simple_bind_ebcdic
+#define ldap_simple_bind_s ldap_simple_bind_s_ebcdic
+#define ldap_err2string ldap_err2string_ebcdic
+#define ldap_search_ext ldap_search_ext_ebcdic
+#define ldap_search_ext_s ldap_search_ext_s_ebcdic
+#define ldap_first_attribute ldap_first_attribute_ebcdic
+#define ldap_next_attribute ldap_next_attribute_ebcdic
+#define ldap_get_values ldap_get_values_ebcdic
+#endif
+
 /*
  * The API draft spec says we should declare (or cause to be declared)
  * 'struct timeval'.   We don't.  See IETF LDAPext discussions.
#include <stdio.h>
#include <stdlib.h>
#include "ldap.h"

#ifdef ldap_init
#undef ldap_init
#endif
#ifdef ldap_initialize
#undef ldap_initialize
#endif
#ifdef ldap_simple_bind
#undef ldap_simple_bind
#endif
#ifdef ldap_simple_bind_s
#undef ldap_simple_bind_s
#endif
#ifdef ldap_err2string
#undef ldap_err2string
#endif
#ifdef ldap_search_ext
#undef ldap_search_ext
#endif
#ifdef ldap_search_ext_s
#undef ldap_search_ext_s
#endif
#ifdef ldap_first_attribute
#undef ldap_first_attribute
#endif
#ifdef ldap_next_attribute
#undef ldap_next_attribute
#endif
#ifdef ldap_get_values
#undef ldap_get_values
#endif

/* Alloc a buffer, copy and convert the input string into it */
static char *malloc2ebcdic(LDAP_CONST char *string)
{
	char *newstring;
	if (string == NULL)
		return(NULL);
	
	newstring = (char *) malloc(strlen(string));
	if (newstring == NULL)
		return(NULL);
	strcpy(newstring,string);
	_e2a(newstring);
	return(newstring);
}
static void safefree(char *string)
{
	if (string!=NULL)
		free(string);
}


/* From open.c */
LDAP *
ldap_init_ebcdic (
        LDAP_CONST char *host,
        int port )
{
	LDAP *ptr;
	char *new;
	new = malloc2ebcdic(host);
	if (new == NULL)
		return ((LDAP *)NULL);
	ptr = ldap_init(new,port);
	free(new);
	return(ptr);
}
int
ldap_initialize_ebcdic (
        LDAP **ldp,
        LDAP_CONST char *url )
{
	int i;
	char *new;
        new = malloc2ebcdic(url);
        if (new == NULL)
                return (-1);
	i = ldap_initialize(ldp,new);
	free(new);
	return(i);
}

/* From sbind.c */
int
ldap_simple_bind_ebcdic (
        LDAP *ld,
        LDAP_CONST char *who,
        LDAP_CONST char *passwd )
{
	char *newwho;
	char *newpasswd;
	int ret;
	newwho = malloc2ebcdic(who);
	newpasswd  = malloc2ebcdic(passwd);
	ret = ldap_simple_bind(ld,newwho,newpasswd);
	safefree(newwho);
	safefree(newpasswd);
	return(ret);
}
int
ldap_simple_bind_s_ebcdic (
        LDAP *ld,
        LDAP_CONST char *who,
        LDAP_CONST char *passwd )
{
	char *newwho;
	char *newpasswd;
	int ret;
	newwho = malloc2ebcdic(who);
	newpasswd  = malloc2ebcdic(passwd);
	ret = ldap_simple_bind_s(ld,newwho,newpasswd);
	safefree(newwho);
	safefree(newpasswd);	
	return(ret);
}

/* From error.c: */
char *
ldap_err2string_ebcdic ( int err )
{
	static char ebcdic_err[80];
	strcpy(ebcdic_err,ldap_err2string(err));
	_a2e(ebcdic_err);
	return(ebcdic_err);	
}

/* From search.c */
int
ldap_search_ext_ebcdic (
        LDAP                    *ld,
        LDAP_CONST char *base,
        int                             scope,
        LDAP_CONST char *filter,
        char                    **attrs,
        int                             attrsonly,
        LDAPControl             **serverctrls,
        LDAPControl             **clientctrls,
        struct timeval  *timeout,
        int                             sizelimit,
        int                             *msgidp )
{
	char *newbase;
	char *newfilter;
	char **newattrs;
	int i,j,ret;
	newbase  = malloc2ebcdic(base);
	newfilter  = malloc2ebcdic(filter);
	if (attrs == NULL)
		newattrs = NULL;
	else {
		i = 0;
		newattrs = attrs;
		while (newattrs[i]!=NULL)
			i++;
		newattrs = malloc(sizeof(char *)*i);
		j = i;
		for (i=0;i<j;i++)
			newattrs[i] = malloc2ebcdic(attrs[i]);
	}

	ret = ldap_search_ext (ld, newbase, scope,
		newfilter, newattrs, attrsonly, serverctrls,
		clientctrls, timeout, sizelimit, msgidp);

	safefree(newbase);
	safefree(newfilter);
	if (newattrs!=NULL) {
		for (i=0;i<j;i++)
			safefree(newattrs[i]);
		free(newattrs);
	}
	return (ret);
}
 
int
ldap_search_ext_s_ebcdic (
        LDAP                    *ld,
        LDAP_CONST char *base,
        int                             scope,
        LDAP_CONST char *filter,
        char                    **attrs,
        int                             attrsonly,
        LDAPControl             **serverctrls,
        LDAPControl             **clientctrls,
        struct timeval  *timeout,
        int                             sizelimit,
        LDAPMessage             **res )
{
	char *newbase;
	char *newfilter;
	char **newattrs;
	int i,j,ret;
	newbase  = malloc2ebcdic(base);
	newfilter  = malloc2ebcdic(filter);
	if (attrs == NULL)
		newattrs = NULL;
	else {
		i = 0;
		newattrs = attrs;
		while (newattrs[i]!=NULL)
			i++;
		newattrs = malloc(sizeof(char *)*i);
		j = i;
		for (i=0;i<j;i++)
			newattrs[i] = malloc2ebcdic(attrs[i]);
	}

	ret = ldap_search_ext_s (ld, newbase, scope,
		newfilter, newattrs, attrsonly, serverctrls,
		clientctrls, timeout, sizelimit, res);

	safefree(newbase);
	safefree(newfilter);
	if (newattrs!=NULL) {
		for (i=0;i<j;i++)
			safefree(newattrs[i]);
		free(newattrs);
	}
	return (ret);
}

/* From getattr.c */
char *
ldap_first_attribute_ebcdic (
        LDAP *ld,
        LDAPMessage *entry,
        BerElement **ber )
{
	char *ptr;
	ptr = ldap_first_attribute(ld,entry,ber);
	if (ptr!=NULL)
		_a2e(ptr);
	return(ptr);
}
 
char *
ldap_next_attribute_ebcdic (
        LDAP *ld,
        LDAPMessage *entry,
        BerElement *ber )
{
	char *ptr;
	ptr = ldap_next_attribute(ld,entry,ber);
	if (ptr!=NULL)
		_a2e(ptr);
	return(ptr);
}
/* From getvalues.c */
char **
ldap_get_values_ebcdic (        /* deprecated */
        LDAP *ld,
        LDAPMessage *entry,
        LDAP_CONST char *target )
{
	char **ptr;
	char *newtarget;
	int i=0;
	newtarget = malloc2ebcdic(target);
	ptr = ldap_get_values(ld,entry,newtarget);
	safefree(newtarget);
	/* I am converting all the values... that sounds wrong! */
	if (ptr!=NULL) {
		while(ptr[i]!=NULL) {
			_a2e(ptr[i]);
			i++;
		}
	}
	return(ptr);
}