123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383 |
- /*
- * CDE - Common Desktop Environment
- *
- * Copyright (c) 1993-2012, The Open Group. All rights reserved.
- *
- * These libraries and programs are free software; you can
- * redistribute them and/or modify them under the terms of the GNU
- * Lesser General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * These libraries and programs are distributed in the hope that
- * they will be useful, but WITHOUT ANY WARRANTY; without even the
- * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE. See the GNU Lesser General Public License for more
- * details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with these libraries and programs; if not, write
- * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
- * Floor, Boston, MA 02110-1301 USA
- */
- /*
- * COMPONENT_NAME: austext
- *
- * FUNCTIONS: UNMALLOC
- * dump_dblk
- * oe_initialize
- * oe_uninitialize
- *
- * ORIGINS: 27
- *
- *
- * (C) COPYRIGHT International Business Machines Corp. 1991,1995
- * All Rights Reserved
- * Licensed Materials - Property of IBM
- * US Government Users Restricted Rights - Use, duplication or
- * disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
- */
- /******************************* DTOEINIT.C ********************************
- * $XConsortium: dtoeinit.c /main/6 1996/11/21 19:49:29 drk $
- * Sept 1991.
- * Contains oe_initialize() function from universal "Opera Engine" code.
- * Has been separated out because it is the largest function and
- * needs to be tested separately.
- *
- * $Log$
- * Revision 2.4 1996/03/13 22:52:04 miker
- * Enabled several language loading debug requests from API.
- *
- * Revision 2.3 1995/10/25 21:59:27 miker
- * Renamed from oeinit.c. Added prolog.
- *
- * Log: oeinit.c,v
- * Revision 2.2 1995/10/02 20:39:22 miker
- * Added zbflags arg to load_semantic().
- *
- * Revision 2.1 1995/09/22 21:38:53 miker
- * Freeze DtSearch 0.1, AusText 2.1.8
- *
- * Revision 1.14 1995/09/05 18:58:01 miker
- * Changed all socblk refs to universal, global usrblk (no more merges).
- * Deleted numerous globals. Added DTSEARCH define.
- * Conflated all msglists to one ausapi_msglist. All for DtSearch...
- */
- #include "SearchE.h"
- #include <string.h>
- #include <sys/stat.h>
- #include <stdlib.h>
- #define XOS_USE_NO_LOCKING
- #define X_INCLUDE_TIME_H
- #include <X11/Xos_r.h>
- #define PROGNAME "DTOEINIT"
- #define MS_misc 1
- #define MS_oeinit 9
- extern int debugging_loadlang;
- /************************************************/
- /* */
- /* UNMALLOC */
- /* */
- /************************************************/
- /* macro to test and free any malloc'ed pointer */
- #define UNMALLOC(ptr) if(ptr){free(ptr);ptr=NULL;}
- /********************************/
- /* */
- /* dump_dblk */
- /* */
- /********************************/
- /* Dumps values from passed dblk.
- * Used only for debugging initialization.
- */
- static void dump_dblk (char *msgprefix, DBLK *d)
- {
- int i;
- fprintf (aa_stderr, "%s: DBLK v#%d name='%s' label='%s', path='%s'\n",
- NULLORSTR (msgprefix), d->vistano, NULLORSTR (d->name),
- NULLORSTR (d->label), NULLORSTR (d->path));
- fprintf (aa_stderr, " mx=%d kt=", d->maxhits);
- for (i = 0; i < d->ktcount; i++) {
- fputc (' ', aa_stderr);
- if (d->keytypes[i].is_selected)
- fputc ('*', aa_stderr);
- fputc (d->keytypes[i].ktchar, aa_stderr);
- }
- fputc ('\n', aa_stderr);
- return;
- } /* dump_dblk() */
- /************************************************/
- /* */
- /* oe_initialize */
- /* */
- /************************************************/
- /* - verify version number compatibilities.
- * - initialize socblk and OE_... globals.
- * - load site defaults ocf file and create database list.
- * - load dictionaries.
- * - merge site defaults into usrblk.
- * - open database(s).
- */
- void oe_initialize (void)
- {
- char *ptr;
- int good_dblk_count = 0;
- DBLK *db, *bad_db, **lastlink;
- char sprintbuf[1024];
- FILE *stream;
- OEFTAB *oef;
- if (usrblk.debug & USRDBG_RARE)
- fprintf (aa_stderr, PROGNAME "555 Entered Engine Initialization.\n");
- debugging_loadlang = (usrblk.debug & USRDBG_RARE);
- /* Initialize most of the engine's globals.
- * OE_bit_vector_size is set in ve_initialize().
- * OE_bmhtab... are set by boyer-moore string searches only.
- * OE_prodname is initialized by compiler and maybe changed by main().
- * OE_expiration is initialized by compiler and never reset.
- * OE_sitecnfg_fname is initialized by ausapi or loadocf and never reset.
- * OE_sitecnfg_mtime is initialized by oe_initialize() and never reset.
- */
- global_memory_ptr = NULL;
- austext_exit_mem = (void (*) (int)) release_shm_mem;
- OE_flags = 0L;
- OE_objsize = 0L;
- OE_search_type = 'P'; /* default is statistical searches */
- OE_words_hitlimit = WORDS_HITLIMIT;
- OE_enable_markdel = FALSE; /* former lvl2 default: TRUE */
- OE_enable_usernotes = FALSE; /* former lvl2 default: TRUE */
- OE_fastdecode = FALSE; /* former lvl2 default: TRUE */
- OE_fileio = "-OFF"; /* former lvl2 default: "-ON" */
- OE_uppercase_keys = FALSE; /* former lvl2 default: TRUE */
- OEF_audit = FNAME_AUDIT;
- OEF_discard = FNAME_DISCARD_DATA;
- OEF_news = FNAME_SITENEWS;
- OEF_notesnot = FNAME_NOTES_BAC;
- OEF_notessem = FNAME_NOTES_SEM;
- OEF_readme = FNAME_README;
- for (oef = oef_table; oef->id != NULL; oef++)
- oef->previously_specified = FALSE;
- /* Verify version number compatibility between engine and UI.
- * Only checked if request is OE_INITIALIZE, not on reinits.
- */
- if (usrblk.request == OE_INITIALIZE) {
- if (!is_compatible_version (usrblk.query, SCHEMA_VERSION) ||
- !is_compatible_version (usrblk.query, PROTOCOL_VERSION)) {
- if (usrblk.query != NULL)
- ptr = usrblk.query;
- else
- ptr = CATGETS(dtsearch_catd, MS_misc, 6, "<unknown>");
- sprintf (sprintbuf, CATGETS(dtsearch_catd, MS_oeinit, 137,
- "%s User Interface version %s and Engine "
- "version %s are incompatible."),
- PROGNAME"137", ptr, AUSAPI_VERSION);
- DtSearchAddMessage (sprintbuf);
- usrblk.retncode = OE_NOTAVAIL;
- return;
- }
- }
- /* Load site configuration (ocf) file and create dblks list */
- if (!load_ocf()) {
- sprintf (sprintbuf, CATGETS(dtsearch_catd, MS_oeinit, 202,
- "%s Initialization failed due to errors in configuration file."),
- PROGNAME"202");
- DtSearchAddMessage (sprintbuf);
- usrblk.retncode = OE_NOTAVAIL;
- return;
- }
- /* Had to wait to write audit file till after site config set the flags */
- if (OE_flags & OE_AUDIT || usrblk.debug & USRDBG_RARE) {
- sprintf (sprintbuf,
- "ENGINEINIT='%s' UVER='%s' " AUDIT_WHOWHEN "\n",
- AUSAPI_VERSION, usrblk.query, usrblk.userid,
- nowstring (NULL));
- if (usrblk.debug & USRDBG_RARE)
- fprintf (aa_stderr, PROGNAME "362 %s", sprintbuf);
- if (OE_flags & OE_AUDIT) {
- if ((stream = fopen (OEF_audit, "a ")) != NULL)
- /* the blank in "a " works around old aix bug */
- {
- fputs (sprintbuf, stream);
- fclose (stream);
- }
- }
- } /* endif to write to audit file */
- /* ---- DATABASES PASSES #1 - #3 ------------------------------------
- * Call vista to open databases and load system (dbrec) records.
- * Where possible, this call will forgive errors by just
- * unlinking the offending dblk from the dblist.
- * However loss of all dblks equals a fatal error.
- */
- if (!ve_initialize()) {
- INIT_FAILED:
- sprintf (sprintbuf, CATGETS(dtsearch_catd, MS_oeinit, 266,
- "%s Initialization failed due to errors in database,\n"
- " language, or related files."),
- PROGNAME "266");
- DtSearchAddMessage (sprintbuf);
- usrblk.retncode = OE_NOTAVAIL;
- return;
- }
- /* ---- DATABASES PASS #4 ------------------------------------
- * Load each database's language and semantic files.
- * If an error is discovered in any one dblk,
- * it is unlinked from dblist.
- * However loss of all dblks on dblist is fatal.
- */
- good_dblk_count = 0;
- db = usrblk.dblist; /* could already = NULL after ve_initialize() */
- lastlink = &usrblk.dblist;
- while (db != NULL) {
- if (!load_language (db, usrblk.dblist))
- goto DELETE_DB;
- /*
- * This dblk successfully loaded its language and and semantic
- * files. If no gui label was provided, set it to the
- * database name. Then increment pointers and continue.
- */
- if (db->label == NULL)
- db->label = strdup (db->name);
- else if (db->label[0] == 0)
- db->label = strdup (db->name);
- good_dblk_count++;
- lastlink = &db->link;
- db = db->link;
- continue;
- DELETE_DB:
- /*
- * One or more language or semantic files could not be loaded for
- * this dblk. Unlink it and don't increment pointers.
- */
- bad_db = db; /* temp save */
- *lastlink = db->link;
- db = db->link;
- free (bad_db);
- } /* end loop that loads all database files */
- /* Abort if fatal dictionary load errors */
- if (good_dblk_count <= 0) {
- sprintf (sprintbuf, CATGETS(dtsearch_catd, MS_misc, 8,
- "%s No valid databases remain."),
- PROGNAME"265");
- DtSearchAddMessage (sprintbuf);
- goto INIT_FAILED;
- }
- memset (&saveusr, 0, sizeof (SAVEUSR));
- OE_flags |= OE_INITOK;
- if (usrblk.debug & USRDBG_RARE) {
- struct tm *time_ptr;
- _Xltimeparams localtime_buf;
- if (*OE_expiration != 0)
- {
- time_ptr = _XLocaltime(OE_expiration, localtime_buf);
- strftime (sprintbuf, 100, "%x", time_ptr);
- }
- else
- strcpy (sprintbuf, "0");
- if (OE_sitecnfg_mtime != 0)
- {
- time_ptr = _XLocaltime(&OE_sitecnfg_mtime, localtime_buf);
- strftime (sprintbuf + 100, 100, "%x,%X", time_ptr);
- }
- else
- strcpy (sprintbuf + 100, "0");
- fprintf (aa_stderr, PROGNAME "666 Engine Initialization Completed.\n"
- " usrblk.flags=%ld(x%04lx), usrblk.debug=%ld(x%04lx).\n"
- " OE_flags=%ld(x%04lx), expiration=%s, sitecnfg=%s.\n"
- ,usrblk.flags, usrblk.flags, usrblk.debug, usrblk.debug
- ,OE_flags, OE_flags, sprintbuf, sprintbuf + 100
- );
- }
- usrblk.retncode = OE_OK;
- return;
- } /* oe_initialize() */
- /************************************************/
- /* */
- /* oe_uninitialize */
- /* */
- /************************************************/
- /* Called by Opera_Engine() whenever the site config file
- * has been altered. Closes databases, frees all allocated storage,
- * and resets everything so oe_initialize() can be re-called.
- * Allows administrator to swap to newer, updated databases
- * without forcing users to shutdown by changing PATH value
- * in site config file.
- */
- void oe_uninitialize (void)
- {
- DBLK *db, *nextdb;
- OEFTAB *oef;
- ve_shutdown (); /* close all databases */
- UNMALLOC (usrblk.abstrbuf);
- /* release shared memory, suffixes array, etc, if any */
- release_shm_mem ();
- /* Free allocated storage in oef table and reset the default filenames. */
- for (oef = oef_table; oef->id != NULL; oef++) {
- if (oef->previously_specified) {
- oef->previously_specified = FALSE;
- free (*(oef->OEFptr));
- }
- }
- db = usrblk.dblist;
- while (db != NULL) {
- /* Save next dblk so we'll know where to go after freeing this one */
- nextdb = db->link;
- UNMALLOC (db->path);
- UNMALLOC (db->keytypes);
- if (db->iifile != NULL) {
- fclose (db->iifile);
- db->iifile = NULL;
- }
- if (db->syofile != NULL) {
- fclose (db->syofile);
- db->syofile = NULL;
- }
- if (db->syifile != NULL) {
- fclose (db->syifile);
- db->syifile = NULL;
- }
- unload_language (db);
- free (db);
- db = nextdb;
- }
- usrblk.dblist = NULL;
- usrblk.dblk = NULL;
- return;
- } /* oe_uninitialize() */
- /******************************* DTOEINIT.C ********************************/
|