static char rcsid[] = "@(#)$Id: elmrc-write.c,v 1.21 2006/04/09 07:37:30 hurtta Exp $"; /****************************************************************************** * The Elm (ME+) Mail System - $Revision: 1.21 $ $State: Exp $ * * Author: Kari Hurtta (was hurtta+elm@ozone.FMI.FI) ***************************************************************************** * Some code based on ../src/save_optc.c (but that code may be moved to * lib/write_rc.c) * That code was following copyright: * * The Elm Mail System * * Copyright (c) 1988-1992 USENET Community Trust * Copyright (c) 1986,1987 Dave Taylor *****************************************************************************/ #include "elmutil.h" #include "s_me.h" #include "s_elm.h" #include "s_elmrc.h" #include "rc_imp.h" #include "save_opts.h" #include "reghelper.h" DEBUG_VAR(Debug,__FILE__,"util"); extern char *optarg; extern int optind; int register_fd = -1; char * program_name = "elmrc-write"; char * register_module = NULL; int main P_((int argc, char *argv[])); int main(argc, argv) int argc; char *argv[]; { int err = 0; int global = 0; int c; int write_default = 0; char * targetfile = NULL; FILE * commentfile = NULL; char * elmrc_changes = NULL; struct elmrc_recorder * recorder = NULL; FILE * elmrc_changes_F = NULL; #if DEBUG init_debugfile("ELMRC-WRITE"); #endif locale_init(); REGHELPER_INIT(argv[0]); while ((c = getopt(argc, argv, "GId:w:C:c:")) != EOF) { switch(c) { case 'G': global++; break; case 'I': write_default++; break; case 'd': #if DEBUG set_debugging(optarg); #else lib_error(CATGETS(elm_msg_cat, ElmSet, ElmArgsIngoringDebug, "Warning: system created without debugging enabled - request ignored\n")); #endif break; case 'w' : targetfile = optarg; if (0 != access(targetfile,WRITE_ACCESS)) { int errcode = errno; if (errcode != ENOENT) { lib_error(CATGETS(elm_msg_cat, MeSet, MeFileNotWriteable, "File %.50s is not writeable: %s"), targetfile, error_description(errcode)); err++; goto fail; } } break; case 'c': elmrc_changes = optarg; if (0 != access(elmrc_changes,WRITE_ACCESS)) { int errcode = errno; if (errcode != ENOENT) { lib_error(CATGETS(elm_msg_cat, MeSet, MeFileNotWriteable, "File %.50s is not writeable: %s"), elmrc_changes, error_description(errcode)); err++; goto fail; } } elmrc_changes_F = open_or_create(elmrc_changes); if (!elmrc_changes_F) { int errcode = errno; if (errcode != ENOENT) { lib_error(CATGETS(elm_msg_cat, MeSet, MeFileNotWriteable, "File %.50s is not writeable: %s"), elmrc_changes, error_description(errcode)); err++; goto fail; } } break; case 'C': if (0 != access(optarg,READ_ACCESS)) { int errcode = errno; lib_error(CATGETS(elm_msg_cat, MeSet, MeFileNotReadable, "File %.50s is not readable: %s"), optarg, error_description(errcode)); err++; goto fail; } commentfile = fopen(optarg,"r"); if (!commentfile) { int errcode = errno; lib_error(CATGETS(elm_msg_cat, MeSet, MeFileNotReadable, "File %.50s is not readable: %s"), optarg, error_description(errcode)); err++; goto fail; } break; case '?': err = 1; goto fail; } } user_init(); if (elmrc_changes_F) { recorder = enable_recorder(global ? SYSTEM_RC : LOCAL_RC); seed_history(elmrc_changes_F,elmrc_changes,recorder); } init_defaults(); elm_sfprintf(version_buff, sizeof version_buff, FRM("%s PL%s"), VERSION, PATCHLEVEL); #ifdef DEBUG { int d = panic_dprint("\n\ ======================================================\n\ Debug output of the ELMRC-WRITE program (version %s).\n", version_buff); if (d >= 50) { #if 0 panic_dprint("WARNING: Edit manually out sensitive information from that file!\n"); lower_prompt("WARNING: Debug file may include passwords -- edit it!"); sleep(5+sleepmsg); #endif } } #endif if (!global) read_rc_file(0); else post_init_check(0); if (optind < argc) { FILE * F; if (0 != access(argv[optind],READ_ACCESS)) { int errcode = errno; lib_error(CATGETS(elm_msg_cat, MeSet, MeFileNotReadable, "File %.50s is not readable: %s"), argv[optind], error_description(errcode)); err++; goto fail; } F = fopen(argv[optind],"r"); if (!F) { int errcode = errno; lib_error(CATGETS(elm_msg_cat, MeSet, MeFileNotReadable, "File %.50s is not readable: %s"), argv[optind], error_description(errcode)); err++; goto fail; } /* Returns number of errors */ if (parse_elmrc(F,global,argv[optind]) != 0) err++; fclose(F); if (err) goto fail; } if (targetfile && write_default) { lib_error(CATGETS(elm_msg_cat, ElmrcSet, ElmrcNoBothwI, "Can't specify both -w and -I options!")); err++; goto fail; } if (write_default) targetfile = global ? system_rc_file : user_rc_file; if (targetfile) { int r = write_rc(targetfile,commentfile,global, "ELMRCWRITE", NULL); if (!r) { err++; goto fail; } log_config(targetfile); } if (elmrc_changes_F) { rewind(elmrc_changes_F); #ifdef FTRUNCATE /* Not really necessary */ ftruncate(fileno(elmrc_changes_F),0); #endif print_history_changed(elmrc_changes_F,recorder); } fail: if (elmrc_changes_F) fclose(elmrc_changes_F); if (commentfile) fclose(commentfile); if (err) lib_error(CATGETS(elm_msg_cat, MeSet, MeProgFailed, "%s failed; exit code=%d"), argv[0],err); return err; } /* * Local Variables: * mode:c * c-basic-offset:4 * buffer-file-coding-system: iso-8859-1 * End: */