static char rcsid[] = "@(#)$Id: elmbindata.c,v 1.10 2006/07/27 15:06:10 hurtta Exp $"; /****************************************************************************** * The Elm (ME+) Mail System - $Revision: 1.10 $ $State: Exp $ * * Author: Kari Hurtta (was hurtta+elm@ozone.FMI.FI) *****************************************************************************/ #include "elmutil.h" #include "s_me.h" #include "s_elm.h" #include "cs_imp.h" #include "bindata.h" #include "reghelper.h" DEBUG_VAR(Debug,__FILE__,"util"); int register_fd = -1; char * program_name = "elmbindata"; char * register_module = NULL; #include "charmapcopy.h" extern char *optarg; extern int optind; int main P_((int argc, char *argv[])); int main(argc, argv) int argc; char *argv[]; { struct bindata_mapped_data * bindata = NULL; char * target_file = NULL; char * text_target_dir = NULL; char **filelist = NULL; int err = 0; int c; int global = 0; #if DEBUG init_debugfile("ELMBINDATA"); #endif locale_init(); REGHELPER_INIT(argv[0]); user_init(); init_defaults(); while ((c = getopt(argc, argv, "Gw:d:b:BIT:S:")) != EOF) { switch(c) { case 'G': global++; break; case 'w': target_file = optarg; break; case 'I': target_file = bindata_path; if (0 == strcmp(bindata_path,"none")) { /* This is more like debug option */ fprintf(stderr,"%s: bindata = %s\n", program_name,unidata_path); target_file = NULL; } break; case 'S': copydirs = safe_realloc(copydirs,(copydir_count+1) * sizeof (*copydirs)); copydirs[copydir_count++] = optarg; 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 'B': bindata = default_bindata(); if (!bindata) { err = 1; goto fail; } lib_error(CATGETS(elm_msg_cat, MeSet, MeFileLoaded, "%s loaded"), raw_bindata_path); break; case 'b': if (!get_bindata(&bindata,optarg)) { err = 1; goto fail; } lib_error(CATGETS(elm_msg_cat, MeSet, MeFileLoaded, "%s loaded"), optarg); break; case 'T': text_target_dir = optarg; if (0 == mkdir(text_target_dir,0700)) { lib_error(CATGETS(elm_msg_cat, MeSet, MeCreateDir, "Directory %s created"), text_target_dir); if (register_fd != -1) log_it("M",text_target_dir,"-","-",0700,NULL); } else if (EEXIST != errno) { lib_error(CATGETS(elm_msg_cat, MeSet, MeCantCreateDir, "Can't create directory %s"), text_target_dir); err = 1; goto fail; } break; case '?': exit(1); } } 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 ELMBINDATA 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 (copydir_count) set_charmap_copy_callback(charmap_copy); if (!global) read_rc_file(READ_FLAG_BINDATA_INIT); else post_init_check(READ_FLAG_BINDATA_INIT); if (!bindata) bindata = generate_bindata(); if (target_file && bindata) { if (!write_bindata(bindata,target_file)) exit(1); if (global && bindata_path && 0 == strcmp(bindata_path,target_file)) { if (0 != chmod(target_file,0644)) { int errcode = errno; fprintf(stderr,"%s: chmod %s: %s\n", program_name, target_file, error_description(errcode)); err = 1; } } log_config(target_file); } if (text_target_dir && bindata) { int i; if (!write_bindata_text(bindata,text_target_dir, &filelist)) exit(1); if (!filelist) exit(1); for (i = 0; filelist[i]; i++) { log_config(filelist[i]); free(filelist[i]); } free(filelist); } 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: */