/* -*- 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 #include #include #include #include #include #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