+/*
+ * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
+ * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+ */
/*
* tmplout.c: display template library output routines for LDAP clients
* 12 April 1994 by Mark C Smith
#include "portable.h"
#include <stdio.h>
-#include <stdlib.h>
+
+#include <ac/stdlib.h>
#include <ac/ctype.h>
#include <ac/string.h>
#include "ldap-int.h"
#include "ldapconfig.h"
+#define writeptype ldap_writeptype
+
+/* local functions */
static int do_entry2text LDAP_P((
LDAP *ld, char *buf, char *base, LDAPMessage *entry,
struct ldap_disptmpl *tmpl, char **defattrs, char ***defvals,
#define OCATTRNAME "objectClass"
-#define NONFATAL_LDAP_ERR( err ) ( err == LDAP_SUCCESS || \
- err == LDAP_TIMELIMIT_EXCEEDED || err == LDAP_SIZELIMIT_EXCEEDED )
+#define NONFATAL_LDAP_ERR( err ) ( (err) == LDAP_SUCCESS || \
+ (err) == LDAP_TIMELIMIT_EXCEEDED || (err) == LDAP_SIZELIMIT_EXCEEDED )
#define DEF_LDAP_URL_PREFIX "ldap:///"
}
if ( buf == NULL ) {
- if (( buf = malloc( LDAP_DTMPL_BUFSIZ )) == NULL ) {
+ if (( buf = LDAP_MALLOC( LDAP_DTMPL_BUFSIZ )) == NULL ) {
ld->ld_errno = LDAP_NO_MEMORY;
- free( dn );
+ LDAP_FREE( dn );
return( ld->ld_errno );
}
freebuf = 1;
freevals = 1;
}
- if ( islower( *attr )) { /* cosmetic -- upcase attr. name */
- *attr = toupper( *attr );
- }
+ *attr = TOUPPER( (unsigned char) *attr );
err = do_vals2text( ld, buf, vals, attr, labelwidth,
LDAP_SYN_CASEIGNORESTR, writeproc, writeparm, eol,
ldap_value_free( vals );
}
}
+
+ if( ber != NULL) {
+ ber_free( ber, 0 );
+ }
} else {
for ( rowp = ldap_first_tmplrow( tmpl );
- NONFATAL_LDAP_ERR( err ) && rowp != NULLTMPLITEM;
+ NONFATAL_LDAP_ERR( err ) && rowp != NULL;
rowp = ldap_next_tmplrow( tmpl, rowp )) {
- for ( colp = ldap_first_tmplcol( tmpl, rowp ); colp != NULLTMPLITEM;
+ for ( colp = ldap_first_tmplcol( tmpl, rowp ); colp != NULL;
colp = ldap_next_tmplcol( tmpl, rowp, colp )) {
vals = NULL;
if ( colp->ti_attrname == NULL || ( vals = ldap_get_values( ld,
if ( show && LDAP_GET_SYN_TYPE( colp->ti_syntaxid )
== LDAP_SYN_TYPE_BOOLEAN && LDAP_IS_TMPLITEM_OPTION_SET(
colp, LDAP_DITEM_OPT_HIDEIFFALSE ) &&
- toupper( vals[ 0 ][ 0 ] ) != 'T' ) {
+ TOUPPER( (unsigned char) vals[ 0 ][ 0 ] ) != 'T' ) {
show = 0;
}
if ( colp->ti_syntaxid == LDAP_SYN_SEARCHACTION ) {
if (( opts & LDAP_DISP_OPT_DOSEARCHACTIONS ) != 0 ) {
if ( colp->ti_attrname == NULL || ( show &&
- toupper( vals[ 0 ][ 0 ] ) == 'T' )) {
+ TOUPPER( (unsigned char) vals[ 0 ][ 0 ] ) == 'T' )) {
err = searchaction( ld, buf, base, entry, dn, colp,
labelwidth, rdncount, writeproc,
writeparm, eol, urlprefix );
(*writeproc)( writeparm, buf, strlen( buf ));
}
- free( dn );
+ LDAP_FREE( dn );
if ( freebuf ) {
- free( buf );
+ LDAP_FREE( buf );
}
return( err );
timeout.tv_sec = SEARCH_TIMEOUT_SECS;
timeout.tv_usec = 0;
- if (( buf = malloc( LDAP_DTMPL_BUFSIZ )) == NULL ) {
+ if (( buf = LDAP_MALLOC( LDAP_DTMPL_BUFSIZ )) == NULL ) {
ld->ld_errno = LDAP_NO_MEMORY;
return( ld->ld_errno );
}
if ( dn == NULL ) {
if (( dn = ldap_get_dn( ld, entry )) == NULL ) {
- free( buf );
+ LDAP_FREE( buf );
if ( freetmpls ) {
ldap_free_templates( tmpllist );
}
fetchattrs, 0, &timeout, &ldmp );
if ( freedn ) {
- free( dn );
+ LDAP_FREE( dn );
}
if ( fetchattrs != NULL ) {
ldap_value_free( fetchattrs );
if ( freetmpls ) {
ldap_free_templates( tmpllist );
}
- free( buf );
+ LDAP_FREE( buf );
return( ld->ld_errno );
}
err = do_entry2text( ld, buf, base, entry, tmpl, defattrs, defvals,
writeproc, writeparm, eol, rdncount, opts, urlprefix );
- free( buf );
+ LDAP_FREE( buf );
if ( freetmpls ) {
ldap_free_templates( tmpllist );
}
}
if ( buf == NULL ) {
- if (( buf = malloc( LDAP_DTMPL_BUFSIZ )) == NULL ) {
+ if (( buf = LDAP_MALLOC( LDAP_DTMPL_BUFSIZ )) == NULL ) {
ld->ld_errno = LDAP_NO_MEMORY;
return( ld->ld_errno );
}
p = s = outval;
while (( s = strchr( s, '$' )) != NULL ) {
*s++ = '\0';
- while ( isspace( *s )) {
+ while ( isspace( (unsigned char) *s )) {
++s;
}
if ( html ) {
break;
case LDAP_SYN_BOOLEAN:
- outval = toupper( outval[ 0 ] ) == 'T' ? "TRUE" : "FALSE";
+ outval = TOUPPER((unsigned char) outval[0]) == 'T' ? "TRUE" : "FALSE";
++writeoutval;
break;
case LDAP_SYN_LABELEDURL:
if ( !notascii && ( p = strchr( outval, '$' )) != NULL ) {
*p++ = '\0';
- while ( isspace( *p )) {
+ while ( isspace( (unsigned char) *p )) {
++p;
}
s = outval;
} else if ( !notascii && ( s = strchr( outval, ' ' )) != NULL ) {
*s++ = '\0';
- while ( isspace( *s )) {
+ while ( isspace( (unsigned char) *s )) {
++s;
}
p = outval;
}
if ( freebuf ) {
- free( buf );
+ LDAP_FREE( buf );
}
return( LDAP_SUCCESS );
maxlen = 0;
- for ( rowp = ldap_first_tmplrow( tmpl ); rowp != NULLTMPLITEM;
+ for ( rowp = ldap_first_tmplrow( tmpl ); rowp != NULL;
rowp = ldap_next_tmplrow( tmpl, rowp )) {
- for ( colp = ldap_first_tmplcol( tmpl, rowp ); colp != NULLTMPLITEM;
+ for ( colp = ldap_first_tmplcol( tmpl, rowp ); colp != NULL;
colp = ldap_next_tmplcol( tmpl, rowp, colp )) {
if (( len = strlen( colp->ti_label )) > maxlen ) {
maxlen = len;
-#define HREF_CHAR_ACCEPTABLE( c ) (( c >= '-' && c <= '9' ) || \
- ( c >= '@' && c <= 'Z' ) || \
- ( c == '_' ) || \
- ( c >= 'a' && c <= 'z' ))
+#define HREF_CHAR_ACCEPTABLE( c ) (( (c) >= '-' && (c) <= '9' ) || \
+ ( (c) >= '@' && (c) <= 'Z' ) || \
+ ( (c) == '_' ) || \
+ ( (c) >= 'a' && (c) <= 'z' ))
static void
strcat_escaped( char *s1, char *s2 )
}
-#define GET2BYTENUM( p ) (( *p - '0' ) * 10 + ( *(p+1) - '0' ))
+#define GET2BYTENUM( p ) (( *(p) - '0' ) * 10 + ( *((p)+1) - '0' ))
static char *
time2text( char *ldtimestr, int dateonly )
struct tm t;
char *p, *timestr, zone, *fmterr = "badly formatted time";
time_t gmttime;
+ char timebuf[32];
+ int ndigits;
- memset( (char *)&t, 0, sizeof( struct tm ));
- if ( (int) strlen( ldtimestr ) < 13 ) {
- return( fmterr );
+ if (strlen( ldtimestr ) < 12 ) {
+ return( fmterr );
+ }
+
+ for ( ndigits=0; isdigit((unsigned char) ldtimestr[ndigits]); ndigits++) {
+ ; /* EMPTY */
}
- for ( p = ldtimestr; p - ldtimestr < 12; ++p ) {
- if ( !isdigit( *p )) {
+ if ( ndigits != 12 && ndigits != 14) {
return( fmterr );
}
- }
+
+ memset( (char *)&t, 0, sizeof( struct tm ));
p = ldtimestr;
+
+ if( ndigits == 14) {
+ /* came with a century */
+ /* POSIX says tm_year should be year - 1900 */
+ t.tm_year = 100 * GET2BYTENUM( p ) - 1900;
+ p += 2;
+ }
t.tm_year = GET2BYTENUM( p ); p += 2;
+
t.tm_mon = GET2BYTENUM( p ) - 1; p += 2;
t.tm_mday = GET2BYTENUM( p ); p += 2;
t.tm_hour = GET2BYTENUM( p ); p += 2;
}
gmttime = gtime( &t );
- timestr = ctime( &gmttime );
+ timestr = ldap_pvt_ctime( &gmttime, timebuf );
+
timestr[ strlen( timestr ) - 1 ] = zone; /* replace trailing newline */
if ( dateonly ) {
- strcpy( timestr + 11, timestr + 20 );
+ SAFEMEMCPY( timestr + 11, timestr + 20, strlen( timestr + 20 ) + 1 );
}
return( timestr );
This routine was supplied by Mike Accetta at CMU many years ago.
*/
-static int dmsize[] = {
+static const int dmsize[] = {
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
#define dysize(y) \
(((y) % 4) ? 365 : (((y) % 100) ? 366 : (((y) % 400) ? 365 : 366)))
-#define YEAR(y) ((y) >= 100 ? (y) : (y) + 1900)
+/*
+ * Y2K YEAR
+ */
+ /* per POSIX tm_year should be offset by 1900 */
+#define YEAR_POSIX(y) ((y) + 1900)
+
+ /*
+ * year is < 1900, year is offset by 1900
+ */
+#define YEAR_CAREFUL(y) ((y) < 1900 ? (y) + 1900 : (y))
+
+ /*
+ ** if year is < 1990 and < 70 must be offset by 2000 as Unix epoch
+ ** started in 1970. if year is < 1990 but >= 70, offset by 1900.
+ ** if year is >= 1900, it must be the real year.
+ */
+#define YEAR_PEDANTIC(y) ((y) < 1900 \
+ ? ((y) < 70 ? (y) + 2000 ? (y) + 1900) \
+ : (y))
+
+#define YEAR(y) YEAR_CAREFUL(y)
/* \f */
if ( lderr == LDAP_SUCCESS || NONFATAL_LDAP_ERR( lderr )) {
if (( count = ldap_count_entries( ld, ldmp )) > 0 ) {
- if (( members = (char **)malloc( (count + 1) * sizeof(char *)))
+ if (( members = (char **)LDAP_MALLOC( (count + 1) * sizeof(char *)))
== NULL ) {
err = LDAP_NO_MEMORY;
} else {