diff options
author | Noriko Hosoi <nhosoi@redhat.com> | 2007-04-27 23:00:24 +0000 |
---|---|---|
committer | Noriko Hosoi <nhosoi@redhat.com> | 2007-04-27 23:00:24 +0000 |
commit | e230e448e4c38ae8725d39dc0157dc95f85aa4e9 (patch) | |
tree | 6074a9f2adc89b903e8c57528584085fa7977464 /ldap/clients/dsgw/htmlparse.c | |
parent | 237aa2dcedfe62681e32905058af6c068d2958fb (diff) | |
download | ds-e230e448e4c38ae8725d39dc0157dc95f85aa4e9.tar.gz ds-e230e448e4c38ae8725d39dc0157dc95f85aa4e9.tar.xz ds-e230e448e4c38ae8725d39dc0157dc95f85aa4e9.zip |
Resolves: #237356
Summary: Move DS Admin Code into Admin Server (Comment #4,#6)
Description:
.DSGW is already a separated module "dsgw"; Removing from ldapserver.
.Removing the independency from lib/libsi18n/gsslapd.h
Diffstat (limited to 'ldap/clients/dsgw/htmlparse.c')
-rw-r--r-- | ldap/clients/dsgw/htmlparse.c | 849 |
1 files changed, 0 insertions, 849 deletions
diff --git a/ldap/clients/dsgw/htmlparse.c b/ldap/clients/dsgw/htmlparse.c deleted file mode 100644 index d9e04d9f..00000000 --- a/ldap/clients/dsgw/htmlparse.c +++ /dev/null @@ -1,849 +0,0 @@ -/** --- BEGIN COPYRIGHT BLOCK --- - * This Program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; version 2 of the License. - * - * This Program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with - * this Program; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place, Suite 330, Boston, MA 02111-1307 USA. - * - * In addition, as a special exception, Red Hat, Inc. gives You the additional - * right to link the code of this Program with code not covered under the GNU - * General Public License ("Non-GPL Code") and to distribute linked combinations - * including the two, subject to the limitations in this paragraph. Non-GPL Code - * permitted under this exception must only link to the code of this Program - * through those well defined interfaces identified in the file named EXCEPTION - * found in the source code files (the "Approved Interfaces"). The files of - * Non-GPL Code may instantiate templates or use macros or inline functions from - * the Approved Interfaces without causing the resulting work to be covered by - * the GNU General Public License. Only Red Hat, Inc. may make changes or - * additions to the list of Approved Interfaces. You must obey the GNU General - * Public License in all respects for all of the Program code and other code used - * in conjunction with the Program except the Non-GPL Code covered by this - * exception. If you modify this file, you may extend this exception to your - * version of the file, but you are not obligated to do so. If you do not wish to - * provide this exception without modification, you must delete this exception - * statement from your version and license this file solely under the GPL without - * exception. - * - * - * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission. - * Copyright (C) 2005 Red Hat, Inc. - * All rights reserved. - --- END COPYRIGHT BLOCK --- */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -/* - * htmlparse.c -- routines to parse HTML templates -- HTTP gateway. - * Stolen from libadmin/template.c and libadmin/form_get.c, originally - * by Mike McCool. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <stdarg.h> -#include "dsgw.h" -#include "dbtdsgw.h" - -extern char *Versionstr; /* from Versiongw.c */ - -/* global variables */ -char *dsgw_last_op_info; /* set in edit.c */ -char *dsgw_dnattr; /* set in edit.c */ -char *dsgw_dndesc; /* set in edit.c */ - -/* - * Save yourself a lot of grief and put a space after the name. - */ - -static struct template_s templates[] = { - {"IF ", "FUNC conditional"}, - {"ELSE ", "FUNC conditional"}, - {"ELIF ", "FUNC conditional"}, - {"ENDIF ", "FUNC conditional"}, - {"TITLE ", "FUNC title"}, - {"BODY ", "FUNC body"}, - {"COLORS ", "FUNC colors"}, - {"PAGEHEADER ", "FUNC pageheader"}, - {"BEGININFO ", "<table border=2 width=100%% cellpadding=2>\n" - "<tr><td align=center colspan=2>" - "<b><FONT size=+1>%s</FONT></b></td></tr>" - "<td colspan=2>\n"}, - {"ADDINFO ", "</td></tr><tr><td colspan=2>"}, - {"ENDINFO ", "</td></tr></table>\n<hr width=10%%>\n"}, - {"SUBMIT ", "FUNC submit\n"}, - {"BEGINELEM ", "<pre>"}, - {"ELEM ", "\n<b>%s</b>"}, - {"ENDELEM ", "</pre>\n"}, - {"ELEMADD ", "<b>%s</b>"}, - {"ELEMDIV ", "\n"}, - {"INDEX ", "<a href=\"index\">%s</a>\n"}, - {"HELPBUTTON", "FUNC helpbutton"}, - {"DIALOGSUBMIT", "FUNC dialogsubmit"}, - {DRCT_DS_LAST_OP_INFO, "FUNC emit_last_op_info"}, - {DRCT_DS_GATEWAY_VERSION, "FUNC emit_version_str"}, - {DRCT_DS_ALERT_NOENTRIES " ", "FUNC emit_alert_noentries"}, - {"ENDHTML", "</BODY></HTML>"}, - {"GCONTEXT ", "context=%s"}, - {"PCONTEXT ", "<INPUT TYPE=\"hidden\" NAME=\"context\" VALUE=\"%s\">\n"}, - { NULL, NULL } -}; - -/* global to track output status */ -#define DSGW_PARSE_STATUS_NO_IF_SEEN -1 -#define DSGW_PARSE_STATUS_NO_OUTPUT 0 -#define DSGW_PARSE_STATUS_OUTPUT 1 -static int parse_status = DSGW_PARSE_STATUS_NO_IF_SEEN; - -static int dsgw_get_directive(char *string); -static char **dsgw_get_vars(char *string, int *argc); -static void dsgw_pageheader(int argc, char **argv); -static void dsgw_title(int argc, char **argv); -static void dsgw_body(int argc, char **argv); -static void dsgw_colors(int argc, char **argv); -static void dsgw_submit(int verify, char **vars); -static void dsgw_dialogsubmit(void); -static void dsgw_conditional(char *name, int argc, char **argv, - condfunc conditionalfn, void *condarg); -static int dsgw_condition_true( int argc, char **argv, - condfunc conditionalfn, void *condarg ); -static void emit_last_op_info(int argc, char **argv); -static void emit_version_str( void ); -static void emit_alert_noentries( void ); -static void template_error( char *msg ); - -/* Filter a page. Takes the page to filter as an argument. Uses above - * filters to process. If we encounter a directive we don't know about, - * we set argc and argv, and return -1. The caller is responsible for - * figuring out what to do with the directive and arg vector. - * - * If parseonly is non-zero, this routine will just parse lines that contain - * directives -- nothing will be written to stdout. - */ -int -dsgw_parse_line( -char *line_input, -int *argc, -char ***argv, -int parseonly, -condfunc conditionalfn, -void *condarg -) -{ - register int index; - char *position; - int dirlen = strlen(DIRECTIVE_START); - char **vars; - int func_flag = 0; - - - *argc = 0; - *argv = NULL; - if ( !strncmp( line_input, DIRECTIVE_START, dirlen )) { - position = (char *) ( line_input + dirlen ); - if ( parseonly ) { - index = -1; /* treat all directives as "unknown" */ - } else { - index = dsgw_get_directive( position ); - } - - /* did we get one? */ - if ( index != -1 ) { - /* if so, get the vars. */ - position += strlen( templates[index].name ); - vars = dsgw_get_vars( position, argc ); - /* Dispatch the correct function (done for readability) */ - if ( !strncmp(templates[ index ].format, "FUNC ", 5 )) { - func_flag = 1; - } - - /* Don't check the parse_status for conditionals -RJP */ - if (func_flag == 1 && - !strncmp( templates[index].format+5, "conditional", 11 )) { - dsgw_conditional( templates[index].name, *argc, vars, - conditionalfn, condarg ); - /* But do so for the other directives */ - } else if (func_flag == 1 && parse_status != DSGW_PARSE_STATUS_NO_OUTPUT) { - if ( !strncmp( templates[ index ].format+5, "pageheader",10 )) - dsgw_pageheader( *argc, vars ); - else if ( !strncmp( templates[index].format+5,"title",5)) - dsgw_title( *argc, vars ); - else if ( !strncmp( templates[index].format+5,"body",4)) - dsgw_body( *argc, vars ); - else if ( !strncmp( templates[index].format+5,"colors",6)) - dsgw_colors( *argc, vars ); - else if ( !strncmp( templates[ index ].format+5, "submit",6 )) - dsgw_submit( 0, vars ); - else if ( !strncmp( templates[ index ].format+5, "verify",6 )) - dsgw_submit( 1, vars ); - else if ( !strncmp( templates[index].format+5, - "dialogsubmit",12 )) - dsgw_dialogsubmit(); - else if ( !strncmp( templates[index].format+5, "helpbutton", 10 ) && ( *argc > 0 )) - dsgw_emit_helpbutton( vars[ 0 ] ); - else if ( !strncmp( templates[index].format+5,"emit_last_op_info", 17 )) - emit_last_op_info( *argc, vars ); - else if ( !strncmp( templates[index].format+5, "emit_version_str", 16 )) - emit_version_str(); - else if ( !strncmp( templates[index].format+5, "emit_alert_noentries", 20 )) - emit_alert_noentries(); - else { /* We don't know what this template is. Send it back. */ - *argv = vars; - return -1; - } - /* - * Handle the context case specially, because there is no - * vars generated, yet the format has a %s in it. Handle - * both the GCONTEXT and the PCONTEXT case (GET AND POST) - */ - } else if ( parse_status != DSGW_PARSE_STATUS_NO_OUTPUT && - !strcmp(templates[ index ].name + 1, "CONTEXT ")) { - char line[ BIG_LINE ]; - PR_snprintf( line, sizeof(line), templates[ index ].format, context); - dsgw_emits( line ); - - } else if ( parse_status != DSGW_PARSE_STATUS_NO_OUTPUT ) { - /* I just can't believe there's no easy way to create - * a va_list. */ - char line[ BIG_LINE ]; - PR_snprintf( line, sizeof(line), templates[ index ].format, - ( *argc > 0 && vars[ 0 ] != NULL ) ? vars[ 0 ]: "", - ( *argc > 1 && vars[ 1 ] != NULL ) ? vars[ 1 ]: "", - ( *argc > 2 && vars[ 2 ] != NULL ) ? vars[ 2 ]: "", - ( *argc > 3 && vars[ 3 ] != NULL ) ? vars[ 3 ]: ""); - dsgw_emits( line ); - } - } else if ( parse_status != DSGW_PARSE_STATUS_NO_OUTPUT ) { - /* We found a directive, but we can't identify it. Return non-zero - * value so caller knows to deal with it. - */ - vars = dsgw_get_vars( position, argc ); - *argv = vars; - return -1; - } - } else if ( !parseonly && parse_status != DSGW_PARSE_STATUS_NO_OUTPUT ) { - auto char *gcontext = NULL; - auto char *start_of_newline = (char *) dsgw_ch_strdup(line_input); - auto char *new_line_input = start_of_newline; - - /* We found no directive at the beginning. Look for GCONTEXT - * It could be anywhere in the line. Sorry, but that's the way - * It has to be. - RJP - */ - for (gcontext = strstr(new_line_input, GCONTEXT_DIRECTIVE); - gcontext != NULL; - gcontext = strstr(new_line_input, GCONTEXT_DIRECTIVE)){ - - *gcontext = '\0'; - /* - * Print the new_line_input (everything up to the first - * GCONTEXT_DIRECTIVE - */ - dsgw_HTML_emits( new_line_input ); - - - /*Now print "context=whatever"*/ - dsgw_emitf("context=%s", context); - - /* Now skip past the directive */ - new_line_input = gcontext + strlen(GCONTEXT_DIRECTIVE); - } - - /* If there's anything left, output it*/ - if (*new_line_input) { - dsgw_HTML_emits( new_line_input ); - } - - free ((void*)start_of_newline); - } - - /* If we're here, we either handled it correctly or the line was benign.*/ - return 0; -} - - -FILE * -dsgw_open_html_file(char *filename, int erropts) -{ - FILE *f; - char *tfname = NULL; - - tfname = dsgw_file2path( gc->gc_tmpldir, filename); - if (!(f = fopen(tfname, "r"))) { - /* punt */ - dsgw_error(DSGW_ERR_OPENHTMLFILE, tfname, erropts, 0, NULL ); - } - - free( tfname ); - - return f; -} - - -#define DSGW_INCLUDE_DRCT "<!-- INCLUDE " -#define DSGW_INCLUDE_DRCT_LEN 13 -#define DSGW_INCLSET_DRCT "<!-- INCLUDESET " -#define DSGW_INCLSET_DRCT_LEN 16 - -int -dsgw_next_html_line(FILE *f, char *line) -{ - char *p, *incfile; - int linelen; - static FILE *incfp = NULL; - static FILE *parentfp = NULL; - static int incset_index = 0; - static dsgwinclset *incsetp = NULL; - - if ( incfp != NULL && parentfp == f ) { - /* we're in the midst of an include -- read from include file */ - if ( fgets(line, BIG_LINE, incfp ) != 0 ) { - return 1; /* success */ - } - - /* end of include file */ - fclose( incfp ); - - /* if in middle of an include set, open and use next file in set */ - if ( incsetp != NULL && ++incset_index < incsetp->dsiset_itemcount ) { - incfp = dsgw_open_html_file( - incsetp->dsiset_filenames[ incset_index ], - DSGW_ERROPT_EXIT ); - return( dsgw_next_html_line( f, line )); - } - incfp = NULL; - incsetp = NULL; - } - - if(!(fgets(line, BIG_LINE, f))) { - return 0; /* end of file */ - } - - if ( incfp != NULL ) { - return 1; /* ignore nested includes */ - } - - /* check for start of a simple or an include set based include */ - incfile = NULL; - linelen = strlen( line ); - if ( linelen > DSGW_INCLUDE_DRCT_LEN && strncasecmp( line, - DSGW_INCLUDE_DRCT, DSGW_INCLUDE_DRCT_LEN ) == 0 ) { - incfile = line + DSGW_INCLUDE_DRCT_LEN; - if (( p = strchr( incfile, ' ' )) != NULL ) { - *p = '\0'; - } - } else if ( linelen > DSGW_INCLSET_DRCT_LEN && strncasecmp( line, - DSGW_INCLSET_DRCT, DSGW_INCLSET_DRCT_LEN ) == 0 ) { - char *sethandle; - - sethandle = line + DSGW_INCLSET_DRCT_LEN; - if (( p = strchr( sethandle, ' ' )) != NULL ) { - *p = '\0'; - } - - for ( incsetp = gc->gc_includesets; incsetp != NULL; - incsetp = incsetp->dsiset_next ) { - if ( strcasecmp( sethandle, incsetp->dsiset_handle ) == 0 ) { - break; - } - } - if ( incsetp == NULL ) { /* set not found -- ignore it */ - if ( p != NULL ) { - *p = ' '; - } - return( 1 ); - } - incset_index = 0; - incfile = incsetp->dsiset_filenames[ 0 ]; - } - - if ( incfile != NULL ) { - incfp = dsgw_open_html_file( incfile, DSGW_ERROPT_EXIT ); - parentfp = f; - return( dsgw_next_html_line( f, line )); - } - - return 1; -} - - -static void -dsgw_pageheader(int argc, char **argv) -{ - char line[BIG_LINE]; - - dsgw_emits("<center><table border=2 width=100%%>\n"); - - util_snprintf(line, sizeof(line), "<tr>"); - dsgw_emits(line); - - util_snprintf(line, sizeof(line), "<td align=center width=100%%>"); - dsgw_emits(line); - util_snprintf(line, sizeof(line), "<hr size=0 width=0>"); - dsgw_emits(line); - util_snprintf(line, sizeof(line), "<FONT size=+2><b>%s</b></FONT>" - "<hr size=0 width=0>" - "</th>", ( argc > 0 ) ? argv[0] : "" ); - dsgw_emits(line); - - dsgw_emits("</tr></table></center>\n"); -} - - -static void -dsgw_title( int argc, char **argv) -{ - char line[BIG_LINE]; - dsgw_emits("<HTML>"); - dsgw_head_begin(); - util_snprintf(line, sizeof(line), "\n<TITLE>%s</TITLE></HEAD>\n" - "<BODY %s>\n", ( argc > 0 ) ? argv[0] : "", dsgw_html_body_colors ); - dsgw_emits(line); -} - - -static void -dsgw_body( int argc, char **argv) -{ - char line[BIG_LINE]; - - if ( argc > 0 ) { - util_snprintf(line, sizeof(line), "<BODY %s %s>\n", dsgw_html_body_colors, - ( argc > 0 ) ? argv[0] : "" ); - } else { - util_snprintf(line, sizeof(line), "<BODY %s>\n", dsgw_html_body_colors ); - } - - dsgw_emits(line); -} - - -static void -dsgw_colors( int argc, char **argv) -{ - if ( argc > 0 ) { - dsgw_html_body_colors = dsgw_ch_strdup( argv[0] ); - } else { - dsgw_html_body_colors = ""; - } -} - - -static void -dsgw_submit(int verify, char **vars) -{ - if(verify) { - dsgw_emits ("<SCRIPT language=JavaScript><!--\n" - "function verify(form)\n{\n" - " window.confirmedForm = form;\n"); - dsgw_emit_confirm (NULL, "opener.confirmedForm.submit();", NULL /* no */, - XP_GetClientStr(DBT_doYouReallyWantToWindow_), 1, - XP_GetClientStr(DBT_doYouReallyWantTo_), vars[0]); - dsgw_emits ("}\n" - "// -->\n" - "</SCRIPT>\n"); - } - - dsgw_emits("<center><table border=2 width=100%%><tr>"); - - if(!verify) { - char outstr[256]; - PR_snprintf(outstr, sizeof(outstr), "<td width=50%% align=center>" - "<input type=submit value=\"%s\">" - "</td>\n", - XP_GetClientStr(DBT_ok_1)); - dsgw_emits(outstr); - } else { - char outstr[256]; - PR_snprintf(outstr, sizeof(outstr), "<td width=50%% align=center>" - "<input type=button value=\"%s\" " - "onclick=\"verify(this.form)\">" - "</td>\n", - XP_GetClientStr(DBT_ok_2)); - dsgw_emits(outstr); - } - { - char outstr[256]; - PR_snprintf(outstr, sizeof(outstr), "<td width=50%% align=center>" - "<input type=reset value=\"%s\"></td>\n", - XP_GetClientStr(DBT_reset_)); - dsgw_emits(outstr); - } - - dsgw_emits("</tr></table></center>\n"); - - dsgw_emits("</form>\n"); - - dsgw_emits("<SCRIPT language=JavaScript>\n"); - dsgw_emits("</SCRIPT>\n"); -} - - -static void -dsgw_dialogsubmit(void) -{ - char outstr[256]; - - dsgw_emits("<center><table border=2 width=100%%><tr>"); - - PR_snprintf(outstr, sizeof(outstr), "<td width=50%% align=center>" - "<input type=submit value=\"%s\">" - "</td>\n", - XP_GetClientStr(DBT_done_)); - dsgw_emits(outstr); - PR_snprintf(outstr, sizeof(outstr), "<td width=50%% align=center>" - "<input type=button value=\"%s\" " - "onClick=\"top.close()\"></td>\n", - XP_GetClientStr(DBT_cancel_2)); - dsgw_emits(outstr); - - dsgw_emits("</tr></table></center>\n"); - - dsgw_emits("</form>\n"); - - dsgw_emits("<SCRIPT language=JavaScript>\n"); - dsgw_emits("</SCRIPT>\n"); -} - - -static void -dsgw_conditional( char *name, int argc, char **argv, condfunc conditionalfn, - void *condarg ) -{ -#define DSGW_COND_STATUS_NO_COND_SEEN 0 -#define DSGW_COND_STATUS_IN_IF 1 -#define DSGW_COND_STATUS_IN_ELSE 2 -#define DSGW_COND_STATUS_IN_ELIF 3 - - static int cond_status = DSGW_COND_STATUS_NO_COND_SEEN; - static int cond_was_true = 0; - - if ( strncmp( name, "IF", 2 ) == 0 ) { - if ( cond_status != DSGW_COND_STATUS_NO_COND_SEEN ) { - template_error( XP_GetClientStr(DBT_foundAnotherIfNestedIfsAreNotSup_) ); - return; - } - cond_was_true = dsgw_condition_true( argc, argv, conditionalfn, - condarg ); - parse_status = cond_was_true ? DSGW_PARSE_STATUS_OUTPUT - : DSGW_PARSE_STATUS_NO_OUTPUT; - cond_status = DSGW_COND_STATUS_IN_IF; - - } else if ( strncmp( name, "ELSE", 4 ) == 0 ) { - if ( cond_status == DSGW_COND_STATUS_NO_COND_SEEN ) { - template_error( XP_GetClientStr(DBT_foundElseButDidnTSeeAnIf_) ); - return; - } - if ( cond_status == DSGW_COND_STATUS_IN_ELSE ) { - template_error( XP_GetClientStr(DBT_foundElseAfterElseExpectingEndif_) ); - return; - } - parse_status = cond_was_true ? DSGW_PARSE_STATUS_NO_OUTPUT - : DSGW_PARSE_STATUS_OUTPUT; - cond_status = DSGW_COND_STATUS_IN_ELSE; - - } else if ( strncmp( name, "ELIF", 4 ) == 0 ) { - if ( cond_status == DSGW_COND_STATUS_NO_COND_SEEN ) { - template_error( XP_GetClientStr(DBT_foundElifButDidnTSeeAnIf_) ); - return; - } - if ( cond_status == DSGW_COND_STATUS_IN_ELSE ) { - template_error( XP_GetClientStr(DBT_foundElifAfterElseExpectingEndif_) ); - return; - } - - if ( cond_was_true ) { - parse_status = DSGW_PARSE_STATUS_NO_OUTPUT; - } else { - cond_was_true = dsgw_condition_true( argc, argv, conditionalfn, - condarg ); - parse_status = cond_was_true ? DSGW_PARSE_STATUS_OUTPUT - : DSGW_PARSE_STATUS_NO_OUTPUT; - } - cond_status = DSGW_COND_STATUS_IN_ELIF; - - } else if ( strncmp( name, "ENDIF", 5 ) == 0 ) { - if ( cond_status == DSGW_COND_STATUS_NO_COND_SEEN ) { - template_error( XP_GetClientStr(DBT_foundEndifButDidnTSeeAnIf_) ); - } - parse_status = DSGW_PARSE_STATUS_NO_IF_SEEN; - cond_status = DSGW_COND_STATUS_NO_COND_SEEN; - } -} - - -static void -emit_last_op_info( int argc, char **argv ) -{ - char *s; - - if ( dsgw_last_op_info != NULL ) { - if (( s = get_arg_by_name( "prefix", argc, argv )) != NULL ) { - dsgw_emits( s ); - } - - dsgw_emits( dsgw_last_op_info ); - - if (( s = get_arg_by_name( "suffix", argc, argv )) != NULL ) { - dsgw_emits( s ); - } - } -} - - -static void -emit_version_str() -{ - dsgw_emits( Versionstr ); -} - - -static void -emit_alert_noentries() -{ - dsgw_emit_alertForm(); - dsgw_emits( "<SCRIPT LANGUAGE=JavaScript><!--\n" ); - dsgw_emit_alert (NULL, NULL, XP_GetClientStr(DBT_SearchFound0Entries_), - 0L, "", "", ""); - dsgw_emits( "// -->\n</SCRIPT>\n"); -} - - -static void -template_error( char *msg ) -{ - dsgw_emitf( XP_GetClientStr(DBT_BrBTemplateErrorBSBrN_), msg ); -} - - -static int -dsgw_condition_true( int argc, char **argv, condfunc conditionalfn, - void *condarg ) -{ - char *save_argv0; - int rc; - - if ( argc < 1 || conditionalfn == NULL ) { - return( 1 ); /* unknown, but we default to true */ - } - - if ( argv[0][0] == '!' ) { /* NOT */ - save_argv0 = argv[0]; - argv[0] = save_argv0 + 1; - } else { - save_argv0 = NULL; - } - - rc = (*conditionalfn)( argc, argv, condarg ); - - if ( save_argv0 != NULL ) { - argv[0] = save_argv0; - rc = !rc; /* '!' was seen -- reverse the result */ - } - - return( rc ); -} - -static int -dsgw_get_directive( -char *string -) -{ - int index = -1; - register int x; - - for ( x = 0; templates[ x ].name != NULL; x++ ) { - if ( !strncmp( string, templates[ x ].name, - strlen( templates[ x ].name ))) { - index = x; - break; - } - } - return index; -} - -int -dsgw_directive_is(char *target, char *directive) -{ - char *position = (target + strlen(DIRECTIVE_START)); - return(!(strncmp(directive, position, strlen(directive)))); -} - -static char ** -dsgw_get_vars( -char *string, -int *argc -) -{ - char **vars = (char **) NULL; - register int x; - int isvar; - char scratch[BIG_LINE]; - char lastchar, *p; - int numvars = 0; - - isvar = -1; - x = 0; - scratch[0] = '\0'; - lastchar = ' '; - - while ( *string != '\0' ) { - if (( *string == '\"' ) && ( lastchar != '\\' )) { - if ( isvar != -1 ) { - numvars++; - vars = (char **)dsgw_ch_realloc( vars, - ( numvars + 1 ) * sizeof ( char * )); - vars[ numvars - 1 ] = (char *) dsgw_ch_strdup( scratch ); - if (( p = strchr( vars[ numvars - 1 ], '=' )) != NULL ) { - dsgw_form_unescape( p + 1 ); - } - vars[ numvars ] = NULL; - isvar = -1; - } else { - isvar = 0; - } - } else { - if ( isvar != -1 ) { - /* check for scratch overflow */ - if ((strlen(string) + isvar) < sizeof(scratch)) { - isvar += LDAP_UTF8COPY(scratch + isvar, string); - scratch[ isvar ] = '\0'; - } else { - char msg[BUFSIZ]; - /* error - buffer overflow */ - PR_snprintf(msg, sizeof(msg), XP_GetClientStr(DBT_invalidTemplateVarLen), - strlen(string), string); - template_error(msg); - *argc = 0; - return NULL; - } - } else { - if ( *string == DIRECTIVE_END ) { - break; - } - } - } - lastchar = *string; - LDAP_UTF8INC(string); - } - *argc = numvars; - return vars; -} - - - - -/* - * Search the given arg vector for a "tag=value" string where "tag" is - * the same string as "name". If found, return a pointer to the beginning - * of the "value" string. If the value string is missing (e.g. "tag=" - * was given), return a zero-length string. If no matching tag was found, - * return NULL. - */ -char * -get_arg_by_name( char *name, int argc, char **argv ) -{ - int i; - - if (( i = dsgw_get_arg_pos_by_name( name, argc, argv )) >= 0 ) { - return( &argv[ i ][ strlen( name ) + 1 ] ); - } else { - return( NULL ); - } -} - - -int -dsgw_get_arg_pos_by_name( char *name, int argc, char **argv ) -{ - int i; - int nl = strlen( name ); - - for ( i = 0; i < argc; i++ ) { - if ( argv[ i ] != NULL ) { - if ( !strncasecmp( name, argv[ i ], nl )) { - if (( argv[ i ][ nl ] == '=' )) { - return( i ); - } - } - } - } - return( -1 ); -} - - -void -dsgw_argv_free( char **argv ) -{ - char **p; - - if ( argv != NULL ) { - for ( p = argv; *p != NULL; ++p ) { - free( *p ); - } - free( argv ); - } -} - - -savedlines * -dsgw_savelines_alloc() -{ - savedlines *slp; - - slp = dsgw_ch_malloc( sizeof( savedlines )); - memset( slp, 0, sizeof( savedlines )); - return( slp ); -} - - -void -dsgw_savelines_free( savedlines *svlp ) -{ - int i; - - for ( i = 0; i < svlp->svl_count; ++i ) { - free( svlp->svl_line[ i ] ); - } - free( svlp ); -} - - -void -dsgw_savelines_rewind( savedlines *svlp ) -{ - svlp->svl_current = 0; -} - - -void -dsgw_savelines_save( savedlines *svlp, char *line ) -{ - svlp->svl_line = (char **)dsgw_ch_realloc( svlp->svl_line, - (1 + svlp->svl_count ) * sizeof( char * )); - svlp->svl_line[ svlp->svl_count++ ] = dsgw_ch_strdup( line ); -} - - -char * -dsgw_savelines_next( savedlines *svlp ) -{ - char *p; - - if ( svlp->svl_current >= svlp->svl_count ) { - return( NULL ); - } - - p = svlp->svl_line[ svlp->svl_current ]; - ++svlp->svl_current; - - return( p ); -} |