/*=========================================== * main -- Main procedure of dbverify command *=========================================*/ int main (int argc, char **argv) { char *flags, *dbname; char *ptr; char * msg; BOOLEAN cflag=FALSE; /* create new db if not found */ INT writ=1; /* request write access to database */ BOOLEAN immut=FALSE; /* immutable access to database */ BOOLEAN allchecks=FALSE; /* if user requested all checks */ INT returnvalue=1; STRING crashlog=NULL; INT lldberrnum=0; int i=0; /* initialize all the low-level library code */ init_stdlib(); validate_errs(); #if HAVE_SETLOCALE /* initialize locales */ setlocale(LC_ALL, ""); #endif /* HAVE_SETLOCALE */ #if ENABLE_NLS ll_bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); #endif save_original_locales(); #ifdef WIN32 /* TO DO - research if this is necessary */ _fmode = O_BINARY; /* default to binary rather than TEXT mode */ #endif /* handle conventional arguments --version and --help */ /* needed for help2man to synthesize manual pages */ for (i=1; i<argc; ++i) { if (!strcmp(argv[i], "--version")) { print_version("dbverify"); return 0; } if (!strcmp(argv[i], "--help") || !strcmp(argv[i], "-?")) { print_usage(); return 0; } } if (argc != 3 || argv[1][0] != '-' || argv[1][1] == '\0') { print_usage(); goto done; } flags = argv[1]; dbname = argv[2]; for (ptr=&flags[1]; *ptr; ++ptr) { switch(*ptr) { case 'l': todo.check_dbstructure=TRUE; break; case 'g': todo.find_ghosts=TRUE; break; case 'G': todo.fix_ghosts=TRUE; break; case 'i': todo.check_indis=TRUE; break; case 'f': todo.check_fams=TRUE; break; case 's': todo.check_sours=TRUE; break; case 'e': todo.check_evens=TRUE; break; case 'x': todo.check_othes=TRUE; break; case 'n': noisy=TRUE; break; case 'a': allchecks=TRUE; break; case 'F': todo.fix_alter_pointers=TRUE; break; case 'm': todo.check_missing_data_records=TRUE; break; case 'M': todo.fix_missing_data_records=TRUE; break; case 'D': todo.fix_deletes=TRUE; break; case 'v': print_version("llexec"); goto done; case 'h': default: print_usage(); goto done; } } /* Turn off Memory Debugging */ /* This is unnecessary -- it is off anyway, Perry, 2001/10/28 */ alloclog = FALSE; /* Enable any checks needed for fixes selected */ if (todo.fix_missing_data_records) todo.check_missing_data_records = 1; /* initialize options & misc. stuff */ llgettext_set_default_localedir(LOCALEDIR); if (!init_lifelines_global(0, &msg, 0)) { printf("%s\n", msg); goto done; } /* setup crashlog in case init_screen fails (eg, bad menu shortcuts) */ crashlog = getlloptstr("CrashLog_dbverify", NULL); if (!crashlog) { crashlog = "Crashlog_dbverify.log"; } crash_setcrashlog(crashlog); /* NB: This assumes btree database */ if (!(BTR = bt_openbtree(dbname, cflag, writ, immut, &lldberrnum))) { char buffer[256]; describe_dberror(lldberrnum, buffer, ARRSIZE(buffer)); puts(buffer); goto done; } /* Do low-level checks before initializing lifelines database layer, because lifelines database init traverses btree for user options and translation tables, and here we check the infrastructure of the btree itself. */ if (todo.check_dbstructure || allchecks) { if (!check_btree(BTR)) goto done; } if (!init_lifelines_postdb()) { printf(_(qSbaddb)); goto done; } printf(_("Checking %s"), dbname); puts(""); /* all checks - if any new ones, have to update this */ if (allchecks) { todo.check_indis=todo.check_fams=todo.check_sours=TRUE; todo.check_evens=todo.check_othes=TRUE; todo.find_ghosts=TRUE; } if (todo.find_ghosts || todo.fix_ghosts) check_ghosts(); if (!(bwrite(BTR))) { todo.fix_alter_pointers = FALSE; todo.fix_ghosts = FALSE; } if (todo.check_indis || todo.check_fams || todo.check_sours || todo.check_evens || todo.check_othes) { check_and_fix_records(); } if (todo.check_missing_data_records) { check_missing_data_records(); } report_results(); closebtree(BTR); /* TODO: probably should call lldb_close, Perry 2005-10-07 */ BTR = 0; returnvalue = 0; done: return returnvalue; }
/*================================== * main -- Main routine of LifeLines *================================*/ int main (int argc, char **argv) { extern char *optarg; extern int optind; char * msg; int c; BOOLEAN ok=FALSE; STRING dbrequested=NULL; /* database (path) requested */ STRING dbused=NULL; /* database (path) found */ BOOLEAN forceopen=FALSE, lockchange=FALSE; char lockarg = 0; /* option passed for database lock */ INT alteration=0; LIST exprogs=NULL; TABLE exargs=NULL; STRING progout=NULL; BOOLEAN graphical=TRUE; STRING configfile=0; STRING crashlog=0; int i=0; /* initialize all the low-level library code */ init_stdlib(); #if HAVE_SETLOCALE /* initialize locales */ setlocale(LC_ALL, ""); #endif /* HAVE_SETLOCALE */ /* capture user's default codeset */ ext_codeset = strsave(ll_langinfo()); /* TODO: We can use this info for default conversions */ #if ENABLE_NLS /* setup gettext translation */ ll_bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); #endif save_original_locales(); load_usage(); /* handle conventional arguments --version and --help */ /* needed for help2man to synthesize manual pages */ for (i=1; i<argc; ++i) { if (!strcmp(argv[i], "--version") || !strcmp(argv[i], "-v")) { print_version("llexec"); return 0; } if (!strcmp(argv[i], "--help") || !strcmp(argv[i], "-h") || !strcmp(argv[i], "-?")) { print_usage(); return 0; } } /* Parse Command-Line Arguments */ opterr = 0; /* turn off getopt's error message */ while ((c = getopt(argc, argv, "adkrwil:fntc:Fu:x:o:zC:I:vh?")) != -1) { switch (c) { case 'c': /* adjust cache sizes */ while(optarg && *optarg) { if(isasciiletter((uchar)*optarg) && isupper((uchar)*optarg)) *optarg = tolower((uchar)*optarg); if(*optarg == 'i') { INT icsz_indi=0; sscanf(optarg+1, "%ld,%ld", &csz_indi, &icsz_indi); } else if(*optarg == 'f') { INT icsz_fam=0; sscanf(optarg+1, "%ld,%ld", &csz_fam, &icsz_fam); } else if(*optarg == 's') { INT icsz_sour=0; sscanf(optarg+1, "%ld,%ld", &csz_sour, &icsz_sour); } else if(*optarg == 'e') { INT icsz_even=0; sscanf(optarg+1, "%ld,%ld", &csz_even, &icsz_even); } else if((*optarg == 'o') || (*optarg == 'x')) { INT icsz_othr=0; sscanf(optarg+1, "%ld,%ld", &csz_othr, &icsz_othr); } optarg++; while(*optarg && isdigit((uchar)*optarg)) optarg++; if(*optarg == ',') optarg++; while(*optarg && isdigit((uchar)*optarg)) optarg++; } break; #ifdef FINNISH # ifdef FINNISHOPTION case 'F': /* Finnish sorting order [toggle] */ opt_finnish = !opt_finnish; /* TO DO - need to mark Finnish databases, as name records are not interoperable, because of different soundex encoding 2001/02/17, Perry Rapp */ break; # endif #endif case 'a': /* debug allocation */ alloclog = TRUE; break; case 'd': /* debug = no signal catchers */ debugmode = TRUE; break; case 'k': /* don't show key values */ keyflag = FALSE; break; case 'r': /* request for read only access */ readonly = TRUE; break; case 'w': /* request for write access */ writeable = TRUE; break; case 'i': /* immutable access */ immutable = TRUE; readonly = TRUE; break; case 'l': /* locking switch */ lockchange = TRUE; lockarg = *optarg; break; case 'f': /* force database open in all cases */ forceopen = TRUE; break; case 'n': /* use non-traditional family rules */ traditional = FALSE; break; case 't': /* show lots of trace statements for debugging */ prog_trace = TRUE; break; case 'x': /* execute program */ if (!exprogs) { exprogs = create_list2(LISTDOFREE); } push_list(exprogs, strdup(optarg ? optarg : "")); break; case 'I': /* program arguments */ { STRING optname=0, optval=0; parse_arg(optarg, &optname, &optval); if (optname && optval) { if (!exargs) { exargs = create_table_str(); } insert_table_str(exargs, optname, optval); } strfree(&optname); strfree(&optval); } break; case 'o': /* output directory */ progout = optarg; break; case 'z': /* nongraphical box */ graphical = FALSE; break; case 'C': /* specify config file */ configfile = optarg; break; case 'v': /* show version */ showversion = TRUE; goto usage; break; case 'h': /* show usage */ case '?': /* show usage */ showversion = TRUE; showusage = TRUE; goto usage; break; } } prompt_for_db: /* catch any fault, so we can close database */ if (debugmode) stdstring_hardfail(); else set_signals(); platform_init(); set_displaykeys(keyflag); /* initialize options & misc. stuff */ llgettext_set_default_localedir(LOCALEDIR); if (!init_lifelines_global(configfile, &msg, &main_db_notify)) { llwprintf("%s", msg); goto finish; } /* setup crashlog in case init_screen fails (eg, bad menu shortcuts) */ crashlog = getlloptstr("CrashLog_llexec", NULL); if (!crashlog) { crashlog = "Crashlog_llexec.log"; } crash_setcrashlog(crashlog); init_interpreter(); /* give interpreter its turn at initialization */ /* Validate Command-Line Arguments */ if ((readonly || immutable) && writeable) { llwprintf(_(qSnorwandro)); goto finish; } if (forceopen && lockchange) { llwprintf(_(qSnofandl)); goto finish; } if (lockchange && lockarg != 'y' && lockarg != 'n') { llwprintf(_(qSbdlkar)); goto finish; } if (forceopen) alteration = 3; else if (lockchange) { if (lockarg == 'y') alteration = 2; else alteration = 1; } c = argc - optind; if (c > 1) { showusage = TRUE; goto usage; } /* Open database, prompting user if necessary */ if (1) { STRING errmsg=0; if (!alldone && c>0) { dbrequested = strsave(argv[optind]); } else { strupdate(&dbrequested, ""); } if (!select_database(dbrequested, alteration, &errmsg)) { if (errmsg) { llwprintf(errmsg); } alldone = 0; goto finish; } } /* Start Program */ if (!init_lifelines_postdb()) { llwprintf(_(qSbaddb)); goto finish; } /* does not use show module */ /* does not use browse module */ if (exargs) { set_cmd_options(exargs); release_table(exargs); exargs = 0; } if (exprogs) { BOOLEAN picklist = FALSE; BOOLEAN timing = FALSE; interp_main(exprogs, progout, picklist, timing); destroy_list(exprogs); } else { /* TODO: prompt for report filename */ } /* does not use show module */ /* does not use browse module */ ok=TRUE; finish: /* we free this not because we care so much about these tiny amounts of memory, but to ensure we have the memory management right */ /* strfree frees memory & nulls pointer */ if (dbused) strfree(&dbused); strfree(&dbrequested); strfree(&readpath_file); shutdown_interpreter(); close_lifelines(); shutdown_ui(!ok); if (alldone == 2) goto prompt_for_db; /* changing databases */ termlocale(); strfree(&ext_codeset); usage: /* Display Version and/or Command-Line Usage Help */ if (showversion) { print_version("llexec"); } if (showusage) puts(usage_summary); /* Exit */ return !ok; }