X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Fliblutil%2Fldif.c;h=2af75fb73236caec40a64534769da10db1b26c6e;hb=c3e28a5488a8011ef0352f48fca85c48679205ba;hp=b664e89b7434491eede3c06b1102fd3e45c2100f;hpb=e94f1cd3f91e26670288e419ac85bb98a6d96db1;p=openldap diff --git a/libraries/liblutil/ldif.c b/libraries/liblutil/ldif.c index b664e89b74..2af75fb732 100644 --- a/libraries/liblutil/ldif.c +++ b/libraries/liblutil/ldif.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2005 The OpenLDAP Foundation. + * Copyright 1998-2007 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -147,7 +147,7 @@ ldif_parse_line2( if ( s == NULL ) { ber_pvt_log_printf( LDAP_DEBUG_PARSE, ldif_debug, _("ldif_parse_line: missing ':' after %s\n"), - type ); + type->bv_val ); if ( !freeval ) ber_memfree( line ); return( -1 ); } @@ -190,7 +190,8 @@ ldif_parse_line2( 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 ); + _("ldif_parse_line: %s missing base64 value\n"), + type->bv_val ); if ( !freeval ) ber_memfree( line ); return( -1 ); } @@ -205,7 +206,7 @@ ldif_parse_line2( 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] ); + type->bv_val, p[i], p[i] ); if ( !freeval ) ber_memfree( line ); return( -1 ); } @@ -242,7 +243,8 @@ ldif_parse_line2( 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 ); + _("ldif_parse_line: %s missing URL value\n"), + type->bv_val ); if ( !freeval ) ber_memfree( line ); return( -1 ); } @@ -250,7 +252,7 @@ ldif_parse_line2( if( ldif_fetch_url( s, &value->bv_val, &value->bv_len ) ) { ber_pvt_log_printf( LDAP_DEBUG_ANY, ldif_debug, _("ldif_parse_line: %s: URL \"%s\" fetch failed\n"), - type, s ); + type->bv_val, s ); if ( !freeval ) ber_memfree( line ); return( -1 ); } @@ -387,9 +389,9 @@ ldif_must_b64_encode_register( LDAP_CONST char *name, LDAP_CONST char *oid ) int i; ber_len_t len; - assert( must_b64_encode ); - assert( name ); - assert( oid ); + assert( must_b64_encode != NULL ); + assert( name != NULL ); + assert( oid != NULL ); len = strlen( name ); @@ -442,7 +444,7 @@ ldif_must_b64_encode_release( void ) { int i; - assert( must_b64_encode ); + assert( must_b64_encode != NULL ); if ( must_b64_encode == default_must_b64_encode ) { return; @@ -468,8 +470,8 @@ ldif_must_b64_encode( LDAP_CONST char *s ) int i; struct berval bv; - assert( must_b64_encode ); - assert( s ); + assert( must_b64_encode != NULL ); + assert( s != NULL ); ber_str2bv( s, 0, 0, &bv ); @@ -732,7 +734,7 @@ int ldif_is_not_printable( ber_len_t i; for ( i = 0; val[i]; i++ ) { - if ( !isascii( val[i] ) || !isprint( val[i] ) ) { + if ( !isascii( val[i] ) || !isprint( (unsigned char) val[i] ) ) { return 1; } } @@ -743,25 +745,76 @@ int ldif_is_not_printable( return 1; } +LDIFFP * +ldif_open( + LDAP_CONST char *file, + LDAP_CONST char *mode +) +{ + FILE *fp = fopen( file, mode ); + LDIFFP *lfp = NULL; + + if ( fp ) { + lfp = ber_memalloc( sizeof( LDIFFP )); + lfp->fp = fp; + lfp->prev = NULL; + } + return lfp; +} + +void +ldif_close( + LDIFFP *lfp +) +{ + LDIFFP *prev; + + while ( lfp ) { + fclose( lfp->fp ); + prev = lfp->prev; + ber_memfree( lfp ); + lfp = prev; + } +} + +#define LDIF_MAXLINE 4096 + /* - * slap_read_ldif - read an ldif record. Return 1 for success, 0 for EOF. + * ldif_read_record - read an ldif record. Return 1 for success, 0 for EOF. */ int ldif_read_record( - FILE *fp, + LDIFFP *lfp, 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; + char linebuf[LDIF_MAXLINE], *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 ) { + for ( stop = 0; !stop; last_ch = line[len-1] ) { + /* If we're at the end of this file, see if we should pop + * back to a previous file. (return from an include) + */ + while ( feof( lfp->fp )) { + if ( lfp->prev ) { + LDIFFP *tmp = lfp->prev; + fclose( lfp->fp ); + *lfp = *tmp; + ber_memfree( tmp ); + } else { + stop = 1; + break; + } + } + if ( stop ) + break; + + if ( fgets( line, linesize, lfp->fp ) == NULL ) { stop = 1; /* Add \n in case the file does not end with newline */ line = "\n"; @@ -771,7 +824,8 @@ ldif_read_record( if ( last_ch == '\n' ) { (*lno)++; - if ( line[0] == '\n' ) { + if ( line[0] == '\n' || + ( line[0] == '\r' && line[1] == '\n' )) { if ( !found_entry ) { lcur = 0; top_comment = 0; @@ -791,12 +845,46 @@ ldif_read_record( /* skip index */ continue; } + if ( !strncasecmp( line, "include:", + STRLENOF("include:"))) { + FILE *fp2; + char *ptr; + found_entry = 0; + + if ( line[len-1] == '\n' ) { + len--; + line[len] = '\0'; + } + if ( line[len-1] == '\r' ) { + len--; + line[len] = '\0'; + } + + ptr = line + STRLENOF("include:"); + while (isspace((unsigned char) *ptr)) ptr++; + fp2 = ldif_open_url( ptr ); + if ( fp2 ) { + LDIFFP *lnew = ber_memalloc( sizeof( LDIFFP )); + lnew->prev = lfp->prev; + lnew->fp = lfp->fp; + lfp->prev = lnew; + lfp->fp = fp2; + line[len] = '\n'; + len++; + continue; + } else { + /* We failed to open the file, this should + * be reported as an error somehow. + */ + break; + } + } } } } if ( *buflenp - lcur <= len ) { - *buflenp += len + BUFSIZ; + *buflenp += len + LDIF_MAXLINE; nbufp = ber_memrealloc( *bufp, *buflenp ); if( nbufp == NULL ) { return 0;