int LDAP_CALL ldap_init_templates_buf( char *buf, long buflen, struct ldap_disptmpl **tmpllistp ) { int rc = 0, version; char **toks; struct ldap_disptmpl *prevtmpl, *tmpl; *tmpllistp = prevtmpl = NULLDISPTMPL; if ( ldap_next_line_tokens( &buf, &buflen, &toks ) != 2 || strcasecmp( toks[ 0 ], "version" ) != 0 ) { ldap_free_strarray( toks ); return( LDAP_TMPL_ERR_SYNTAX ); } version = atoi( toks[ 1 ] ); ldap_free_strarray( toks ); if ( version != LDAP_TEMPLATE_VERSION ) { return( LDAP_TMPL_ERR_VERSION ); } while ( buflen > 0 && ( rc = read_next_tmpl( &buf, &buflen, &tmpl, version )) == 0 && tmpl != NULLDISPTMPL ) { if ( prevtmpl == NULLDISPTMPL ) { *tmpllistp = tmpl; } else { prevtmpl->dt_next = tmpl; } prevtmpl = tmpl; } if ( rc != 0 ) { ldap_free_templates( *tmpllistp ); } return( rc ); }
static int do_entry2text_search( LDAP *ld, char *dn, /* if NULL, use entry */ char *base, /* if NULL, no search actions */ LDAPMessage *entry, /* if NULL, use dn */ struct ldap_disptmpl* tmpllist, /* if NULL, load default file */ char **defattrs, char ***defvals, writeptype writeproc, void *writeparm, char *eol, int rdncount, /* if 0, display full DN */ unsigned int opts, char *urlprefix ) { int err, freedn, freetmpls, html; char *buf, **fetchattrs, **vals; LDAPMessage *ldmp; struct ldap_disptmpl *tmpl; struct timeval timeout; if ( dn == NULL && entry == NULLMSG ) { ld->ld_errno = LDAP_PARAM_ERROR; return( ld->ld_errno ); } html = ( urlprefix != NULL ); timeout.tv_sec = SEARCH_TIMEOUT_SECS; timeout.tv_usec = 0; if (( buf = malloc( LDAP_DTMPL_BUFSIZ )) == NULL ) { ld->ld_errno = LDAP_NO_MEMORY; return( ld->ld_errno ); } freedn = freetmpls = 0; tmpl = NULL; if ( tmpllist == NULL ) { if (( err = ldap_init_templates( TEMPLATEFILE, &tmpllist )) != 0 ) { sprintf( buf, "%sUnable to read template file %s (error %d)%s%s", html ? "<!-- " : "", TEMPLATEFILE, err, html ? "-->" : "", eol ); (*writeproc)( writeparm, buf, strlen( buf )); } freetmpls = 1; } if ( dn == NULL ) { if (( dn = ldap_get_dn( ld, entry )) == NULL ) { free( buf ); if ( freetmpls ) { ldap_free_templates( tmpllist ); } return( ld->ld_errno ); } freedn = 1; } if ( tmpllist != NULL ) { ldmp = NULLMSG; if ( entry == NULL ) { char *ocattrs[2]; ocattrs[0] = OCATTRNAME; ocattrs[1] = NULL; #ifdef CLDAP if ( LDAP_IS_CLDAP( ld )) err = cldap_search_s( ld, dn, LDAP_SCOPE_BASE, "objectClass=*", ocattrs, 0, &ldmp, NULL ); else #endif /* CLDAP */ err = ldap_search_st( ld, dn, LDAP_SCOPE_BASE, "objectClass=*", ocattrs, 0, &timeout, &ldmp ); if ( err == LDAP_SUCCESS ) { entry = ldap_first_entry( ld, ldmp ); } } if ( entry != NULL ) { vals = ldap_get_values( ld, entry, OCATTRNAME ); tmpl = ldap_oc2template( vals, tmpllist ); if ( vals != NULL ) { ldap_value_free( vals ); } } if ( ldmp != NULL ) { ldap_msgfree( ldmp ); } } entry = NULL; if ( tmpl == NULL ) { fetchattrs = NULL; } else { fetchattrs = ldap_tmplattrs( tmpl, NULL, 1, LDAP_SYN_OPT_DEFER ); } #ifdef CLDAP if ( LDAP_IS_CLDAP( ld )) err = cldap_search_s( ld, dn, LDAP_SCOPE_BASE, "objectClass=*", fetchattrs, 0, &ldmp, NULL ); else #endif /* CLDAP */ err = ldap_search_st( ld, dn, LDAP_SCOPE_BASE, "objectClass=*", fetchattrs, 0, &timeout, &ldmp ); if ( freedn ) { free( dn ); } if ( fetchattrs != NULL ) { ldap_value_free( fetchattrs ); } if ( err != LDAP_SUCCESS || ( entry = ldap_first_entry( ld, ldmp )) == NULL ) { if ( freetmpls ) { ldap_free_templates( tmpllist ); } free( buf ); return( ld->ld_errno ); } err = do_entry2text( ld, buf, base, entry, tmpl, defattrs, defvals, writeproc, writeparm, eol, rdncount, opts, urlprefix ); free( buf ); if ( freetmpls ) { ldap_free_templates( tmpllist ); } ldap_msgfree( ldmp ); return( err ); }