diff options
Diffstat (limited to 'ldap/clients/dsgw/templateindex.c')
-rw-r--r-- | ldap/clients/dsgw/templateindex.c | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/ldap/clients/dsgw/templateindex.c b/ldap/clients/dsgw/templateindex.c new file mode 100644 index 00000000..103b4fa1 --- /dev/null +++ b/ldap/clients/dsgw/templateindex.c @@ -0,0 +1,184 @@ +/** + * PROPRIETARY/CONFIDENTIAL. Use of this product is subject to + * license terms. Copyright © 2001 Sun Microsystems, Inc. + * Some preexisting portions Copyright © 2001 Netscape Communications Corp. + * All rights reserved. + */ +/* + * templateindex.c -- CGI template indexer -- HTTP gateway + * + * Copyright (c) 1996 Netscape Communications Corp. + * All rights reserved. + */ + +#include "dsgw.h" +#if defined( XP_WIN32 ) +#include <io.h> +struct dirent { + char d_name[1]; +}; +#else +#include <dirent.h> +#endif + +static void build_index(); + +#if defined( XP_WIN32 ) +char **ds_get_file_list( char *dir ) +{ + char szWildcardFileSpec[MAX_PATH]; + char **ret = NULL; + long hFile; + struct _finddata_t fileinfo; + int nfiles = 0; + + if( ( dir == NULL ) || (strlen( dir ) == 0) ) + return NULL; + + if( ( ret = malloc( sizeof( char * ) ) ) == NULL ) + return NULL; + + strcpy(szWildcardFileSpec, dir); + strcat(szWildcardFileSpec, "/*"); + + hFile = _findfirst( szWildcardFileSpec, &fileinfo); + if( hFile == -1 ) + return NULL; + + if( ( strcmp( fileinfo.name, "." ) != 0 ) && + ( strcmp( fileinfo.name, ".." ) != 0 ) ) + { + ret[ nfiles++ ] = strdup( fileinfo.name ); + } + + while( _findnext( hFile, &fileinfo ) == 0 ) + { + if( ( strcmp( fileinfo.name, "." ) != 0 ) && + ( strcmp( fileinfo.name, ".." ) != 0 ) ) + { + if( ( ret = (char **) realloc( ret, sizeof( char * ) * ( nfiles + 1 ) ) ) != NULL ) + ret[ nfiles++ ] = strdup( fileinfo.name); + } + } + + _findclose( hFile ); + + ret[ nfiles ] = NULL; + return ret; +} +#endif ( XP_WIN32 ) + + +main( argc, argv, env ) + int argc; + char *argv[]; +#ifdef DSGW_DEBUG + char *env[]; +#endif +{ + int reqmethod; + + reqmethod = dsgw_init( argc, argv, DSGW_METHOD_GET ); + dsgw_send_header(); + +#ifdef DSGW_DEBUG + dsgw_logstringarray( "env", env ); +#endif + + dsgw_html_begin( "Directory Server Gateway Template Indexer", 1 ); + + build_index(); + + dsgw_html_end(); + + exit( 0 ); +} + + +static void +build_index() +{ + FILE *htmlfp; +#if !defined( XP_WIN32 ) + DIR *dirp; +#endif + struct dirent *dep; + char *path, **argv, *classes, *p, line[ BIG_LINE ]; + char **filelist; + int errcount, prefixlen, count, argc, filecount = 0; + + + path = dsgw_file2path( gc->gc_tmpldir, "" ); + +#if defined( XP_WIN32 ) + if (( filelist = ds_get_file_list( path )) == NULL ) { +#else + if (( dirp = opendir( path )) == NULL ) { +#endif + dsgw_error( DSGW_ERR_OPENDIR, path, DSGW_ERROPT_EXIT, 0, NULL ); + } + free( path ); + + prefixlen = strlen( DSGW_CONFIG_DISPLAYPREFIX ); + errcount = count = 0; + + dsgw_emitf( "Remove any lines that begin with \"template\" from \n" ); + dsgw_emitf( "your dsgw.conf file and add these lines:<BR><PRE>\n" ); + +#if defined( XP_WIN32 ) + while( filelist != NULL && filelist[filecount] != NULL ) { + dep = (struct dirent *)filelist[filecount]; +#else + while (( dep = readdir( dirp )) != NULL ) { +#endif + if ( strlen( dep->d_name ) > prefixlen && strncasecmp( dep->d_name, + DSGW_CONFIG_DISPLAYPREFIX, prefixlen ) == 0 && strcmp( + ".html", dep->d_name + strlen( dep->d_name ) - 5 ) == 0 ) { + ++count; + htmlfp = dsgw_open_html_file( dep->d_name, DSGW_ERROPT_EXIT ); + + while ( dsgw_next_html_line( htmlfp, line )) { + if ( dsgw_parse_line( line, &argc, &argv, 1, + dsgw_simple_cond_is_true, NULL )) { + if ( dsgw_directive_is( line, DRCT_DS_OBJECTCLASS )) { + if (( classes = get_arg_by_name( "value", argc, argv )) + == NULL ) { + dsgw_emitf( + "Missing \"value=objectclass\" on line <%s<BR>\n", line+1 ); + ++errcount; + continue; + } + dsgw_emitf( "template %.*s", + strlen( dep->d_name ) - prefixlen - 5, + dep->d_name + prefixlen ); + for ( ; classes != NULL && *classes != '\0'; + classes = p ) { + if (( p = strchr( classes, ',' )) != NULL ) { + *p++ = '\0'; + while ( ldap_utf8isspace( p )) { + LDAP_UTF8INC(p); + } + } + dsgw_emitf( " %s", classes ); + } + dsgw_emits( "\n" ); + } + } + } + fclose( htmlfp ); + filecount++; + } + } + +#if !defined( XP_WIN32 ) + closedir( dirp ); +#endif + + dsgw_emits( "</PRE><H3>Template indexing " ); + + if ( errcount == 0 ) { + dsgw_emitf( "complete (%d files).<H3>\n", count ); + } else { + dsgw_emitf( "failed (%d errors).<H3>\n", errcount ); + } +} |