static char rcsid[] = "@(#)$Id: elmterminal.c,v 1.19 2006/04/09 07:37:30 hurtta Exp $";

/******************************************************************************
 *  The Elm (ME+) Mail System  -  $Revision: 1.19 $   $State: Exp $
 *
 *  Author: Kari Hurtta <hurtta+elm@posti.FMI.FI> (was hurtta+elm@ozone.FMI.FI)
 *****************************************************************************/

#include "elmutil.h"
#include "s_me.h"
#include "s_elm.h"

#include "misclib.h"

#include "reghelper.h"

extern char *optarg;		
extern int   optind;		

char * program_name = "elmterminal";
int    register_fd  = -1;
char * register_module = NULL;

int main P_((int argc, char *argv[]));
int main(argc, argv)
     int argc;
     char *argv[];
{
    int err = 0;
    int c;
    int global = 0;
    struct terminal_map_item * MAP = NULL;
    char *targetfile = NULL;
    int config_merge = 0;
    
#if DEBUG
    init_debugfile("ELMTERMINAL");
#endif

    locale_init();
    
    REGHELPER_INIT(argv[0]);
    
    user_init();
    
    init_misclib();
    
    init_defaults();
    
    while ((c = getopt(argc, argv, "Gd:w:c")) != EOF) {
	switch(c) {
	case 'G':
	    global++;
	    break;
	case 'c':
	    config_merge++;
	    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 '?':
	    err = 1;
	    goto fail;
	}
    }
    
    
    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 ELMTERMINAL program (version %s).\n",
			     version_buff);

#if 0	
	if (d >= 50) {
	    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) {
	int errcount = 0;
	MAP = load_terminal_map(argv[optind],&errcount);
	if (!MAP || errcount) {
	    err = 1;
	    goto fail;
	}
    }

    if (config_merge) {

	if (!MAP) {
	    lib_error(CATGETS(elm_msg_cat, MeSet, MeConfigMergeMap,
			      "Config merge (-c) requires map as argument"));
	    err++;
	    goto fail;
	}

	if (targetfile) {
	    lib_error(CATGETS(elm_msg_cat, MeSet, MeConfigMergeNoW,
			      "Config merge (-c) Can not used with -w"));
	    err++;
	    goto fail;
	}

	if (global) {
	    change_terminal_map(& system_terminal_map, MAP);
	    free_terminal_map(&MAP);

	    MAP        = system_terminal_map;
	    targetfile = system_terminal_info;

	} else {
	    change_terminal_map(& user_terminal_map, MAP);
	    free_terminal_map(&MAP);

	    MAP = user_terminal_map;
	    targetfile = user_terminal_info;
	}

	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;
	    }
	}
    }


  
    if (!MAP) {
	if (global)
	    MAP = system_terminal_map;
	else
	    MAP = user_terminal_map;
    }

    if (targetfile) {
	char * tmp = elm_message(FRM("%s.N"),targetfile);
	int errcode = can_open(tmp,"w");
	FILE *f;
	
	if (errcode) {
	    lib_error(CATGETS(elm_msg_cat, MeSet, MeFileNotWriteable,
			      "File %.50s is not writeable: %s"),
		      tmp, error_description(errcode));
	    
	    err++;
	    free(tmp);
	    goto fail;
	}
	f = fopen(tmp,"w");
	if (!f) {
	    int errcode = errno;
	    lib_error(CATGETS(elm_msg_cat, MeSet, MeFileNotWriteable,
			      "File %.50s is not writeable: %s"),
		      tmp, error_description(errcode));
	    
	    err++;
	    free(tmp);
	    goto fail;
	}

	dump_terminal_map(f,MAP);

	if (EOF == fclose(f)) {
	    int errcode = errno;
	    lib_error(CATGETS(elm_msg_cat, MeSet, MeFileNotWriteable,
			      "File %.50s is not writeable: %s"),
		      tmp, error_description(errcode));
	    
	    err++;
	    free(tmp);
	    goto fail;
	}
	if (0 != rename(tmp,targetfile)) {
	    int errcode = errno;
	    lib_error(CATGETS(elm_msg_cat, MeSet, MeFileNotRenamed,
			      "Failed to rename temporary file to %.50s: %.30s"),
		      targetfile, error_description(errcode));
	    
	    err++;
	    free(tmp);
	    goto fail;
	}
	log_config(targetfile);
	free(tmp);
    }    
    else
	dump_terminal_map(stdout,MAP);
    
 fail:
    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:
 */


syntax highlighted by Code2HTML, v. 0.9.1