]> git.sur5r.net Git - openldap/commitdiff
Move LDIF routines liblutil
authorKurt Zeilenga <kurt@openldap.org>
Tue, 25 Nov 2003 23:19:47 +0000 (23:19 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Tue, 25 Nov 2003 23:19:47 +0000 (23:19 +0000)
libraries/Makefile.in
libraries/libldif/Makefile.in [deleted file]
libraries/libldif/fetch.c [deleted file]
libraries/libldif/libldif.dsp [deleted file]
libraries/libldif/line64.c [deleted file]
libraries/liblutil/Makefile.in
libraries/liblutil/fetch.c [new file with mode: 0644]
libraries/liblutil/ldif.c [new file with mode: 0644]
libraries/librewrite/Makefile.in

index b344a6b7b708423db096228e0a6e3c24e5f50e0e..06b3d8c1af138a6bc7d845604109094ab712c042 100644 (file)
@@ -4,8 +4,12 @@
 ##
 ## Libraries Makefile for OpenLDAP
 
-SUBDIRS= liblutil liblber \
-       liblunicode libldif \
+SUBDIRS= \
+       liblutil \
+       liblber \
+       liblunicode \
        libldap libldap_r \
-       libavl libldbm librewrite
+       libavl \
+       libldbm \
+       librewrite
 
diff --git a/libraries/libldif/Makefile.in b/libraries/libldif/Makefile.in
deleted file mode 100644 (file)
index 66fbb37..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-# $OpenLDAP$
-## Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
-## COPYING RESTRICTIONS APPLY, see COPYRIGHT file
-##
-## Makefile for -lldif
-##
-
-LIBRARY        = libldif.a
-SRCS   = line64.c fetch.c
-OBJS   = line64.o fetch.o
-
-LDAP_INCDIR= ../../include       
-LDAP_LIBDIR= ../../libraries
-
diff --git a/libraries/libldif/fetch.c b/libraries/libldif/fetch.c
deleted file mode 100644 (file)
index cb4d81b..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-/* line64.c - routines for dealing with the slapd line format */
-/* $OpenLDAP$ */
-/*
- * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
- * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
- */
-
-#include "portable.h"
-
-#include <stdio.h>
-
-#include <ac/stdlib.h>
-
-#include <ac/string.h>
-#include <ac/socket.h>
-#include <ac/time.h>
-
-#ifdef HAVE_FETCH
-#include <fetch.h>
-#endif
-
-#include "ldap_log.h"
-#include "lber_pvt.h"
-#include "ldap_pvt.h"
-#include "ldap_config.h"
-#include "ldif.h"
-
-int
-ldif_fetch_url(
-    LDAP_CONST char    *urlstr,
-    char       **valuep,
-    ber_len_t *vlenp
-)
-{
-       FILE *url;
-       char buffer[1024];
-       char *p = NULL;
-       size_t total;
-       size_t bytes;
-
-       *valuep = NULL;
-       *vlenp = 0;
-
-#ifdef HAVE_FETCH
-       url = fetchGetURL( (char*) urlstr, "" );
-
-#else
-       if( strncasecmp( "file://", urlstr, sizeof("file://")-1 ) == 0 ) {
-               p = strchr( &urlstr[sizeof("file://")-1], '/' );
-               if( p == NULL ) {
-                       return -1;
-               }
-
-               /* we don't check for LDAP_DIRSEP since URLs should contain '/' */
-               if( *p != '/' ) {
-                       /* skip over false root */
-                       p++;
-               }
-
-               p = ber_strdup( p );
-               ldap_pvt_hex_unescape( p );
-
-               url = fopen( p, "rb" );
-
-       } else {
-               return -1;
-       }
-#endif
-
-       if( url == NULL ) {
-               return -1;
-       }
-
-       total = 0;
-
-       while( (bytes = fread( buffer, 1, sizeof(buffer), url )) != 0 ) {
-               char *newp = ber_memrealloc( p, total + bytes + 1 );
-               if( newp == NULL ) {
-                       ber_memfree( p );
-                       fclose( url );
-                       return -1;
-               }
-               p = newp;
-               AC_MEMCPY( &p[total], buffer, bytes );
-               total += bytes;
-       }
-
-       fclose( url );
-
-       if( total == 0 ) {
-               char *newp = ber_memrealloc( p, 1 );
-               if( newp == NULL ) {
-                       ber_memfree( p );
-                       return -1;
-               }
-               p = newp;
-       }
-
-       p[total] = '\0';
-       *valuep = p;
-       *vlenp = total;
-
-       return 0;
-}
diff --git a/libraries/libldif/libldif.dsp b/libraries/libldif/libldif.dsp
deleted file mode 100644 (file)
index 112f565..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-# Microsoft Developer Studio Project File - Name="libldif" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 5.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Static Library" 0x0104
-
-CFG=libldif - Win32 Single Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE 
-!MESSAGE NMAKE /f "libldif.mak".
-!MESSAGE 
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE 
-!MESSAGE NMAKE /f "libldif.mak" CFG="libldif - Win32 Single Debug"
-!MESSAGE 
-!MESSAGE Possible choices for configuration are:
-!MESSAGE 
-!MESSAGE "libldif - Win32 Release" (based on "Win32 (x86) Static Library")
-!MESSAGE "libldif - Win32 Debug" (based on "Win32 (x86) Static Library")
-!MESSAGE "libldif - Win32 Single Debug" (based on "Win32 (x86) Static Library")
-!MESSAGE "libldif - Win32 Single Release" (based on\
- "Win32 (x86) Static Library")
-!MESSAGE 
-
-# Begin Project
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-
-!IF  "$(CFG)" == "libldif - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "..\..\Release"
-# PROP Intermediate_Dir "..\..\Release\libldif"
-# PROP Target_Dir ""
-RSC=rc.exe
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo /out:"..\..\Release\oldif32.lib"
-
-!ELSEIF  "$(CFG)" == "libldif - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "..\..\Debug"
-# PROP Intermediate_Dir "..\..\Debug\libldif"
-# PROP Target_Dir ""
-RSC=rc.exe
-# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MTd /W3 /GX /Z7 /Od /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX /FD /c
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo /out:"..\..\Debug\oldif32.lib"
-
-!ELSEIF  "$(CFG)" == "libldif - Win32 Single Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "libldif_"
-# PROP BASE Intermediate_Dir "libldif_"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "..\..\SDebug"
-# PROP Intermediate_Dir "..\..\SDebug\libldif"
-# PROP Target_Dir ""
-RSC=rc.exe
-# ADD BASE CPP /nologo /MTd /W3 /GX /Z7 /Od /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /W3 /GX /Z7 /Od /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX /FD /c
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo /out:"..\Debug\oldif32.lib"
-# ADD LIB32 /nologo /out:"..\..\SDebug\oldif32.lib"
-
-!ELSEIF  "$(CFG)" == "libldif - Win32 Single Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "libldif0"
-# PROP BASE Intermediate_Dir "libldif0"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "..\..\SRelease"
-# PROP Intermediate_Dir "..\..\SRelease\libldif"
-# PROP Target_Dir ""
-RSC=rc.exe
-# ADD BASE CPP /nologo /W3 /GX /O2 /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /W3 /GX /O2 /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo /out:"..\Release\oldif32.lib"
-# ADD LIB32 /nologo /out:"..\..\SRelease\oldif32.lib"
-
-!ENDIF 
-
-# Begin Target
-
-# Name "libldif - Win32 Release"
-# Name "libldif - Win32 Debug"
-# Name "libldif - Win32 Single Debug"
-# Name "libldif - Win32 Single Release"
-# Begin Source File
-
-SOURCE=.\fetch.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\include\ldif.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\line64.c
-# End Source File
-# End Target
-# End Project
diff --git a/libraries/libldif/line64.c b/libraries/libldif/line64.c
deleted file mode 100644 (file)
index b82933d..0000000
+++ /dev/null
@@ -1,627 +0,0 @@
-/* line64.c - routines for dealing with the slapd line format */
-/* $OpenLDAP$ */
-/*
- * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
- * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
- */
-
-#include "portable.h"
-
-#include <stdio.h>
-
-#include <ac/stdlib.h>
-#include <ac/ctype.h>
-
-#include <ac/string.h>
-#include <ac/socket.h>
-#include <ac/time.h>
-
-int ldif_debug = 0;
-
-#include "ldap_log.h"
-#include "lber_pvt.h"
-#include "ldif.h"
-
-#define RIGHT2                 0x03
-#define RIGHT4                 0x0f
-#define CONTINUED_LINE_MARKER  '\r'
-
-#ifdef CSRIMALLOC
-#define ber_memalloc malloc
-#define ber_memcalloc calloc
-#define ber_memrealloc realloc
-#define ber_strdup strdup
-#endif
-
-static const char nib2b64[0x40] =
-        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-static const unsigned char b642nib[0x80] = {
-       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-       0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, 0xff, 0x3f,
-       0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
-       0x3c, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-       0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
-       0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
-       0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
-       0x17, 0x18, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff,
-       0xff, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
-       0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
-       0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
-       0x31, 0x32, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff
-};
-
-/*
- * ldif_parse_line - takes a line of the form "type:[:] value" and splits it
- * into components "type" and "value".  if a double colon separates type from
- * value, then value is encoded in base 64, and parse_line un-decodes it
- * (in place) before returning.
- */
-
-int
-ldif_parse_line(
-    LDAP_CONST char    *line,
-    char       **typep,
-    char       **valuep,
-    ber_len_t *vlenp
-)
-{
-       char    *s, *p, *d; 
-       char    nib;
-       int     b64, url;
-       char    *freeme, *type, *value;
-       ber_len_t vlen;
-
-       *typep = NULL;
-       *valuep = NULL;
-       *vlenp = 0;
-
-       /* skip any leading space */
-       while ( isspace( (unsigned char) *line ) ) {
-               line++;
-       }
-
-       freeme = ber_strdup( line );
-
-       if( freeme == NULL ) {
-               ber_pvt_log_printf( LDAP_DEBUG_ANY, ldif_debug,
-                       _("ldif_parse_line: line malloc failed\n"));
-               return( -1 );
-       }
-
-       type = freeme;
-
-       s = strchr( type, ':' );
-
-       if ( s == NULL ) {
-               ber_pvt_log_printf( LDAP_DEBUG_PARSE, ldif_debug,
-                       _("ldif_parse_line: missing ':' after %s\n"),
-                       type );
-               ber_memfree( freeme );
-               return( -1 );
-       }
-
-       /* trim any space between type and : */
-       for ( p = &s[-1]; p > type && isspace( * (unsigned char *) p ); p-- ) {
-               *p = '\0';
-       }
-       *s++ = '\0';
-
-       url = 0;
-       b64 = 0;
-
-       if ( *s == '<' ) {
-               s++;
-               url = 1;
-
-       } else if ( *s == ':' ) {
-               /* base 64 encoded value */
-               s++;
-               b64 = 1;
-       }
-
-       /* skip space between : and value */
-       while ( isspace( (unsigned char) *s ) ) {
-               s++;
-       }
-
-       /* check for continued line markers that should be deleted */
-       for ( p = s, d = s; *p; p++ ) {
-               if ( *p != CONTINUED_LINE_MARKER )
-                       *d++ = *p;
-       }
-       *d = '\0';
-
-       if ( b64 ) {
-               char *byte = s;
-
-               if ( *s == '\0' ) {
-                       /* no value is present, error out */
-                       ber_pvt_log_printf( LDAP_DEBUG_PARSE, ldif_debug,
-                               _("ldif_parse_line: %s missing base64 value\n"), type );
-                       ber_memfree( freeme );
-                       return( -1 );
-               }
-
-               byte = value = s;
-
-               for ( p = s, vlen = 0; p < d; p += 4, vlen += 3 ) {
-                       int i;
-                       for ( i = 0; i < 4; i++ ) {
-                               if ( p[i] != '=' && (p[i] & 0x80 ||
-                                   b642nib[ p[i] & 0x7f ] > 0x3f) ) {
-                                       ber_pvt_log_printf( LDAP_DEBUG_ANY, ldif_debug,
-                                               _("ldif_parse_line: %s: invalid base64 encoding"
-                                               " char (%c) 0x%x\n"),
-                                           type, p[i], p[i] );
-                                       ber_memfree( freeme );
-                                       return( -1 );
-                               }
-                       }
-
-                       /* first digit */
-                       nib = b642nib[ p[0] & 0x7f ];
-                       byte[0] = nib << 2;
-                       /* second digit */
-                       nib = b642nib[ p[1] & 0x7f ];
-                       byte[0] |= nib >> 4;
-                       byte[1] = (nib & RIGHT4) << 4;
-                       /* third digit */
-                       if ( p[2] == '=' ) {
-                               vlen += 1;
-                               break;
-                       }
-                       nib = b642nib[ p[2] & 0x7f ];
-                       byte[1] |= nib >> 2;
-                       byte[2] = (nib & RIGHT2) << 6;
-                       /* fourth digit */
-                       if ( p[3] == '=' ) {
-                               vlen += 2;
-                               break;
-                       }
-                       nib = b642nib[ p[3] & 0x7f ];
-                       byte[2] |= nib;
-
-                       byte += 3;
-               }
-               s[ vlen ] = '\0';
-
-       } else if ( url ) {
-               if ( *s == '\0' ) {
-                       /* no value is present, error out */
-                       ber_pvt_log_printf( LDAP_DEBUG_PARSE, ldif_debug,
-                               _("ldif_parse_line: %s missing URL value\n"), type );
-                       ber_memfree( freeme );
-                       return( -1 );
-               }
-
-               if( ldif_fetch_url( s, &value, &vlen ) ) {
-                       ber_pvt_log_printf( LDAP_DEBUG_ANY, ldif_debug,
-                               _("ldif_parse_line: %s: URL \"%s\" fetch failed\n"),
-                               type, s );
-                       ber_memfree( freeme );
-                       return( -1 );
-               }
-
-       } else {
-               value = s;
-               vlen = (int) (d - s);
-       }
-
-       type = ber_strdup( type );
-
-       if( type == NULL ) {
-               ber_pvt_log_printf( LDAP_DEBUG_ANY, ldif_debug,
-                       _("ldif_parse_line: type malloc failed\n"));
-               if( url ) ber_memfree( value );
-               ber_memfree( freeme );
-               return( -1 );
-       }
-
-       if( !url ) {
-               p = ber_memalloc( vlen + 1 );
-               if( p == NULL ) {
-                       ber_pvt_log_printf( LDAP_DEBUG_ANY, ldif_debug,
-                               _("ldif_parse_line: value malloc failed\n"));
-                       ber_memfree( type );
-                       ber_memfree( freeme );
-                       return( -1 );
-               }
-               AC_MEMCPY( p, value, vlen );
-               p[vlen] = '\0';
-               value = p;
-       }
-
-       ber_memfree( freeme );
-
-       *typep = type;
-       *valuep = value;
-       *vlenp = vlen;
-
-       return( 0 );
-}
-
-/*
- * ldif_getline - return the next "line" (minus newline) of input from a
- * string buffer of lines separated by newlines, terminated by \n\n
- * or \0.  this routine handles continued lines, bundling them into
- * a single big line before returning.  if a line begins with a white
- * space character, it is a continuation of the previous line. the white
- * space character (nb: only one char), and preceeding newline are changed
- * into CONTINUED_LINE_MARKER chars, to be deleted later by the
- * ldif_parse_line() routine above.
- *
- * ldif_getline will skip over any line which starts '#'.
- *
- * ldif_getline takes a pointer to a pointer to the buffer on the first call,
- * which it updates and must be supplied on subsequent calls.
- */
-
-char *
-ldif_getline( char **next )
-{
-       char *line;
-
-       do {
-               if ( *next == NULL || **next == '\n' || **next == '\0' ) {
-                       return( NULL );
-               }
-
-               line = *next;
-
-               while ( (*next = strchr( *next, '\n' )) != NULL ) {
-#if CONTINUED_LINE_MARKER != '\r'
-                       if ( (*next)[-1] == '\r' ) {
-                               (*next)[-1] = CONTINUED_LINE_MARKER;
-                       }
-#endif
-
-                       if ( (*next)[1] != ' ' ) {
-                               if ( (*next)[1] == '\r' && (*next)[2] == '\n' ) {
-                                       *(*next)++ = '\0';
-                               }
-                               *(*next)++ = '\0';
-                               break;
-                       }
-
-                       **next = CONTINUED_LINE_MARKER;
-                       (*next)[1] = CONTINUED_LINE_MARKER;
-                       (*next)++;
-               }
-       } while( *line == '#' );
-
-       return( line );
-}
-
-/* compatibility with U-Mich off by one bug */
-#define LDIF_KLUDGE 1
-
-void
-ldif_sput(
-       char **out,
-       int type,
-       LDAP_CONST char *name,
-       LDAP_CONST char *val,
-       ber_len_t vlen )
-{
-       const unsigned char *byte, *stop;
-       unsigned char   buf[3];
-       unsigned long   bits;
-       char            *save;
-       int             pad;
-       int             namelen = 0;
-
-       ber_len_t savelen;
-       ber_len_t len=0;
-       ber_len_t i;
-
-       /* prefix */
-       switch( type ) {
-       case LDIF_PUT_COMMENT:
-               *(*out)++ = '#';
-               len++;
-
-               if( vlen ) {
-                       *(*out)++ = ' ';
-                       len++;
-               }
-
-               break;
-
-       case LDIF_PUT_SEP:
-               *(*out)++ = '\n';
-               return;
-       }
-
-       /* name (attribute type) */
-       if( name != NULL ) {
-               /* put the name + ":" */
-               namelen = strlen(name);
-               strcpy(*out, name);
-               *out += namelen;
-               len += namelen;
-
-               if( type != LDIF_PUT_COMMENT ) {
-                       *(*out)++ = ':';
-                       len++;
-               }
-
-       }
-#ifdef LDAP_DEBUG
-       else {
-               assert( type == LDIF_PUT_COMMENT );
-       }
-#endif
-
-       if( vlen == 0 ) {
-               *(*out)++ = '\n';
-               return;
-       }
-
-       switch( type ) {
-       case LDIF_PUT_NOVALUE:
-               *(*out)++ = '\n';
-               return;
-
-       case LDIF_PUT_URL: /* url value */
-               *(*out)++ = '<';
-               len++;
-               break;
-
-       case LDIF_PUT_B64: /* base64 value */
-               *(*out)++ = ':';
-               len++;
-               break;
-       }
-
-       switch( type ) {
-       case LDIF_PUT_TEXT:
-       case LDIF_PUT_URL:
-       case LDIF_PUT_B64:
-               *(*out)++ = ' ';
-               len++;
-               /* fall-thru */
-
-       case LDIF_PUT_COMMENT:
-               /* pre-encoded names */
-               for ( i=0; i < vlen; i++ ) {
-                       if ( len > LDIF_LINE_WIDTH ) {
-                               *(*out)++ = '\n';
-                               *(*out)++ = ' ';
-                               len = 1;
-                       }
-
-                       *(*out)++ = val[i];
-                       len++;
-               }
-               *(*out)++ = '\n';
-               return;
-       }
-
-       save = *out;
-       savelen = len;
-
-       *(*out)++ = ' ';
-       len++;
-
-       stop = (const unsigned char *) (val + vlen);
-
-       if ( type == LDIF_PUT_VALUE
-               && isgraph( (unsigned char) val[0] ) && val[0] != ':' && val[0] != '<'
-               && isgraph( (unsigned char) val[vlen-1] )
-#ifndef LDAP_BINARY_DEBUG
-               && strstr( name, ";binary" ) == NULL
-#endif
-#ifndef LDAP_PASSWD_DEBUG
-               && (namelen != (sizeof("userPassword")-1)
-               || strcasecmp( name, "userPassword" ) != 0)     /* encode userPassword */
-               && (namelen != (sizeof("2.5.4.35")-1) 
-               || strcasecmp( name, "2.5.4.35" ) != 0)         /* encode userPassword */
-#endif
-       ) {
-               int b64 = 0;
-
-               for ( byte = (const unsigned char *) val; byte < stop;
-                   byte++, len++ )
-               {
-                       if ( !isascii( *byte ) || !isprint( *byte ) ) {
-                               b64 = 1;
-                               break;
-                       }
-                       if ( len > LDIF_LINE_WIDTH+LDIF_KLUDGE ) {
-                               *(*out)++ = '\n';
-                               *(*out)++ = ' ';
-                               len = 1;
-                       }
-                       *(*out)++ = *byte;
-               }
-
-               if( !b64 ) {
-                       *(*out)++ = '\n';
-                       return;
-               }
-       }
-
-       *out = save;
-       *(*out)++ = ':';
-       *(*out)++ = ' ';
-       len = savelen + 2;
-
-       /* convert to base 64 (3 bytes => 4 base 64 digits) */
-       for ( byte = (const unsigned char *) val;
-               byte < stop - 2;
-           byte += 3 )
-       {
-               bits = (byte[0] & 0xff) << 16;
-               bits |= (byte[1] & 0xff) << 8;
-               bits |= (byte[2] & 0xff);
-
-               for ( i = 0; i < 4; i++, len++, bits <<= 6 ) {
-                       if ( len > LDIF_LINE_WIDTH+LDIF_KLUDGE ) {
-                               *(*out)++ = '\n';
-                               *(*out)++ = ' ';
-                               len = 1;
-                       }
-
-                       /* get b64 digit from high order 6 bits */
-                       *(*out)++ = nib2b64[ (bits & 0xfc0000L) >> 18 ];
-               }
-       }
-
-       /* add padding if necessary */
-       if ( byte < stop ) {
-               for ( i = 0; byte + i < stop; i++ ) {
-                       buf[i] = byte[i];
-               }
-               for ( pad = 0; i < 3; i++, pad++ ) {
-                       buf[i] = '\0';
-               }
-               byte = buf;
-               bits = (byte[0] & 0xff) << 16;
-               bits |= (byte[1] & 0xff) << 8;
-               bits |= (byte[2] & 0xff);
-
-               for ( i = 0; i < 4; i++, len++, bits <<= 6 ) {
-                       if ( len > LDIF_LINE_WIDTH+LDIF_KLUDGE ) {
-                               *(*out)++ = '\n';
-                               *(*out)++ = ' ';
-                               len = 1;
-                       }
-
-                       if( i + pad < 4 ) {
-                               /* get b64 digit from low order 6 bits */
-                               *(*out)++ = nib2b64[ (bits & 0xfc0000L) >> 18 ];
-                       } else {
-                               *(*out)++ = '=';
-                       }
-               }
-       }
-       *(*out)++ = '\n';
-}
-
-
-/*
- * ldif_type_and_value return BER malloc'd, zero-terminated LDIF line
- */
-char *
-ldif_put(
-       int type,
-       LDAP_CONST char *name,
-       LDAP_CONST char *val,
-       ber_len_t vlen )
-{
-    char       *buf, *p;
-    ber_len_t nlen;
-
-    nlen = ( name != NULL ) ? strlen( name ) : 0;
-
-       buf = (char *) ber_memalloc( LDIF_SIZE_NEEDED( nlen, vlen ) + 1 );
-
-    if ( buf == NULL ) {
-               ber_pvt_log_printf( LDAP_DEBUG_ANY, ldif_debug,
-                       _("ldif_type_and_value: malloc failed!"));
-               return NULL;
-    }
-
-    p = buf;
-    ldif_sput( &p, type, name, val, vlen );
-    *p = '\0';
-
-    return( buf );
-}
-
-int ldif_is_not_printable(
-       LDAP_CONST char *val,
-       ber_len_t vlen )
-{
-       if( vlen == 0 || val == NULL  ) {
-               return -1;
-       }
-
-       if( isgraph( (unsigned char) val[0] ) && val[0] != ':' && val[0] != '<' &&
-               isgraph( (unsigned char) val[vlen-1] ) )
-       {
-               ber_len_t i;
-
-               for ( i = 0; val[i]; i++ ) {
-                       if ( !isascii( val[i] ) || !isprint( val[i] ) ) {
-                               return 1;
-                       }
-               }
-
-               return 0;
-       }
-
-       return 1;
-}
-
-/*
- * slap_read_ldif - read an ldif record.  Return 1 for success, 0 for EOF.
- */
-int
-ldif_read_record(
-       FILE        *fp,
-       int         *lno,               /* ptr to line number counter              */
-       char        **bufp,     /* ptr to malloced output buffer           */
-       int         *buflenp )  /* ptr to length of *bufp                  */
-{
-       char        linebuf[BUFSIZ], *line, *nbufp;
-       ber_len_t   lcur = 0, len, linesize;
-       int         last_ch = '\n', found_entry = 0, stop, top_comment = 0;
-
-       line     = linebuf;
-       linesize = sizeof( linebuf );
-
-       for ( stop = feof( fp );  !stop;  last_ch = line[len-1] ) {
-               if ( fgets( line, linesize, fp ) == NULL ) {
-                       stop = 1;
-                       /* Add \n in case the file does not end with newline */
-                       line = "\n";
-               }
-               len = strlen( line );
-
-               if ( last_ch == '\n' ) {
-                       (*lno)++;
-
-                       if ( line[0] == '\n' ) {
-                               if ( !found_entry ) {
-                                       lcur = 0;
-                                       top_comment = 0;
-                                       continue;
-                               }
-                               break;
-                       }
-
-                       if ( !found_entry ) {
-                               if ( line[0] == '#' ) {
-                                       top_comment = 1;
-                               } else if ( ! ( top_comment && line[0] == ' ' ) ) {
-                                       /* Found a new entry */
-                                       found_entry = 1;
-
-                                       if ( isdigit( (unsigned char) line[0] ) ) {
-                                               /* skip index */
-                                               continue;
-                                       }
-                               }
-                       }                       
-               }
-
-               if ( *buflenp - lcur <= len ) {
-                       *buflenp += len + BUFSIZ;
-                       nbufp = ber_memrealloc( *bufp, *buflenp );
-                       if( nbufp == NULL ) {
-                               return 0;
-                       }
-                       *bufp = nbufp;
-               }
-               strcpy( *bufp + lcur, line );
-               lcur += len;
-       }
-
-       return( found_entry );
-}
index b8e27695f9ccf560a984c4ff89e5e071c5d2e076..238b1a68ea1885685d1d7aac45a51f800af2a4a4 100644 (file)
@@ -15,10 +15,12 @@ UNIX_OBJS = detach.o
 
 SRCS   = base64.c csn.c entropy.c sasl.c signal.c hash.c passfile.c \
        md5.c passwd.c sha1.c getpass.c lockf.c utils.c uuid.c sockpair.c \
+       ldif.c fetch.c \
        @LIBSRCS@ $(@PLAT@_SRCS)
 
 OBJS   = base64.o csn.o entropy.o sasl.o signal.o hash.o passfile.o \
        md5.o passwd.o sha1.o getpass.o lockf.o utils.o uuid.o sockpair.o \
+       ldif.o fetch.o \
        @LIBOBJS@ $(@PLAT@_OBJS)
 
 LDAP_INCDIR= ../../include       
diff --git a/libraries/liblutil/fetch.c b/libraries/liblutil/fetch.c
new file mode 100644 (file)
index 0000000..01ff183
--- /dev/null
@@ -0,0 +1,118 @@
+/* fetch.c - routines for fetching data at URLs */
+/* $OpenLDAP$ */
+/* $OpenLDAP$ */
+/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
+ *
+ * Copyright 1999-2003 The OpenLDAP Foundation.
+ * Portions Copyright 1999-2003 Kurt D. Zeilenga.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted only as authorized by the OpenLDAP
+ * Public License.
+ *
+ * A copy of this license is available in the file LICENSE in the
+ * top-level directory of the distribution or, alternatively, at
+ * <http://www.OpenLDAP.org/license.html>.
+ */
+/* This work was initially developed by Kurt D. Zeilenga for
+ * inclusion in OpenLDAP Software.
+ */
+
+#include "portable.h"
+
+#include <stdio.h>
+
+#include <ac/stdlib.h>
+
+#include <ac/string.h>
+#include <ac/socket.h>
+#include <ac/time.h>
+
+#ifdef HAVE_FETCH
+#include <fetch.h>
+#endif
+
+#include "ldap_log.h"
+#include "lber_pvt.h"
+#include "ldap_pvt.h"
+#include "ldap_config.h"
+#include "ldif.h"
+
+int
+ldif_fetch_url(
+    LDAP_CONST char    *urlstr,
+    char       **valuep,
+    ber_len_t *vlenp
+)
+{
+       FILE *url;
+       char buffer[1024];
+       char *p = NULL;
+       size_t total;
+       size_t bytes;
+
+       *valuep = NULL;
+       *vlenp = 0;
+
+#ifdef HAVE_FETCH
+       url = fetchGetURL( (char*) urlstr, "" );
+
+#else
+       if( strncasecmp( "file://", urlstr, sizeof("file://")-1 ) == 0 ) {
+               p = strchr( &urlstr[sizeof("file://")-1], '/' );
+               if( p == NULL ) {
+                       return -1;
+               }
+
+               /* we don't check for LDAP_DIRSEP since URLs should contain '/' */
+               if( *p != '/' ) {
+                       /* skip over false root */
+                       p++;
+               }
+
+               p = ber_strdup( p );
+               ldap_pvt_hex_unescape( p );
+
+               url = fopen( p, "rb" );
+
+       } else {
+               return -1;
+       }
+#endif
+
+       if( url == NULL ) {
+               return -1;
+       }
+
+       total = 0;
+
+       while( (bytes = fread( buffer, 1, sizeof(buffer), url )) != 0 ) {
+               char *newp = ber_memrealloc( p, total + bytes + 1 );
+               if( newp == NULL ) {
+                       ber_memfree( p );
+                       fclose( url );
+                       return -1;
+               }
+               p = newp;
+               AC_MEMCPY( &p[total], buffer, bytes );
+               total += bytes;
+       }
+
+       fclose( url );
+
+       if( total == 0 ) {
+               char *newp = ber_memrealloc( p, 1 );
+               if( newp == NULL ) {
+                       ber_memfree( p );
+                       return -1;
+               }
+               p = newp;
+       }
+
+       p[total] = '\0';
+       *valuep = p;
+       *vlenp = total;
+
+       return 0;
+}
diff --git a/libraries/liblutil/ldif.c b/libraries/liblutil/ldif.c
new file mode 100644 (file)
index 0000000..ce6c85e
--- /dev/null
@@ -0,0 +1,649 @@
+/* ldif.c - routines for dealing with LDIF files */
+/* $OpenLDAP$ */
+/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
+ *
+ * Copyright 1998-2003 The OpenLDAP Foundation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted only as authorized by the OpenLDAP
+ * Public License.
+ *
+ * A copy of this license is available in the file LICENSE in the
+ * top-level directory of the distribution or, alternatively, at
+ * <http://www.OpenLDAP.org/license.html>.
+ */
+/* Portions Copyright (c) 1992-1996 Regents of the University of Michigan.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and that due credit is given
+ * to the University of Michigan at Ann Arbor.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.  This
+ * software is provided ``as is'' without express or implied warranty.
+ */
+/* This work was originally developed by the University of Michigan
+ * and distributed as part of U-MICH LDAP.
+ */
+
+#include "portable.h"
+
+#include <stdio.h>
+
+#include <ac/stdlib.h>
+#include <ac/ctype.h>
+
+#include <ac/string.h>
+#include <ac/socket.h>
+#include <ac/time.h>
+
+int ldif_debug = 0;
+
+#include "ldap_log.h"
+#include "lber_pvt.h"
+#include "ldif.h"
+
+#define RIGHT2                 0x03
+#define RIGHT4                 0x0f
+#define CONTINUED_LINE_MARKER  '\r'
+
+#ifdef CSRIMALLOC
+#define ber_memalloc malloc
+#define ber_memcalloc calloc
+#define ber_memrealloc realloc
+#define ber_strdup strdup
+#endif
+
+static const char nib2b64[0x40] =
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+static const unsigned char b642nib[0x80] = {
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, 0xff, 0x3f,
+       0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
+       0x3c, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
+       0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
+       0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
+       0x17, 0x18, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
+       0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
+       0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
+       0x31, 0x32, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff
+};
+
+/*
+ * ldif_parse_line - takes a line of the form "type:[:] value" and splits it
+ * into components "type" and "value".  if a double colon separates type from
+ * value, then value is encoded in base 64, and parse_line un-decodes it
+ * (in place) before returning.
+ */
+
+int
+ldif_parse_line(
+    LDAP_CONST char    *line,
+    char       **typep,
+    char       **valuep,
+    ber_len_t *vlenp
+)
+{
+       char    *s, *p, *d; 
+       char    nib;
+       int     b64, url;
+       char    *freeme, *type, *value;
+       ber_len_t vlen;
+
+       *typep = NULL;
+       *valuep = NULL;
+       *vlenp = 0;
+
+       /* skip any leading space */
+       while ( isspace( (unsigned char) *line ) ) {
+               line++;
+       }
+
+       freeme = ber_strdup( line );
+
+       if( freeme == NULL ) {
+               ber_pvt_log_printf( LDAP_DEBUG_ANY, ldif_debug,
+                       _("ldif_parse_line: line malloc failed\n"));
+               return( -1 );
+       }
+
+       type = freeme;
+
+       s = strchr( type, ':' );
+
+       if ( s == NULL ) {
+               ber_pvt_log_printf( LDAP_DEBUG_PARSE, ldif_debug,
+                       _("ldif_parse_line: missing ':' after %s\n"),
+                       type );
+               ber_memfree( freeme );
+               return( -1 );
+       }
+
+       /* trim any space between type and : */
+       for ( p = &s[-1]; p > type && isspace( * (unsigned char *) p ); p-- ) {
+               *p = '\0';
+       }
+       *s++ = '\0';
+
+       url = 0;
+       b64 = 0;
+
+       if ( *s == '<' ) {
+               s++;
+               url = 1;
+
+       } else if ( *s == ':' ) {
+               /* base 64 encoded value */
+               s++;
+               b64 = 1;
+       }
+
+       /* skip space between : and value */
+       while ( isspace( (unsigned char) *s ) ) {
+               s++;
+       }
+
+       /* check for continued line markers that should be deleted */
+       for ( p = s, d = s; *p; p++ ) {
+               if ( *p != CONTINUED_LINE_MARKER )
+                       *d++ = *p;
+       }
+       *d = '\0';
+
+       if ( b64 ) {
+               char *byte = s;
+
+               if ( *s == '\0' ) {
+                       /* no value is present, error out */
+                       ber_pvt_log_printf( LDAP_DEBUG_PARSE, ldif_debug,
+                               _("ldif_parse_line: %s missing base64 value\n"), type );
+                       ber_memfree( freeme );
+                       return( -1 );
+               }
+
+               byte = value = s;
+
+               for ( p = s, vlen = 0; p < d; p += 4, vlen += 3 ) {
+                       int i;
+                       for ( i = 0; i < 4; i++ ) {
+                               if ( p[i] != '=' && (p[i] & 0x80 ||
+                                   b642nib[ p[i] & 0x7f ] > 0x3f) ) {
+                                       ber_pvt_log_printf( LDAP_DEBUG_ANY, ldif_debug,
+                                               _("ldif_parse_line: %s: invalid base64 encoding"
+                                               " char (%c) 0x%x\n"),
+                                           type, p[i], p[i] );
+                                       ber_memfree( freeme );
+                                       return( -1 );
+                               }
+                       }
+
+                       /* first digit */
+                       nib = b642nib[ p[0] & 0x7f ];
+                       byte[0] = nib << 2;
+                       /* second digit */
+                       nib = b642nib[ p[1] & 0x7f ];
+                       byte[0] |= nib >> 4;
+                       byte[1] = (nib & RIGHT4) << 4;
+                       /* third digit */
+                       if ( p[2] == '=' ) {
+                               vlen += 1;
+                               break;
+                       }
+                       nib = b642nib[ p[2] & 0x7f ];
+                       byte[1] |= nib >> 2;
+                       byte[2] = (nib & RIGHT2) << 6;
+                       /* fourth digit */
+                       if ( p[3] == '=' ) {
+                               vlen += 2;
+                               break;
+                       }
+                       nib = b642nib[ p[3] & 0x7f ];
+                       byte[2] |= nib;
+
+                       byte += 3;
+               }
+               s[ vlen ] = '\0';
+
+       } else if ( url ) {
+               if ( *s == '\0' ) {
+                       /* no value is present, error out */
+                       ber_pvt_log_printf( LDAP_DEBUG_PARSE, ldif_debug,
+                               _("ldif_parse_line: %s missing URL value\n"), type );
+                       ber_memfree( freeme );
+                       return( -1 );
+               }
+
+               if( ldif_fetch_url( s, &value, &vlen ) ) {
+                       ber_pvt_log_printf( LDAP_DEBUG_ANY, ldif_debug,
+                               _("ldif_parse_line: %s: URL \"%s\" fetch failed\n"),
+                               type, s );
+                       ber_memfree( freeme );
+                       return( -1 );
+               }
+
+       } else {
+               value = s;
+               vlen = (int) (d - s);
+       }
+
+       type = ber_strdup( type );
+
+       if( type == NULL ) {
+               ber_pvt_log_printf( LDAP_DEBUG_ANY, ldif_debug,
+                       _("ldif_parse_line: type malloc failed\n"));
+               if( url ) ber_memfree( value );
+               ber_memfree( freeme );
+               return( -1 );
+       }
+
+       if( !url ) {
+               p = ber_memalloc( vlen + 1 );
+               if( p == NULL ) {
+                       ber_pvt_log_printf( LDAP_DEBUG_ANY, ldif_debug,
+                               _("ldif_parse_line: value malloc failed\n"));
+                       ber_memfree( type );
+                       ber_memfree( freeme );
+                       return( -1 );
+               }
+               AC_MEMCPY( p, value, vlen );
+               p[vlen] = '\0';
+               value = p;
+       }
+
+       ber_memfree( freeme );
+
+       *typep = type;
+       *valuep = value;
+       *vlenp = vlen;
+
+       return( 0 );
+}
+
+/*
+ * ldif_getline - return the next "line" (minus newline) of input from a
+ * string buffer of lines separated by newlines, terminated by \n\n
+ * or \0.  this routine handles continued lines, bundling them into
+ * a single big line before returning.  if a line begins with a white
+ * space character, it is a continuation of the previous line. the white
+ * space character (nb: only one char), and preceeding newline are changed
+ * into CONTINUED_LINE_MARKER chars, to be deleted later by the
+ * ldif_parse_line() routine above.
+ *
+ * ldif_getline will skip over any line which starts '#'.
+ *
+ * ldif_getline takes a pointer to a pointer to the buffer on the first call,
+ * which it updates and must be supplied on subsequent calls.
+ */
+
+char *
+ldif_getline( char **next )
+{
+       char *line;
+
+       do {
+               if ( *next == NULL || **next == '\n' || **next == '\0' ) {
+                       return( NULL );
+               }
+
+               line = *next;
+
+               while ( (*next = strchr( *next, '\n' )) != NULL ) {
+#if CONTINUED_LINE_MARKER != '\r'
+                       if ( (*next)[-1] == '\r' ) {
+                               (*next)[-1] = CONTINUED_LINE_MARKER;
+                       }
+#endif
+
+                       if ( (*next)[1] != ' ' ) {
+                               if ( (*next)[1] == '\r' && (*next)[2] == '\n' ) {
+                                       *(*next)++ = '\0';
+                               }
+                               *(*next)++ = '\0';
+                               break;
+                       }
+
+                       **next = CONTINUED_LINE_MARKER;
+                       (*next)[1] = CONTINUED_LINE_MARKER;
+                       (*next)++;
+               }
+       } while( *line == '#' );
+
+       return( line );
+}
+
+/* compatibility with U-Mich off by one bug */
+#define LDIF_KLUDGE 1
+
+void
+ldif_sput(
+       char **out,
+       int type,
+       LDAP_CONST char *name,
+       LDAP_CONST char *val,
+       ber_len_t vlen )
+{
+       const unsigned char *byte, *stop;
+       unsigned char   buf[3];
+       unsigned long   bits;
+       char            *save;
+       int             pad;
+       int             namelen = 0;
+
+       ber_len_t savelen;
+       ber_len_t len=0;
+       ber_len_t i;
+
+       /* prefix */
+       switch( type ) {
+       case LDIF_PUT_COMMENT:
+               *(*out)++ = '#';
+               len++;
+
+               if( vlen ) {
+                       *(*out)++ = ' ';
+                       len++;
+               }
+
+               break;
+
+       case LDIF_PUT_SEP:
+               *(*out)++ = '\n';
+               return;
+       }
+
+       /* name (attribute type) */
+       if( name != NULL ) {
+               /* put the name + ":" */
+               namelen = strlen(name);
+               strcpy(*out, name);
+               *out += namelen;
+               len += namelen;
+
+               if( type != LDIF_PUT_COMMENT ) {
+                       *(*out)++ = ':';
+                       len++;
+               }
+
+       }
+#ifdef LDAP_DEBUG
+       else {
+               assert( type == LDIF_PUT_COMMENT );
+       }
+#endif
+
+       if( vlen == 0 ) {
+               *(*out)++ = '\n';
+               return;
+       }
+
+       switch( type ) {
+       case LDIF_PUT_NOVALUE:
+               *(*out)++ = '\n';
+               return;
+
+       case LDIF_PUT_URL: /* url value */
+               *(*out)++ = '<';
+               len++;
+               break;
+
+       case LDIF_PUT_B64: /* base64 value */
+               *(*out)++ = ':';
+               len++;
+               break;
+       }
+
+       switch( type ) {
+       case LDIF_PUT_TEXT:
+       case LDIF_PUT_URL:
+       case LDIF_PUT_B64:
+               *(*out)++ = ' ';
+               len++;
+               /* fall-thru */
+
+       case LDIF_PUT_COMMENT:
+               /* pre-encoded names */
+               for ( i=0; i < vlen; i++ ) {
+                       if ( len > LDIF_LINE_WIDTH ) {
+                               *(*out)++ = '\n';
+                               *(*out)++ = ' ';
+                               len = 1;
+                       }
+
+                       *(*out)++ = val[i];
+                       len++;
+               }
+               *(*out)++ = '\n';
+               return;
+       }
+
+       save = *out;
+       savelen = len;
+
+       *(*out)++ = ' ';
+       len++;
+
+       stop = (const unsigned char *) (val + vlen);
+
+       if ( type == LDIF_PUT_VALUE
+               && isgraph( (unsigned char) val[0] ) && val[0] != ':' && val[0] != '<'
+               && isgraph( (unsigned char) val[vlen-1] )
+#ifndef LDAP_BINARY_DEBUG
+               && strstr( name, ";binary" ) == NULL
+#endif
+#ifndef LDAP_PASSWD_DEBUG
+               && (namelen != (sizeof("userPassword")-1)
+               || strcasecmp( name, "userPassword" ) != 0)     /* encode userPassword */
+               && (namelen != (sizeof("2.5.4.35")-1) 
+               || strcasecmp( name, "2.5.4.35" ) != 0)         /* encode userPassword */
+#endif
+       ) {
+               int b64 = 0;
+
+               for ( byte = (const unsigned char *) val; byte < stop;
+                   byte++, len++ )
+               {
+                       if ( !isascii( *byte ) || !isprint( *byte ) ) {
+                               b64 = 1;
+                               break;
+                       }
+                       if ( len > LDIF_LINE_WIDTH+LDIF_KLUDGE ) {
+                               *(*out)++ = '\n';
+                               *(*out)++ = ' ';
+                               len = 1;
+                       }
+                       *(*out)++ = *byte;
+               }
+
+               if( !b64 ) {
+                       *(*out)++ = '\n';
+                       return;
+               }
+       }
+
+       *out = save;
+       *(*out)++ = ':';
+       *(*out)++ = ' ';
+       len = savelen + 2;
+
+       /* convert to base 64 (3 bytes => 4 base 64 digits) */
+       for ( byte = (const unsigned char *) val;
+               byte < stop - 2;
+           byte += 3 )
+       {
+               bits = (byte[0] & 0xff) << 16;
+               bits |= (byte[1] & 0xff) << 8;
+               bits |= (byte[2] & 0xff);
+
+               for ( i = 0; i < 4; i++, len++, bits <<= 6 ) {
+                       if ( len > LDIF_LINE_WIDTH+LDIF_KLUDGE ) {
+                               *(*out)++ = '\n';
+                               *(*out)++ = ' ';
+                               len = 1;
+                       }
+
+                       /* get b64 digit from high order 6 bits */
+                       *(*out)++ = nib2b64[ (bits & 0xfc0000L) >> 18 ];
+               }
+       }
+
+       /* add padding if necessary */
+       if ( byte < stop ) {
+               for ( i = 0; byte + i < stop; i++ ) {
+                       buf[i] = byte[i];
+               }
+               for ( pad = 0; i < 3; i++, pad++ ) {
+                       buf[i] = '\0';
+               }
+               byte = buf;
+               bits = (byte[0] & 0xff) << 16;
+               bits |= (byte[1] & 0xff) << 8;
+               bits |= (byte[2] & 0xff);
+
+               for ( i = 0; i < 4; i++, len++, bits <<= 6 ) {
+                       if ( len > LDIF_LINE_WIDTH+LDIF_KLUDGE ) {
+                               *(*out)++ = '\n';
+                               *(*out)++ = ' ';
+                               len = 1;
+                       }
+
+                       if( i + pad < 4 ) {
+                               /* get b64 digit from low order 6 bits */
+                               *(*out)++ = nib2b64[ (bits & 0xfc0000L) >> 18 ];
+                       } else {
+                               *(*out)++ = '=';
+                       }
+               }
+       }
+       *(*out)++ = '\n';
+}
+
+
+/*
+ * ldif_type_and_value return BER malloc'd, zero-terminated LDIF line
+ */
+char *
+ldif_put(
+       int type,
+       LDAP_CONST char *name,
+       LDAP_CONST char *val,
+       ber_len_t vlen )
+{
+    char       *buf, *p;
+    ber_len_t nlen;
+
+    nlen = ( name != NULL ) ? strlen( name ) : 0;
+
+       buf = (char *) ber_memalloc( LDIF_SIZE_NEEDED( nlen, vlen ) + 1 );
+
+    if ( buf == NULL ) {
+               ber_pvt_log_printf( LDAP_DEBUG_ANY, ldif_debug,
+                       _("ldif_type_and_value: malloc failed!"));
+               return NULL;
+    }
+
+    p = buf;
+    ldif_sput( &p, type, name, val, vlen );
+    *p = '\0';
+
+    return( buf );
+}
+
+int ldif_is_not_printable(
+       LDAP_CONST char *val,
+       ber_len_t vlen )
+{
+       if( vlen == 0 || val == NULL  ) {
+               return -1;
+       }
+
+       if( isgraph( (unsigned char) val[0] ) && val[0] != ':' && val[0] != '<' &&
+               isgraph( (unsigned char) val[vlen-1] ) )
+       {
+               ber_len_t i;
+
+               for ( i = 0; val[i]; i++ ) {
+                       if ( !isascii( val[i] ) || !isprint( val[i] ) ) {
+                               return 1;
+                       }
+               }
+
+               return 0;
+       }
+
+       return 1;
+}
+
+/*
+ * slap_read_ldif - read an ldif record.  Return 1 for success, 0 for EOF.
+ */
+int
+ldif_read_record(
+       FILE        *fp,
+       int         *lno,               /* ptr to line number counter              */
+       char        **bufp,     /* ptr to malloced output buffer           */
+       int         *buflenp )  /* ptr to length of *bufp                  */
+{
+       char        linebuf[BUFSIZ], *line, *nbufp;
+       ber_len_t   lcur = 0, len, linesize;
+       int         last_ch = '\n', found_entry = 0, stop, top_comment = 0;
+
+       line     = linebuf;
+       linesize = sizeof( linebuf );
+
+       for ( stop = feof( fp );  !stop;  last_ch = line[len-1] ) {
+               if ( fgets( line, linesize, fp ) == NULL ) {
+                       stop = 1;
+                       /* Add \n in case the file does not end with newline */
+                       line = "\n";
+               }
+               len = strlen( line );
+
+               if ( last_ch == '\n' ) {
+                       (*lno)++;
+
+                       if ( line[0] == '\n' ) {
+                               if ( !found_entry ) {
+                                       lcur = 0;
+                                       top_comment = 0;
+                                       continue;
+                               }
+                               break;
+                       }
+
+                       if ( !found_entry ) {
+                               if ( line[0] == '#' ) {
+                                       top_comment = 1;
+                               } else if ( ! ( top_comment && line[0] == ' ' ) ) {
+                                       /* Found a new entry */
+                                       found_entry = 1;
+
+                                       if ( isdigit( (unsigned char) line[0] ) ) {
+                                               /* skip index */
+                                               continue;
+                                       }
+                               }
+                       }                       
+               }
+
+               if ( *buflenp - lcur <= len ) {
+                       *buflenp += len + BUFSIZ;
+                       nbufp = ber_memrealloc( *bufp, *buflenp );
+                       if( nbufp == NULL ) {
+                               return 0;
+                       }
+                       *bufp = nbufp;
+               }
+               strcpy( *bufp + lcur, line );
+               lcur += len;
+       }
+
+       return( found_entry );
+}
index b8a487192f1de839130697b9a373d20715cbfb75..f8e55bfd86d0bfb3616856f5fd4dc90e93bea986 100644 (file)
@@ -21,7 +21,7 @@ LIBRARY = librewrite.a
 PROGRAMS       = rewrite
 XLIBS = $(LIBRARY) $(LDAP_LIBAVL_A) $(LDAP_LIBLUTIL_A) \
        $(LDAP_LIBLDAP_R_LA) $(LDAP_LIBLBER_LA)
-XXLIBS  = $(SECURITY_LIBS) $(LDIF_LIBS) $(LUTIL_LIBS)
+XXLIBS  = $(SECURITY_LIBS) $(LUTIL_LIBS)
 XXXLIBS = $(LTHREAD_LIBS)
 
 rewrite:       $(XLIBS) rewrite.o parse.o