gecko-dev/cmd/xfe/e_kit_parser.c

950 строки
26 KiB
C

/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
/**********************************************************************
e_kit_parser.c
By Daniel Malmer
**********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <assert.h>
#include "xp_md5.h"
#include "sec.h"
#define OUTPUT_FILENAME "Netscape.lock"
static char buf[BUFSIZ];
int verbose = 0;
int fatal_errors = 0;
int lineno;
#define CHUNKSIZE 64;
char* output_buf = NULL;
int output_max_size = 0;
struct mapping;
typedef int validation_func(char*);
typedef void processing_func(struct mapping*, char*);
struct mapping {
char* token;
char* resource;
validation_func* validate;
processing_func* process;
char* desens[5];
};
extern void error(char*);
extern void warn(char*);
extern void default_handler(struct mapping*, char*);
extern void boolean_handler(struct mapping*, char*);
extern void menu_handler(struct mapping*, char*);
extern void proxy_handler(struct mapping*, char*);
extern void windoze_handler(struct mapping*, char*);
extern void mac_handler(struct mapping*, char*);
extern int boolean_validate(char*);
extern int number_validate(char*);
extern int user_agent_validate(char*);
extern int proxy_type_validate(char*);
extern void append_to_output_file(char*);
extern int matches(char* str1, char* str2);
struct proxy {
char* name;
char* resource;
char* host;
char* port;
};
struct proxy proxies[] = {
{"ftp_proxy", "ftp", NULL, NULL},
{"gopher_proxy", "gopher", NULL, NULL},
{"http_proxy", "http", NULL, NULL},
{"wais_proxy", "wais", NULL, NULL},
{"https_proxy", "https", NULL, NULL},
};
#define NUM_PROXIES (sizeof(proxies)/sizeof(proxies[0]))
struct mapping mappings[] = {
{"logo button url", ".logoButtonUrl", NULL, default_handler, {NULL}},
{"home page", ".homePage", NULL, default_handler,
{"*general_prefs*startupFrame*startupBox.home",
"*general_prefs*startupFrame*startupBox.blank",
"*general_prefs*startupFrame*startupBox.homeText",
}
},
{"nntp_server", ".nntpServer", NULL, default_handler,
{"*mailnews_prefs*newsFrame*newshostText"}
},
{"smtp_server", ".smtpServer", NULL, default_handler,
{"*mailnews_prefs*outMailFrame*smtpText"}
},
{"pop_server", ".popServer", NULL, default_handler,
{"*mailnews_prefs*inMailFrame*srvrText"}
},
{"autoload home page", ".autoloadHomePage", boolean_validate, default_handler,
{"*general_prefs*startupFrame*startupBox.home",
"*general_prefs*startupFrame*startupBox.blank"
}
},
{"leave on server", ".leaveOnServer", boolean_validate, boolean_handler,
{"*mailnews_prefs*inMailFrame*msgRemove",
"*mailnews_prefs*inMailFrame*msgLeave"
}
},
{"proxy type", ".proxyMode", proxy_type_validate, default_handler,
{"*network_prefs*proxiesFrame*manualToggle",
"*network_prefs*proxiesFrame*autoToggle",
"*network_prefs*proxiesFrame*noProxiesToggle"},
},
{"ftp_proxy", ".ftpProxy", NULL, proxy_handler, {NULL}},
{"gopher_proxy", ".gopherProxy", NULL, proxy_handler, {NULL}},
{"http_proxy", ".httpProxy", NULL, proxy_handler, {NULL}},
{"wais_proxy", ".waisProxy", NULL, proxy_handler, {NULL}},
{"https_proxy", ".httpsProxy", NULL, proxy_handler, {NULL}},
{"ftp_proxyport", ".ftpProxyPort", number_validate, proxy_handler, {NULL}},
{"gopher_proxyport", ".gopherProxyPort", number_validate, proxy_handler, {NULL}},
{"http_proxyport", ".httpProxyPort", number_validate, proxy_handler, {NULL}},
{"news_proxyport", ".newsProxyPort", number_validate, proxy_handler, {NULL}},
{"wais_proxyport", ".waisProxyPort", number_validate, proxy_handler, {NULL}},
{"https_proxyport", ".httpsProxyPort", number_validate, proxy_handler, {NULL}},
{"socks_server", ".socksServer", NULL, default_handler,
{"*proxiesFrame*socksText"}
},
{"socks_serverport", ".socksServerPort", number_validate, default_handler,
{"*proxiesFrame*socksPort"}
},
{"no_proxy", ".noProxy", NULL, default_handler,
{"*proxiesFrame*noText"}
},
{"auto config url", ".autoconfigUrl", NULL, default_handler,
{"*network_prefs*proxiesFrame*locationText"}
},
{"user agent", ".userAgent", user_agent_validate, default_handler, {NULL}},
{"x animation file", ".animationFile", NULL, default_handler, {NULL}},
{"button 1", "*urlBar*inetIndex.labelString", NULL, default_handler, {NULL}},
{"button 2", "*urlBar*inetWhite.labelString", NULL, default_handler, {NULL}},
{"button 3", "*urlBar*inetYellow.labelString", NULL, default_handler, {NULL}},
{"button 4", "*urlBar*whatsNew.labelString", NULL, default_handler, {NULL}},
{"button 5", "*urlBar*whatsCool.labelString", NULL, default_handler, {NULL}},
{"button 1 url", ".inetIndexBUrl", NULL, default_handler, {NULL}},
{"button 2 url", ".inetWhiteBUrl", NULL, default_handler, {NULL}},
{"button 3 url", ".inetYellowBUrl", NULL, default_handler, {NULL}},
{"button 4 url", ".whatsNewBUrl", NULL, default_handler, {NULL}},
{"button 5 url", ".whatsCoolBUrl", NULL, default_handler, {NULL}},
{"directory 1", "*menuBar*inetIndex", NULL, menu_handler, {NULL}},
{"directory 2", "*menuBar*inetWhite", NULL, menu_handler, {NULL}},
{"directory 3", "*menuBar*inetSearch", NULL, menu_handler, {NULL}},
{"directory 4", "*menuBar*whatsNew", NULL, menu_handler, {NULL}},
{"directory 5", "*menuBar*whatsCool", NULL, menu_handler, {NULL}},
{"directory 6", "*menuBar*directoryMenu6", NULL, menu_handler, {NULL}},
{"directory 7", "*menuBar*directoryMenu7", NULL, menu_handler, {NULL}},
{"directory 8", "*menuBar*directoryMenu8", NULL, menu_handler, {NULL}},
{"directory 9", "*menuBar*directoryMenu9", NULL, menu_handler, {NULL}},
{"directory 10", "*menuBar*directoryMenu10", NULL, menu_handler, {NULL}},
{"directory 11", "*menuBar*directoryMenu11", NULL, menu_handler, {NULL}},
{"directory 12", "*menuBar*directoryMenu12", NULL, menu_handler, {NULL}},
{"directory 13", "*menuBar*directoryMenu13", NULL, menu_handler, {NULL}},
{"directory 14", "*menuBar*directoryMenu14", NULL, menu_handler, {NULL}},
{"directory 15", "*menuBar*directoryMenu15", NULL, menu_handler, {NULL}},
{"directory 16", "*menuBar*directoryMenu16", NULL, menu_handler, {NULL}},
{"directory 17", "*menuBar*directoryMenu17", NULL, menu_handler, {NULL}},
{"directory 18", "*menuBar*directoryMenu18", NULL, menu_handler, {NULL}},
{"directory 19", "*menuBar*directoryMenu19", NULL, menu_handler, {NULL}},
{"directory 20", "*menuBar*directoryMenu20", NULL, menu_handler, {NULL}},
{"directory 21", "*menuBar*directoryMenu21", NULL, menu_handler, {NULL}},
{"directory 22", "*menuBar*directoryMenu22", NULL, menu_handler, {NULL}},
{"directory 23", "*menuBar*directoryMenu23", NULL, menu_handler, {NULL}},
{"directory 24", "*menuBar*directoryMenu24", NULL, menu_handler, {NULL}},
{"directory 25", "*menuBar*directoryMenu25", NULL, menu_handler, {NULL}},
{"directory 1 url", ".netscapeUrl", NULL, default_handler, {NULL}},
{"directory 2 url", ".whatsNewUrl", NULL, default_handler, {NULL}},
{"directory 3 url", ".whatsCoolUrl", NULL, default_handler, {NULL}},
{"directory 4 url", ".directoryMenu4Url", NULL, default_handler, {NULL}},
{"directory 5 url", ".galleriaUrl", NULL, default_handler, {NULL}},
{"directory 6 url", ".inetIndexUrl", NULL, default_handler, {NULL}},
{"directory 7 url", ".inetSearchUrl", NULL, default_handler, {NULL}},
{"directory 8 url", ".inetWhiteUrl", NULL, default_handler, {NULL}},
{"directory 9 url", ".inetAboutUrl", NULL, default_handler, {NULL}},
{"directory 10 url", ".directoryMenu10Url", NULL, default_handler, {NULL}},
{"directory 11 url", ".directoryMenu11Url", NULL, default_handler, {NULL}},
{"directory 12 url", ".directoryMenu12Url", NULL, default_handler, {NULL}},
{"directory 13 url", ".directoryMenu13Url", NULL, default_handler, {NULL}},
{"directory 14 url", ".directoryMenu14Url", NULL, default_handler, {NULL}},
{"directory 15 url", ".directoryMenu15Url", NULL, default_handler, {NULL}},
{"directory 16 url", ".directoryMenu16Url", NULL, default_handler, {NULL}},
{"directory 17 url", ".directoryMenu17Url", NULL, default_handler, {NULL}},
{"directory 18 url", ".directoryMenu18Url", NULL, default_handler, {NULL}},
{"directory 19 url", ".directoryMenu19Url", NULL, default_handler, {NULL}},
{"directory 20 url", ".directoryMenu20Url", NULL, default_handler, {NULL}},
{"directory 21 url", ".directoryMenu21Url", NULL, default_handler, {NULL}},
{"directory 22 url", ".directoryMenu22Url", NULL, default_handler, {NULL}},
{"directory 23 url", ".directoryMenu23Url", NULL, default_handler, {NULL}},
{"directory 24 url", ".directoryMenu24Url", NULL, default_handler, {NULL}},
{"directory 25 url", ".directoryMenu25Url", NULL, default_handler, {NULL}},
{"directory 1 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 2 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 3 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 4 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 5 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 6 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 7 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 8 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 9 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 10 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 11 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 12 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 13 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 14 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 15 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 16 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 17 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 18 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 19 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 20 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 21 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 22 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 23 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 24 prompt", NULL, NULL, windoze_handler, {NULL}},
{"directory 25 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 1", "*menuBar*manual", NULL, menu_handler, {NULL}},
{"help 2", "*menuBar*relnotes", NULL, menu_handler, {NULL}},
{"help 3", "*menuBar*productInfo", NULL, menu_handler, {NULL}},
{"help 4", "*menuBar*feedback", NULL, menu_handler, {NULL}},
{"help 5", "*menuBar*intl", NULL, menu_handler, {NULL}},
{"help 6", "*menuBar*abourSecurity", NULL, menu_handler, {NULL}},
{"help 7", "*menuBar*helpMenu7", NULL, menu_handler, {NULL}},
{"help 8", "*menuBar*registration", NULL, menu_handler, {NULL}},
{"help 9", "*menuBar*upgrade", NULL, menu_handler, {NULL}},
{"help 10", "*menuBar*services", NULL, menu_handler, {NULL}},
{"help 11", "*menuBar*aboutUsenet", NULL, menu_handler, {NULL}},
{"help 12", "*menuBar*aboutPlugins", NULL, menu_handler, {NULL}},
{"help 13", "*menuBar*helpMenu13", NULL, menu_handler, {NULL}},
{"help 14", "*menuBar*helpMenu14", NULL, menu_handler, {NULL}},
{"help 15", "*menuBar*helpMenu15", NULL, menu_handler, {NULL}},
{"help 16", "*menuBar*helpMenu16", NULL, menu_handler, {NULL}},
{"help 17", "*menuBar*helpMenu17", NULL, menu_handler, {NULL}},
{"help 18", "*menuBar*helpMenu18", NULL, menu_handler, {NULL}},
{"help 19", "*menuBar*helpMenu19", NULL, menu_handler, {NULL}},
{"help 20", "*menuBar*helpMenu20", NULL, menu_handler, {NULL}},
{"help 21", "*menuBar*helpMenu21", NULL, menu_handler, {NULL}},
{"help 22", "*menuBar*helpMenu22", NULL, menu_handler, {NULL}},
{"help 23", "*menuBar*helpMenu23", NULL, menu_handler, {NULL}},
{"help 24", "*menuBar*helpMenu24", NULL, menu_handler, {NULL}},
{"help 25", "*menuBar*helpMenu25", NULL, menu_handler, {NULL}},
{"help 1 url", ".manualUrl", NULL, default_handler, {NULL}},
{"help 2 url", ".relnotesUrl", NULL, default_handler, {NULL}},
{"help 3 url", ".productInfoUrl", NULL, default_handler, {NULL}},
{"help 4 url", ".feedbackUrl", NULL, default_handler, {NULL}},
{"help 5 url", ".intlUrl", NULL, default_handler, {NULL}},
{"help 6 url", ".aboutSecurityUrl", NULL, default_handler, {NULL}},
{"help 7 url", ".helpMenu7Url", NULL, default_handler, {NULL}},
{"help 8 url", ".registrationUrl", NULL, default_handler, {NULL}},
{"help 9 url", ".upgradeUrl", NULL, default_handler, {NULL}},
{"help 10 url", ".servicesUrl", NULL, default_handler, {NULL}},
{"help 11 url", ".aboutUsenetUrl", NULL, default_handler, {NULL}},
{"help 12 url", ".aboutpluginsUrl", NULL, default_handler, {NULL}},
{"help 13 url", ".helpMenu13Url", NULL, default_handler, {NULL}},
{"help 14 url", ".helpMenu14Url", NULL, default_handler, {NULL}},
{"help 15 url", ".helpMenu15Url", NULL, default_handler, {NULL}},
{"help 16 url", ".helpMenu16Url", NULL, default_handler, {NULL}},
{"help 17 url", ".helpMenu17Url", NULL, default_handler, {NULL}},
{"help 18 url", ".helpMenu18Url", NULL, default_handler, {NULL}},
{"help 19 url", ".helpMenu19Url", NULL, default_handler, {NULL}},
{"help 20 url", ".helpMenu20Url", NULL, default_handler, {NULL}},
{"help 21 url", ".helpMenu21Url", NULL, default_handler, {NULL}},
{"help 22 url", ".helpMenu22Url", NULL, default_handler, {NULL}},
{"help 23 url", ".helpMenu23Url", NULL, default_handler, {NULL}},
{"help 24 url", ".helpMenu24Url", NULL, default_handler, {NULL}},
{"help 25 url", ".helpMenu25Url", NULL, default_handler, {NULL}},
{"help 1 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 2 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 3 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 4 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 5 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 6 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 7 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 8 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 9 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 10 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 11 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 12 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 13 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 14 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 15 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 16 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 17 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 18 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 19 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 20 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 21 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 22 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 23 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 24 prompt", NULL, NULL, windoze_handler, {NULL}},
{"help 25 prompt", NULL, NULL, windoze_handler, {NULL}},
};
#define NUM_MAPPINGS (sizeof(mappings)/sizeof(mappings[0]))
/*
* boolean_validate
*/
int
boolean_validate(char* arg)
{
if ( !matches(arg, "yes") &&
!matches(arg, "no") &&
!matches(arg, "true") &&
!matches(arg, "false") ) {
error("Valid values are 'yes', 'no', 'true' or 'false'.");
return 0;
}
return 1;
}
/*
* number_validate
*/
int
number_validate(char* arg)
{
char* ptr;
for ( ptr = arg; *ptr != '\0'; ptr++ ) {
if ( !isdigit(*ptr) ) {
error("Value must be a number.");
return 0;
}
}
return 1;
}
/*
* proxy_type_validate
*/
int
proxy_type_validate(char* arg)
{
if ( matches(arg, "none") ||
matches(arg, "0") ) {
strcpy(arg, "0");
return 1;
}
if ( matches(arg, "manual") ||
matches(arg, "1") ) {
strcpy(arg, "1");
return 1;
}
if ( matches(arg, "automatic") ||
matches(arg, "2") ) {
strcpy(arg, "2");
return 1;
}
error("Valid values are 'None', 'Manual', 'Automatic', or 0-2.");
return 0;
}
/*
* user_agent_validate
*/
int
user_agent_validate(char* arg)
{
char* ptr;
if ( strlen(arg) > 10 ) {
error("User Agent strings are limited to 10 characters or less.");
return 0;
}
for ( ptr = arg; *ptr != '\0'; ptr++ ) {
if ( !isalnum(*ptr) && *ptr != '-' && *ptr != '_' ) {
error("User Agent strings consist of alphanumerics, '-', and '_'.");
return 0;
}
}
return 1;
}
/*
* usage
*/
void
usage(char* progname)
{
fprintf(stderr, "Usage: %s filename\n", progname);
}
/*
* warn
*/
void
warn(char* msg)
{
fprintf(stderr, "Warning: Line %d: %s\n", lineno, msg);
}
/*
* error
*/
void
error(char* msg)
{
fatal_errors++;
fprintf(stderr, "Error: Line %d: %s\n", lineno, msg);
}
/*
* is_blank
* Returns True if the line has nothing on it except for whitespace.
*/
int
is_blank(char* line)
{
assert(line);
while ( *line && isspace(*line) ) line++;
return ( *line == '\0' );
}
/*
* is_comment
* Returns True if the line is a comment.
* Comments begin with the '#' character.
* Comments can only appear on lines by themselves.
*/
int
is_comment(char* line)
{
assert(line);
while ( *line && isspace(*line) ) line++;
return ( *line == '#' );
}
/*
* is_section
*/
int
is_section(char* line)
{
for ( ; isspace(*line); line++ ) ;
if ( *line != '[' ) return 0;
for ( ; *line != ']' && *line != '\0'; line++ ) ;
if ( *line != ']' ) return 0;
for ( line++; *line != '\0'; line++ ) if (!isspace(*line)) return 0;
return 1;
}
/*
* get_left_side
*/
char*
get_left_side(char* line)
{
char* left_side;
char* ptr;
assert(line);
if ( !strchr(line, '=') ) {
error("Missing '='.");
return NULL;
}
while ( *line && isspace(*line) ) line++;
left_side = strdup(line);
for ( ptr = strchr(left_side, '='); *ptr == '=' || isspace(*ptr); ptr-- ) {
*ptr = '\0';
}
return left_side;
}
/*
* get_right_side
*/
char*
get_right_side(char* line)
{
char* right_side;
char* ptr;
assert(line);
for ( ptr = strchr(line, '=') + 1; isspace(*ptr); ptr++ ) ;
right_side = ptr;
if ( right_side[0] != '\0' ) {
for ( ptr = strchr(right_side, '\0') - 1; isspace(*ptr); ptr-- ) {
*ptr = '\0';
}
}
if ( right_side[0] == '"' || *ptr == '"' ) {
if ( right_side[0] == '"' && *ptr == '"' ) {
right_side++;
*ptr = '\0';
} else {
error("Unbalanced quotation mark.");
return NULL;
}
}
return strdup(right_side);
}
/*
* default_handler
*/
void
default_handler(struct mapping* mapping, char* right_side)
{
int i;
assert(mapping);
sprintf(buf, "Netscape%s: %s\n", mapping->resource, right_side);
append_to_output_file(buf);
for ( i = 0; mapping->desens[i] != NULL; i++ ) {
sprintf(buf, "Netscape%s.sensitive: False\n", mapping->desens[i]);
append_to_output_file(buf);
}
}
/*
* windoze_handler
*/
void
windoze_handler(struct mapping* mapping, char* right_side)
{
static int warned = 0;
if ( !warned ) {
warn("Menu prompts are ignored on this platform.");
warned = 1;
}
}
/*
* mac_handler
*/
void
mac_handler(struct mapping* mapping, char* right_side)
{
warn("Ignoring rule used only on Macintosh platform.");
}
/*
* boolean_handler
* The right side has been validated, so it should only be
* 'yes', 'no', 'true', or 'false'.
*/
void
boolean_handler(struct mapping* mapping, char* right_side)
{
if ( matches(right_side, "true") || matches(right_side, "yes") ) {
default_handler(mapping, "True");
} else {
default_handler(mapping, "False");
}
}
/*
* get_mnemonic
*/
char
get_mnemonic(char* str)
{
char mnemonic = '\0';
char* ptr;
for ( ptr = str; *ptr != '\0'; ptr++, str++ ) {
if ( *ptr == '&' ) {
ptr++;
if ( *ptr != '&' ) mnemonic = *ptr;
}
*str = *ptr;
}
*str = *ptr;
return mnemonic;
}
/*
* menu_handler
*/
void
menu_handler(struct mapping* mapping, char* right_side)
{
char mnemonic = get_mnemonic(right_side);
sprintf(buf, "Netscape%s.labelString: %s\n", mapping->resource, right_side);
append_to_output_file(buf);
if ( mnemonic ) {
sprintf(buf, "Netscape%s.mnemonic: %c\n", mapping->resource, mnemonic);
append_to_output_file(buf);
}
}
/*
* proxy_handler
*/
void
proxy_handler(struct mapping* mapping, char* right_side)
{
int i;
for ( i = 0; i < NUM_PROXIES; i++ ) {
if ( strstr(mapping->token, proxies[i].name) ) {
if ( strstr(mapping->token, "proxyport") ) {
proxies[i].port = strdup(right_side);
} else {
proxies[i].host = strdup(right_side);
}
}
}
}
/*
* handle_rule
*/
void
handle_rule(struct mapping* mapping, char* line)
{
char* right_side = get_right_side(line);
if ( right_side == NULL ) return;
if ( mapping->validate == NULL || mapping->validate(right_side) == 1 ) {
assert(mapping->process);
mapping->process(mapping, right_side);
}
free(right_side);
}
/*
* matches
*/
int
matches(char* str1, char* str2)
{
assert(str1);
assert(str2);
for ( ; *str1 && *str2; str1++, str2++ ) {
if ( tolower(*str1) != tolower(*str2) ) return 0;
}
return ( *str1 == '\0' && *str2 == '\0' );
}
/*
* process_input_line
*/
void
process_input_line(char* line)
{
int i;
char* left_side;
if ( is_blank(line) ||
is_comment(line) ||
is_section(line) ) return;
*strchr(line, '\n') = '\0';
left_side = get_left_side(line);
if ( left_side == NULL ) return;
for ( i = 0; i < NUM_MAPPINGS; i++ ) {
if ( matches(left_side, mappings[i].token) ) {
handle_rule(&(mappings[i]), line);
break;
}
}
if ( i == NUM_MAPPINGS ) {
sprintf(buf, "Unrecognized token '%s'.", left_side);
error(buf);
}
free(left_side);
}
/*
* append_to_output_file
*/
void
append_to_output_file(char* line)
{
while ( output_buf == NULL ||
strlen(output_buf) + strlen(line) >= output_max_size ) {
output_max_size+= CHUNKSIZE;
output_buf = (char*) realloc(output_buf, output_max_size);
}
strcat(output_buf, line);
}
/*
* obscure
*/
void
obscure(char* buf)
{
int i;
static int offset = 0;
int len = buf ? strlen(buf) : 0;
for ( i = 0; i < len; i++, offset++ ) {
buf[i]+= ( 40 + (offset % 10) );
}
}
/*
* write_hash
*/
void
write_hash(FILE* file)
{
sprintf(buf, "! %s\n", XP_Md5PCPrintable(output_buf, strlen(output_buf)));
if ( verbose ) {
printf("Hash is '%s'", buf);
}
obscure(buf);
if ( fwrite(buf, sizeof(char), strlen(buf), file) != strlen(buf) ) {
perror("fwrite");
exit(errno);
}
}
/*
* write_output_file
*/
void
write_output_file(void)
{
FILE* output_file;
if ( fatal_errors ) {
fprintf(stderr, "No output file created due to error%s.\n",
fatal_errors == 1 ? "" : "s");
return;
}
if ( output_buf == NULL ) return;
if ( (output_file = fopen(OUTPUT_FILENAME, "w")) == NULL ) {
perror(OUTPUT_FILENAME);
exit(errno);
}
write_hash(output_file);
obscure(output_buf);
if ( fwrite(output_buf, sizeof(char), strlen(output_buf), output_file) !=
strlen(output_buf) ) {
perror(OUTPUT_FILENAME);
exit(errno);
}
if ( fclose(output_file) == -1 ) {
perror(OUTPUT_FILENAME);
exit(errno);
}
fprintf(stderr, "Wrote '%s'\n", OUTPUT_FILENAME);
}
/*
* output_proxies
*/
void
output_proxies(void)
{
int i;
for ( i = 0; i < NUM_PROXIES; i++ ) {
if ( proxies[i].host && proxies[i].port ) {
sprintf(buf, "Netscape.%sProxy: %s:%s\n", proxies[i].resource,
proxies[i].host,
proxies[i].port);
append_to_output_file(buf);
sprintf(buf, "Netscape*proxiesBox*%sText.sensitive: False\n",
proxies[i].resource);
append_to_output_file(buf);
sprintf(buf, "Netscape*proxiesBox*%sPort.sensitive: False\n",
proxies[i].resource);
append_to_output_file(buf);
continue;
}
if ( proxies[i].host && !proxies[i].port ) {
sprintf(buf, "Specified %s without %s_port\n", proxies[i].name,
proxies[i].name);
error(buf);
}
if ( !proxies[i].host && proxies[i].port ) {
sprintf(buf, "Specified %s_port without %s\n", proxies[i].name,
proxies[i].name);
error(buf);
}
}
}
/*
* main
*/
int
main(int argc, char* argv[])
{
FILE* file;
char* filename;
switch ( argc ) {
case 2:
verbose = 0;
filename = argv[1];
break;
#ifdef DEBUG
case 3:
if ( !strcmp(argv[1], "-v") ) {
verbose = 1;
filename = argv[2];
} else {
usage(argv[0]);
exit(1);
}
break;
#endif
default:
usage(argv[0]);
exit(1);
break;
}
if ( (file = fopen(filename, "r")) == NULL ) {
perror(filename);
exit(errno);
}
append_to_output_file("! e-kit v2.0b1\n");
for ( lineno = 1; fgets(buf, sizeof(buf), file) != NULL; lineno++ ) {
if ( !strchr(buf, '\n') ) {
warn("Line too long. Ignored.");
} else {
process_input_line(buf);
}
}
output_proxies();
write_output_file();
return 0;
}
#ifdef HPUX
/*
* pull_in_MD5_HashBuf
* Doesn't get linked in otherwise.
* You can use this if the '-u MD5_HashBuf' flag
* isn't supported.
*/
static void
pull_in_MD5_HashBuf(void)
{
MD5_HashBuf(0, 0, 0);
}
#endif