mirror of
https://github.com/envmodules/modules.git
synced 2026-06-10 00:56:30 +08:00
1613 lines
91 KiB
HTML
1613 lines
91 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
|
|
<!-- This HTML file generated by cxref (version 1.6a). -->
|
|
<!-- cxref program (c) Andrew M. Bishop 1995,96,97,98,99,2000,01,02,03,04,05. -->
|
|
|
|
<!--
|
|
Cxref: cxref -block-comments -verbatim-comments -xref-all -index-all -html-src -Oxref error.c
|
|
CPP : cxref-cpp -lang-c -C -dD -dI
|
|
-->
|
|
|
|
<HTML>
|
|
|
|
<HEAD>
|
|
<TITLE>Source File error.c</TITLE>
|
|
<LINK rel="stylesheet" href="cxref.css" type="text/css">
|
|
</HEAD>
|
|
|
|
<BODY>
|
|
|
|
<pre>
|
|
<a name="line1">1 |</a> /*****
|
|
<a name="line2">2 |</a> ** ** Module Header ******************************************************* **
|
|
<a name="line3">3 |</a> ** **
|
|
<a name="line4">4 |</a> ** Modules Revision 3.0 **
|
|
<a name="line5">5 |</a> ** Providing a flexible user environment **
|
|
<a name="line6">6 |</a> ** **
|
|
<a name="line7">7 |</a> ** File: error.c **
|
|
<a name="line8">8 |</a> ** First Edition: 1991/10/23 **
|
|
<a name="line9">9 |</a> ** **
|
|
<a name="line10">10 |</a> ** Authors: Jens Hamisch, jens@Strawberry.COM **
|
|
<a name="line11">11 |</a> ** **
|
|
<a name="line12">12 |</a> ** Description: The modules error logger **
|
|
<a name="line13">13 |</a> ** **
|
|
<a name="line14">14 |</a> ** Exports: Module_Error **
|
|
<a name="line15">15 |</a> ** GetFacilityPtr **
|
|
<a name="line16">16 |</a> ** CheckFacility **
|
|
<a name="line17">17 |</a> ** Enable_Error **
|
|
<a name="line18">18 |</a> ** Disable_Error **
|
|
<a name="line19">19 |</a> ** Restore_Error **
|
|
<a name="line20">20 |</a> ** **
|
|
<a name="line21">21 |</a> ** Notes: **
|
|
<a name="line22">22 |</a> ** **
|
|
<a name="line23">23 |</a> ** ************************************************************************ **
|
|
<a name="line24">24 |</a> ****/
|
|
<a name="line25">25 |</a>
|
|
<a name="line26">26 |</a> /** ** Copyright *********************************************************** **
|
|
<a name="line27">27 |</a> ** **
|
|
<a name="line28">28 |</a> ** Copyright 1991-1994 by John L. Furlan. **
|
|
<a name="line29">29 |</a> ** see LICENSE.GPL, which must be provided, for details **
|
|
<a name="line30">30 |</a> ** **
|
|
<a name="line31">31 |</a> ** ************************************************************************ **/
|
|
<a name="line32">32 |</a>
|
|
<a name="line33">33 |</a> static char Id[] = "@(#)$Id: error.c.src.html,v 1.6 2006/01/18 05:35:11 rkowen Exp $";
|
|
<a name="line34">34 |</a> static void *UseId[] = { &UseId, Id };
|
|
<a name="line35">35 |</a>
|
|
<a name="line36">36 |</a> /** ************************************************************************ **/
|
|
<a name="line37">37 |</a> /** HEADERS **/
|
|
<a name="line38">38 |</a> /** ************************************************************************ **/
|
|
<a name="line39">39 |</a>
|
|
<a name="line40">40 |</a> #include "modules_def.h"
|
|
<a name="line41">41 |</a> #if HAVE_STDARG_H
|
|
<a name="line42">42 |</a> # include <stdarg.h>
|
|
<a name="line43">43 |</a> #else
|
|
<a name="line44">44 |</a> # error "You need an ANSI C compiler"
|
|
<a name="line45">45 |</a> #endif
|
|
<a name="line46">46 |</a>
|
|
<a name="line47">47 |</a> #if defined(HAVE_SYSLOG) && defined(WITH_LOGGING)
|
|
<a name="line48">48 |</a> # include <syslog.h>
|
|
<a name="line49">49 |</a> #endif
|
|
<a name="line50">50 |</a>
|
|
<a name="line51">51 |</a> #include <pwd.h>
|
|
<a name="line52">52 |</a> #include <grp.h>
|
|
<a name="line53">53 |</a>
|
|
<a name="line54">54 |</a> /** ************************************************************************ **/
|
|
<a name="line55">55 |</a> /** LOCAL DATATYPES **/
|
|
<a name="line56">56 |</a> /** ************************************************************************ **/
|
|
<a name="line57">57 |</a>
|
|
<a name="line58">58 |</a> /**
|
|
<a name="line59">59 |</a> ** Error weights
|
|
<a name="line60">60 |</a> **/
|
|
<a name="line61">61 |</a>
|
|
<a name="line62">62 |</a> typedef enum _err_weights {
|
|
<a name="line63">63 |</a> WGHT_NONE=0, /** Dummy value: No error **/
|
|
<a name="line64">64 |</a> WGHT_VERBOSE, /** Verbose messages **/
|
|
<a name="line65">65 |</a> WGHT_INFO=3, /** Informal message **/
|
|
<a name="line66">66 |</a> WGHT_DEBUG=5, /** Debugger output **/
|
|
<a name="line67">67 |</a> WGHT_TRACE, /** Tracing output **/
|
|
<a name="line68">68 |</a> WGHT_WARN=10, /** Warning: Prog. flow not affected **/
|
|
<a name="line69">69 |</a> WGHT_PROB=20, /** Problem: Prog. flow cond. aff. **/
|
|
<a name="line70">70 |</a> WGHT_ERROR=25, /** Error and Fatal: Prog. flow aff. **/
|
|
<a name="line71">71 |</a> WGHT_FATAL=27, /** Return to the caller **/
|
|
<a name="line72">72 |</a> WGHT_PANIC=29 /** Panic: Exit program immediatelly **/
|
|
<a name="line73">73 |</a> } ErrWeights;
|
|
<a name="line74">74 |</a>
|
|
<a name="line75">75 |</a> /**
|
|
<a name="line76">76 |</a> ** Log facilities
|
|
<a name="line77">77 |</a> **/
|
|
<a name="line78">78 |</a>
|
|
<a name="line79">79 |</a> typedef struct _err_facility {
|
|
<a name="line80">80 |</a> ErrWeights Weight; /** Error weight **/
|
|
<a name="line81">81 |</a> char *facility; /** Log facility **/
|
|
<a name="line82">82 |</a> char *def_facility; /** Default facility (facility undef)**/
|
|
<a name="line83">83 |</a> } ErrFacilities;
|
|
<a name="line84">84 |</a>
|
|
<a name="line85">85 |</a> typedef struct _facil_names {
|
|
<a name="line86">86 |</a> char *name; /** Name of a facility **/
|
|
<a name="line87">87 |</a> int token; /** Assigned token **/
|
|
<a name="line88">88 |</a> } FacilityNames;
|
|
<a name="line89">89 |</a>
|
|
<a name="line90">90 |</a> /**
|
|
<a name="line91">91 |</a> ** Error measurement table
|
|
<a name="line92">92 |</a> **/
|
|
<a name="line93">93 |</a>
|
|
<a name="line94">94 |</a> typedef struct {
|
|
<a name="line95">95 |</a> ErrWeights error_weight; /** The weight itsself **/
|
|
<a name="line96">96 |</a> char *message; /** Message to be printed **/
|
|
<a name="line97">97 |</a> ErrCode ret_nov, /** Return code **/
|
|
<a name="line98">98 |</a> ret_adv,
|
|
<a name="line99">99 |</a> ret_exp;
|
|
<a name="line100">100 |</a> } ErrMeasr;
|
|
<a name="line101">101 |</a>
|
|
<a name="line102">102 |</a> /**
|
|
<a name="line103">103 |</a> ** Error code translation table
|
|
<a name="line104">104 |</a> **/
|
|
<a name="line105">105 |</a>
|
|
<a name="line106">106 |</a> typedef struct {
|
|
<a name="line107">107 |</a> ErrType error_type; /** The error type as specified by **/
|
|
<a name="line108">108 |</a> /** the caller **/
|
|
<a name="line109">109 |</a> ErrWeights error_weight; /** The weight of this error **/
|
|
<a name="line110">110 |</a> char *messages; /** List of messages to be printed **/
|
|
<a name="line111">111 |</a> } ErrTransTab;
|
|
<a name="line112">112 |</a>
|
|
<a name="line113">113 |</a> /** ************************************************************************ **/
|
|
<a name="line114">114 |</a> /** CONSTANTS **/
|
|
<a name="line115">115 |</a> /** ************************************************************************ **/
|
|
<a name="line116">116 |</a>
|
|
<a name="line117">117 |</a> #define ARGLIST_SIZE 10
|
|
<a name="line118">118 |</a> #define ERR_LINELEN 80 /** internal buffer size **/
|
|
<a name="line119">119 |</a> #define ERR_BUFSIZE 4096 /** buffer for the whole error msg. **/
|
|
<a name="line120">120 |</a>
|
|
<a name="line121">121 |</a> /** ************************************************************************ **/
|
|
<a name="line122">122 |</a> /** MACROS **/
|
|
<a name="line123">123 |</a> /** ************************************************************************ **/
|
|
<a name="line124">124 |</a>
|
|
<a name="line125">125 |</a> /** not applicable **/
|
|
<a name="line126">126 |</a>
|
|
<a name="line127">127 |</a> /** ************************************************************************ **/
|
|
<a name="line128">128 |</a> /** LOCAL DATA **/
|
|
<a name="line129">129 |</a> /** ************************************************************************ **/
|
|
<a name="line130">130 |</a>
|
|
<a name="line131">131 |</a> static char module_name[] = "error.c"; /** File name of this module **/
|
|
<a name="line132">132 |</a>
|
|
<a name="line133">133 |</a> /**
|
|
<a name="line134">134 |</a> ** Local flags
|
|
<a name="line135">135 |</a> **/
|
|
<a name="line136">136 |</a> static int quiet_on_error = 0;
|
|
<a name="line137">137 |</a>
|
|
<a name="line138">138 |</a> /**
|
|
<a name="line139">139 |</a> ** Local strings
|
|
<a name="line140">140 |</a> **/
|
|
<a name="line141">141 |</a>
|
|
<a name="line142">142 |</a> static char unknown[] = "unknown"; /** If something's unknown **/
|
|
<a name="line143">143 |</a>
|
|
<a name="line144">144 |</a> static char buffer[ ERR_LINELEN]; /** Internal string buffer **/
|
|
<a name="line145">145 |</a> char *error_line = NULL;
|
|
<a name="line146">146 |</a> static int strsize = 0;
|
|
<a name="line147">147 |</a>
|
|
<a name="line148">148 |</a> /**
|
|
<a name="line149">149 |</a> ** Log facility table
|
|
<a name="line150">150 |</a> **/
|
|
<a name="line151">151 |</a>
|
|
<a name="line152">152 |</a> static char _stderr[] = "stderr";
|
|
<a name="line153">153 |</a> static char _stdout[] = "stdout";
|
|
<a name="line154">154 |</a> static char _null[] = "null";
|
|
<a name="line155">155 |</a> static char _none[] = "none";
|
|
<a name="line156">156 |</a> static char _unknown[] = "unknown";
|
|
<a name="line157">157 |</a>
|
|
<a name="line158">158 |</a> static ErrFacilities Facilities[] = {
|
|
<a name="line159">159 |</a> { WGHT_NONE, NULL, NULL },
|
|
<a name="line160">160 |</a> { WGHT_VERBOSE, NULL, DEF_FACILITY_VERBOSE },
|
|
<a name="line161">161 |</a> { WGHT_INFO, NULL, DEF_FACILITY_INFO },
|
|
<a name="line162">162 |</a> { WGHT_DEBUG, NULL, DEF_FACILITY_DEBUG },
|
|
<a name="line163">163 |</a> { WGHT_TRACE, NULL, DEF_FACILITY_TRACE },
|
|
<a name="line164">164 |</a> { WGHT_WARN, NULL, DEF_FACILITY_WARN },
|
|
<a name="line165">165 |</a> { WGHT_PROB, NULL, DEF_FACILITY_PROB },
|
|
<a name="line166">166 |</a> { WGHT_ERROR, NULL, DEF_FACILITY_ERROR },
|
|
<a name="line167">167 |</a> { WGHT_FATAL, NULL, DEF_FACILITY_FATAL },
|
|
<a name="line168">168 |</a> { WGHT_PANIC, NULL, DEF_FACILITY_PANIC }
|
|
<a name="line169">169 |</a> };
|
|
<a name="line170">170 |</a>
|
|
<a name="line171">171 |</a> /**
|
|
<a name="line172">172 |</a> ** Syslog facility names
|
|
<a name="line173">173 |</a> **/
|
|
<a name="line174">174 |</a>
|
|
<a name="line175">175 |</a> static FacilityNames facility_names[] = {
|
|
<a name="line176">176 |</a> #if defined(HAVE_SYSLOG) && defined(WITH_LOGGING)
|
|
<a name="line177">177 |</a> { "auth", LOG_AUTH },
|
|
<a name="line178">178 |</a> { "cron", LOG_CRON },
|
|
<a name="line179">179 |</a> { "daemon", LOG_DAEMON },
|
|
<a name="line180">180 |</a> { "kern", LOG_KERN },
|
|
<a name="line181">181 |</a> { "local0", LOG_LOCAL0 },
|
|
<a name="line182">182 |</a> { "local1", LOG_LOCAL1 },
|
|
<a name="line183">183 |</a> { "local2", LOG_LOCAL2 },
|
|
<a name="line184">184 |</a> { "local3", LOG_LOCAL3 },
|
|
<a name="line185">185 |</a> { "local4", LOG_LOCAL4 },
|
|
<a name="line186">186 |</a> { "local5", LOG_LOCAL5 },
|
|
<a name="line187">187 |</a> { "local6", LOG_LOCAL6 },
|
|
<a name="line188">188 |</a> { "local7", LOG_LOCAL7 },
|
|
<a name="line189">189 |</a> { "lpr", LOG_LPR },
|
|
<a name="line190">190 |</a> { "mail", LOG_MAIL },
|
|
<a name="line191">191 |</a> { "news", LOG_NEWS },
|
|
<a name="line192">192 |</a> { "user", LOG_USER },
|
|
<a name="line193">193 |</a> { "uucp", LOG_UUCP }
|
|
<a name="line194">194 |</a> #else
|
|
<a name="line195">195 |</a> { "none", 0 }
|
|
<a name="line196">196 |</a> #endif
|
|
<a name="line197">197 |</a> };
|
|
<a name="line198">198 |</a>
|
|
<a name="line199">199 |</a> /**
|
|
<a name="line200">200 |</a> ** Syslog level names
|
|
<a name="line201">201 |</a> **/
|
|
<a name="line202">202 |</a>
|
|
<a name="line203">203 |</a> static FacilityNames level_names[] = {
|
|
<a name="line204">204 |</a> #if defined(HAVE_SYSLOG) && defined(WITH_LOGGING)
|
|
<a name="line205">205 |</a> { "alert", LOG_ALERT },
|
|
<a name="line206">206 |</a> { "crit", LOG_CRIT },
|
|
<a name="line207">207 |</a> { "debug", LOG_DEBUG },
|
|
<a name="line208">208 |</a> { "emerg", LOG_EMERG },
|
|
<a name="line209">209 |</a> { "err", LOG_ERR },
|
|
<a name="line210">210 |</a> { "info", LOG_INFO },
|
|
<a name="line211">211 |</a> { "notice", LOG_NOTICE },
|
|
<a name="line212">212 |</a> { "warning", LOG_WARNING }
|
|
<a name="line213">213 |</a> #else
|
|
<a name="line214">214 |</a> { "none", 0 }
|
|
<a name="line215">215 |</a> #endif
|
|
<a name="line216">216 |</a> };
|
|
<a name="line217">217 |</a>
|
|
<a name="line218">218 |</a> /**
|
|
<a name="line219">219 |</a> ** Error measurement table
|
|
<a name="line220">220 |</a> ** Take care that this list is sorted in ascending order concerning the error
|
|
<a name="line221">221 |</a> ** weights
|
|
<a name="line222">222 |</a> **/
|
|
<a name="line223">223 |</a>
|
|
<a name="line224">224 |</a> #define MEAS_VERB_NDX 1 /** Index of the 'VERBOSE' entry **/
|
|
<a name="line225">225 |</a>
|
|
<a name="line226">226 |</a> static ErrMeasr Measurements[] = {
|
|
<a name="line227">227 |</a> { WGHT_NONE, "" , OK, OK, OK },
|
|
<a name="line228">228 |</a> { WGHT_VERBOSE,"VERB" , OK, OK, OK },
|
|
<a name="line229">229 |</a> { WGHT_INFO, "INFO" , OK, OK, OK },
|
|
<a name="line230">230 |</a> { WGHT_DEBUG, "DEBUG", OK, OK, OK },
|
|
<a name="line231">231 |</a> { WGHT_TRACE, "TRACE", OK, OK, OK },
|
|
<a name="line232">232 |</a> { WGHT_WARN, "WARN" , PROBLEM, WARN, OK },
|
|
<a name="line233">233 |</a> { WGHT_PROB, "PROB" , ERROR, PROBLEM, OK },
|
|
<a name="line234">234 |</a> { WGHT_ERROR, "ERROR", ERROR, ERROR, ERROR },
|
|
<a name="line235">235 |</a> { WGHT_FATAL, "FATAL", FATAL, FATAL, FATAL },
|
|
<a name="line236">236 |</a> { WGHT_PANIC, "PANIC", PANIC, PANIC, PANIC },
|
|
<a name="line237">237 |</a> };
|
|
<a name="line238">238 |</a>
|
|
<a name="line239">239 |</a> /**
|
|
<a name="line240">240 |</a> ** Error code translation table
|
|
<a name="line241">241 |</a> ** Take care that this list is sorted in ascending order concerning the error
|
|
<a name="line242">242 |</a> ** types
|
|
<a name="line243">243 |</a> **/
|
|
<a name="line244">244 |</a>
|
|
<a name="line245">245 |</a> static ErrTransTab TransTab[] = {
|
|
<a name="line246">246 |</a> { NO_ERR, WGHT_NONE, NULL },
|
|
<a name="line247">247 |</a> { NO_ERR_DEBUG, WGHT_DEBUG, "$*" },
|
|
<a name="line248">248 |</a> { NO_ERR_START, WGHT_DEBUG, "Starting $*" },
|
|
<a name="line249">249 |</a> { NO_ERR_END, WGHT_DEBUG, "Exit $*" },
|
|
<a name="line250">250 |</a> { NO_ERR_VERBOSE, WGHT_VERBOSE, NULL },
|
|
<a name="line251">251 |</a> { ERR_PARAM, WGHT_ERROR, "Paramter error concerning '$1'" },
|
|
<a name="line252">252 |</a> { ERR_USAGE, WGHT_ERROR, "Usage is '$*'" },
|
|
<a name="line253">253 |</a> { ERR_ARGSTOLONG, WGHT_ERROR, "'$1': Arguments to long. Max. is '$2'" },
|
|
<a name="line254">254 |</a> { ERR_OPT_AMBIG, WGHT_ERROR, "Option '$1' is ambiguous" },
|
|
<a name="line255">255 |</a> { ERR_OPT_NOARG, WGHT_ERROR, "Option '$1' allows no argument" },
|
|
<a name="line256">256 |</a> { ERR_OPT_REQARG, WGHT_ERROR, "Option '$1' requires an argument" },
|
|
<a name="line257">257 |</a> { ERR_OPT_UNKNOWN, WGHT_ERROR, "Unrecognized option '$1'" },
|
|
<a name="line258">258 |</a> { ERR_OPT_ILL, WGHT_ERROR, "Illegal option '$1'" },
|
|
<a name="line259">259 |</a> { ERR_OPT_INV, WGHT_ERROR, "Invalid option '$1'" },
|
|
<a name="line260">260 |</a> { ERR_USERLVL, WGHT_ERROR, "Undefined userlevel '$1'" },
|
|
<a name="line261">261 |</a> { ERR_GETOPT, WGHT_FATAL, "getopt() failed" },
|
|
<a name="line262">262 |</a> { ERR_OPEN, WGHT_ERROR, "Cannot open file '$1' for '$2'" },
|
|
<a name="line263">263 |</a> { ERR_POPEN, WGHT_ERROR, "Cannot open pipe '$1' for '$2'" },
|
|
<a name="line264">264 |</a> { ERR_OPENDIR, WGHT_ERROR, "Cannot open directory '$1' for reading" },
|
|
<a name="line265">265 |</a> { ERR_CLOSE, WGHT_WARN, "Cannot close file '$1'" },
|
|
<a name="line266">266 |</a> { ERR_PCLOSE, WGHT_WARN, "Cannot close pipe '$1'" },
|
|
<a name="line267">267 |</a> { ERR_CLOSEDIR, WGHT_WARN, "Cannot close directory '$1'" },
|
|
<a name="line268">268 |</a> { ERR_READ, WGHT_ERROR, "Error while reading file '$1'" },
|
|
<a name="line269">269 |</a> { ERR_READDIR, WGHT_ERROR, "Error while reading directory '$1'" },
|
|
<a name="line270">270 |</a> { ERR_WRITE, WGHT_ERROR, "Error while writing file '$1'" },
|
|
<a name="line271">271 |</a> { ERR_SEEK, WGHT_ERROR, "Seek error on file '$1'" },
|
|
<a name="line272">272 |</a> { ERR_FLUSH, WGHT_WARN, "Flush error on file '$1'" },
|
|
<a name="line273">273 |</a> { ERR_DUP, WGHT_WARN, "Cannot duplicate handle of file '$1'" },
|
|
<a name="line274">274 |</a> { ERR_DIRNAME, WGHT_ERROR, "Cannot build directory name" },
|
|
<a name="line275">275 |</a> { ERR_NAMETOLONG, WGHT_ERROR, "Requested directory name to long: "
|
|
<a name="line276">276 |</a> "dir='$1',file='$2'" },
|
|
<a name="line277">277 |</a> { ERR_DIRNOTFOUND, WGHT_ERROR, "Directory '$1' not found" },
|
|
<a name="line278">278 |</a> { ERR_FILEINDIR, WGHT_ERROR, "File '$1' not found in directory '$2'" },
|
|
<a name="line279">279 |</a> { ERR_NODIR, WGHT_ERROR, "'$1' is not a directory" },
|
|
<a name="line280">280 |</a> { ERR_UNLINK, WGHT_WARN, "Cannot unlink '$1'" },
|
|
<a name="line281">281 |</a> { ERR_RENAME, WGHT_PROB, "Cannot rename '$1' to '$2'" },
|
|
<a name="line282">282 |</a> { ERR_ALLOC, WGHT_FATAL, "Out of memory." },
|
|
<a name="line283">283 |</a> { ERR_SOURCE, WGHT_WARN, "Error sourcing file '$1'" },
|
|
<a name="line284">284 |</a> { ERR_UNAME, WGHT_FATAL, "'uname (2)' failed." },
|
|
<a name="line285">285 |</a> { ERR_GETHOSTNAME, WGHT_FATAL, "'gethostname (2)' failed." },
|
|
<a name="line286">286 |</a> { ERR_GETDOMAINNAME,WGHT_FATAL, "'getdomainname (2)' failed." },
|
|
<a name="line287">287 |</a> { ERR_STRING, WGHT_FATAL, "string error" },
|
|
<a name="line288">288 |</a> { ERR_DISPLAY, WGHT_ERROR, "Cannot open display" },
|
|
<a name="line289">289 |</a> { ERR_PARSE, WGHT_ERROR, "Parse error" },
|
|
<a name="line290">290 |</a> { ERR_EXEC, WGHT_ERROR, "Tcl command execution failed: $1" },
|
|
<a name="line291">291 |</a> { ERR_EXTRACT, WGHT_ERROR, "Cannot extract X11 resources" },
|
|
<a name="line292">292 |</a> { ERR_COMMAND, WGHT_ERROR, "'$1' is an unrecognized subcommand" },
|
|
<a name="line293">293 |</a> { ERR_LOCATE, WGHT_ERROR, "Unable to locate a modulefile for '$1'" },
|
|
<a name="line294">294 |</a> { ERR_MAGIC, WGHT_ERROR, "Magic cookie '#%Module' missing in '$1'" },
|
|
<a name="line295">295 |</a> { ERR_MODULE_PATH, WGHT_ERROR, "'MODULEPATH' not set" },
|
|
<a name="line296">296 |</a> { ERR_HOME, WGHT_ERROR, "'HOME' not set" },
|
|
<a name="line297">297 |</a> { ERR_SHELL, WGHT_ERROR, "Unknown shell type '$1'" },
|
|
<a name="line298">298 |</a> { ERR_DERELICT, WGHT_ERROR, "Unknown shell derelict '$1'" },
|
|
<a name="line299">299 |</a> { ERR_CONFLICT, WGHT_ERROR, "Module '$1' conflicts with the currently "
|
|
<a name="line300">300 |</a> "loaded module(s) '$2*'" },
|
|
<a name="line301">301 |</a> { ERR_PREREQ, WGHT_ERROR, "Module '$1' depends on one of the "
|
|
<a name="line302">302 |</a> "module(s) '$2*'" },
|
|
<a name="line303">303 |</a> { ERR_NOTLOADED, WGHT_ERROR, "Module '$1' is currently not loaded" },
|
|
<a name="line304">304 |</a> { ERR_DUP_SYMVERS, WGHT_PROB, "Duplicate version symbol '$1' found" },
|
|
<a name="line305">305 |</a> { ERR_SYMLOOP, WGHT_ERROR, "Version symbol '$1' loops" },
|
|
<a name="line306">306 |</a> { ERR_BADMODNAM, WGHT_PROB, "Invalid modulename '$1' found" },
|
|
<a name="line307">307 |</a> { ERR_DUP_ALIAS, WGHT_WARN, "Duplicate alias '$1' found" },
|
|
<a name="line308">308 |</a> { ERR_CACHE_INVAL, WGHT_ERROR, "Invalid cache version '$1' found" },
|
|
<a name="line309">309 |</a> { ERR_CACHE_LOAD, WGHT_WARN, "Couldn't load the cache properly" },
|
|
<a name="line310">310 |</a> { ERR_BEGINENV, WGHT_WARN, "Invalid update subcommand - "
|
|
<a name="line311">311 |</a> #ifdef BEGINENV
|
|
<a name="line312">312 |</a> # if BEGINENV == 99
|
|
<a name="line313">313 |</a> "No _MODULESBEGINENV_ file"
|
|
<a name="line314">314 |</a> # else
|
|
<a name="line315">315 |</a> "No .modulesbeginenv file"
|
|
<a name="line316">316 |</a> # endif
|
|
<a name="line317">317 |</a> #else
|
|
<a name="line318">318 |</a> ".modulesbeginenv not supported"
|
|
<a name="line319">319 |</a> #endif
|
|
<a name="line320">320 |</a> },
|
|
<a name="line321">321 |</a> { ERR_BEGINENVX, WGHT_WARN,
|
|
<a name="line322">322 |</a> "Invalid update subcommand - No MODULESBEGINENV - hence not supported"},
|
|
<a name="line323">323 |</a> { ERR_INIT_TCL, WGHT_ERROR, "Cannot initialize TCL" },
|
|
<a name="line324">324 |</a> { ERR_INIT_TCLX, WGHT_WARN, "Cannot initialize TCLX modules using "
|
|
<a name="line325">325 |</a> "extended commands might fail" },
|
|
<a name="line326">326 |</a> { ERR_INIT_ALPATH, WGHT_WARN, "Could not extend auto_path variable. "
|
|
<a name="line327">327 |</a> "Module using autoloadable functions might "
|
|
<a name="line328">328 |</a> "fail" },
|
|
<a name="line329">329 |</a> { ERR_INIT_STUP, WGHT_WARN, "Cannot find a 'module load' command in "
|
|
<a name="line330">330 |</a> "any of the '$1' startup files" },
|
|
<a name="line331">331 |</a> { ERR_SET_VAR, WGHT_WARN, "Cannot set TCL variable '$1'" },
|
|
<a name="line332">332 |</a> { ERR_INFO_DESCR, WGHT_ERROR, "Unrecognized module info descriptor '$1'" },
|
|
<a name="line333">333 |</a> { ERR_INVWGHT_WARN, WGHT_WARN, "Invalid error weight '$1' found" },
|
|
<a name="line334">334 |</a> { ERR_INVFAC_WARN, WGHT_WARN, "Invalid log facility '$1'" },
|
|
<a name="line335">335 |</a> { ERR_COLON, WGHT_WARN, "Spurious colon in pattern '$1'" },
|
|
<a name="line336">336 |</a> { ERR_INTERAL, WGHT_PANIC, "Internal error in the alias handler" },
|
|
<a name="line337">337 |</a> { ERR_INTERRL, WGHT_PANIC, "Internal error in the error logger" },
|
|
<a name="line338">338 |</a> { ERR_INVAL, WGHT_PANIC, "Invalid error type '$1' found" },
|
|
<a name="line339">339 |</a> { ERR_INVWGHT, WGHT_PANIC, "Invalid error weight '$1' found" },
|
|
<a name="line340">340 |</a> { ERR_INVFAC, WGHT_PANIC, "Invalid log facility '$1'" },
|
|
<a name="line341">341 |</a> { ERR_ENVVAR, WGHT_FATAL, "The environment variables LOADMODULES and _LMFILES_ have inconsistent lengths." }
|
|
<a name="line342">342 |</a> };
|
|
<a name="line343">343 |</a>
|
|
<a name="line344">344 |</a> /** ************************************************************************ **/
|
|
<a name="line345">345 |</a> /** PROTOTYPES **/
|
|
<a name="line346">346 |</a> /** ************************************************************************ **/
|
|
<a name="line347">347 |</a>
|
|
<a name="line348">348 |</a> static ErrTransTab *ErrorLookup( ErrType error_type );
|
|
<a name="line349">349 |</a>
|
|
<a name="line350">350 |</a> static ErrMeasr *MeasLookup( ErrWeights weigth );
|
|
<a name="line351">351 |</a>
|
|
<a name="line352">352 |</a> static int FlushError( ErrType Type,
|
|
<a name="line353">353 |</a> char *module,
|
|
<a name="line354">354 |</a> int lineno,
|
|
<a name="line355">355 |</a> ErrWeights Weight,
|
|
<a name="line356">356 |</a> char *WeightMsg,
|
|
<a name="line357">357 |</a> char *ErrMsgs,
|
|
<a name="line358">358 |</a> int argc,
|
|
<a name="line359">359 |</a> char **argv);
|
|
<a name="line360">360 |</a>
|
|
<a name="line361">361 |</a> static int PrintError( char *buffer,
|
|
<a name="line362">362 |</a> ErrType Type,
|
|
<a name="line363">363 |</a> char *module,
|
|
<a name="line364">364 |</a> int lineno,
|
|
<a name="line365">365 |</a> ErrWeights Weight,
|
|
<a name="line366">366 |</a> char *WeightMsg,
|
|
<a name="line367">367 |</a> char *ErrMsgs,
|
|
<a name="line368">368 |</a> int argc,
|
|
<a name="line369">369 |</a> char **argv);
|
|
<a name="line370">370 |</a>
|
|
<a name="line371">371 |</a> static char *ErrorString( char *ErrMsgs,
|
|
<a name="line372">372 |</a> int argc,
|
|
<a name="line373">373 |</a> char **argv);
|
|
<a name="line374">374 |</a>
|
|
<a name="line375">375 |</a> static void add_param( char **Control,
|
|
<a name="line376">376 |</a> char **Target,
|
|
<a name="line377">377 |</a> int *Length,
|
|
<a name="line378">378 |</a> int argc,
|
|
<a name="line379">379 |</a> char **argv);
|
|
<a name="line380">380 |</a>
|
|
<a name="line381">381 |</a> static int scan_facility( char *s,
|
|
<a name="line382">382 |</a> FacilityNames *table,
|
|
<a name="line383">383 |</a> int size);
|
|
<a name="line384">384 |</a>
|
|
<a name="line385">385 |</a> static char *GetFacility( ErrWeights Weight);
|
|
<a name="line386">386 |</a> static ErrFacilities *GetFacility_sub( ErrWeights Weight);
|
|
<a name="line387">387 |</a>
|
|
<a name="line388">388 |</a> static void Print_Tracing( char *buffer,
|
|
<a name="line389">389 |</a> int result,
|
|
<a name="line390">390 |</a> int argc,
|
|
<a name="line391">391 |</a> char **argv);
|
|
<a name="line392">392 |</a>
|
|
<a name="line393">393 |</a> /*++++
|
|
<a name="line394">394 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line395">395 |</a> ** **
|
|
<a name="line396">396 |</a> ** Function: Module_Tracing **
|
|
<a name="line397">397 |</a> ** Print_Tracing **
|
|
<a name="line398">398 |</a> ** Module_Verbosity **
|
|
<a name="line399">399 |</a> ** **
|
|
<a name="line400">400 |</a> ** Description: Display a tracing or verbose message **
|
|
<a name="line401">401 |</a> ** **
|
|
<a name="line402">402 |</a> ** First Edition: 1995/12/27 **
|
|
<a name="line403">403 |</a> ** **
|
|
<a name="line404">404 |</a> ** Parameters: int result Result code of th module command **
|
|
<a name="line405">405 |</a> ** int argc Number od arguments to the module **
|
|
<a name="line406">406 |</a> ** command **
|
|
<a name="line407">407 |</a> ** char **argv Argument array **
|
|
<a name="line408">408 |</a> ** char *buffer Print buffer **
|
|
<a name="line409">409 |</a> ** **
|
|
<a name="line410">410 |</a> ** Result: - **
|
|
<a name="line411">411 |</a> ** **
|
|
<a name="line412">412 |</a> ** Attached Globals: g_current_module The module which is handled **
|
|
<a name="line413">413 |</a> ** by the current command **
|
|
<a name="line414">414 |</a> ** **
|
|
<a name="line415">415 |</a> ** ************************************************************************ **
|
|
<a name="line416">416 |</a> ++++*/
|
|
<a name="line417">417 |</a>
|
|
<a name="line418">418 |</a> void Module_Tracing( int result,
|
|
<a name="line419">419 |</a> int argc,
|
|
<a name="line420">420 |</a> char **argv)
|
|
<a name="line421">421 |</a> {
|
|
<a name="line422">422 |</a> if( !FlushError( NO_ERR, (char *) NULL, result, WGHT_TRACE, (char *) NULL,
|
|
<a name="line423">423 |</a> (char *) NULL, argc, argv)) {
|
|
<a name="line424">424 |</a> ErrorLogger( ERR_INTERRL, LOC, NULL);
|
|
<a name="line425">425 |</a> }
|
|
<a name="line426">426 |</a>
|
|
<a name="line427">427 |</a> } /** End of 'Module_Tracing' **/
|
|
<a name="line428">428 |</a>
|
|
<a name="line429">429 |</a> void Module_Verbosity( int argc,
|
|
<a name="line430">430 |</a> char **argv)
|
|
<a name="line431">431 |</a> {
|
|
<a name="line432">432 |</a> if( sw_verbose && argc && *argv)
|
|
<a name="line433">433 |</a> if( !FlushError( NO_ERR_VERBOSE, g_current_module,linenum,WGHT_VERBOSE,
|
|
<a name="line434">434 |</a> Measurements[ MEAS_VERB_NDX].message, *argv, argc, argv)) {
|
|
<a name="line435">435 |</a> ErrorLogger( ERR_INTERRL, LOC, NULL);
|
|
<a name="line436">436 |</a> }
|
|
<a name="line437">437 |</a>
|
|
<a name="line438">438 |</a> } /** End of 'Module_Verbosity' **/
|
|
<a name="line439">439 |</a>
|
|
<a name="line440">440 |</a> static void Print_Tracing( char *buffer,
|
|
<a name="line441">441 |</a> int result,
|
|
<a name="line442">442 |</a> int argc,
|
|
<a name="line443">443 |</a> char **argv)
|
|
<a name="line444">444 |</a> {
|
|
<a name="line445">445 |</a> char *s = buffer;
|
|
<a name="line446">446 |</a> struct passwd *pwent;
|
|
<a name="line447">447 |</a> struct group *grpent;
|
|
<a name="line448">448 |</a> uid_t uid;
|
|
<a name="line449">449 |</a> gid_t gid;
|
|
<a name="line450">450 |</a>
|
|
<a name="line451">451 |</a> /**
|
|
<a name="line452">452 |</a> ** Print the arguments
|
|
<a name="line453">453 |</a> **/
|
|
<a name="line454">454 |</a>
|
|
<a name="line455">455 |</a> while( argc--) {
|
|
<a name="line456">456 |</a> /* sprintf( s, "%s ", *argv++); */
|
|
<a name="line457">457 |</a> strcpy( s, *argv++);
|
|
<a name="line458">458 |</a> strcat( s, " ");
|
|
<a name="line459">459 |</a> s += strlen( s);
|
|
<a name="line460">460 |</a> }
|
|
<a name="line461">461 |</a>
|
|
<a name="line462">462 |</a> /**
|
|
<a name="line463">463 |</a> ** Add the real and effective user- and group-id
|
|
<a name="line464">464 |</a> **/
|
|
<a name="line465">465 |</a>
|
|
<a name="line466">466 |</a> pwent = getpwuid( uid = getuid());
|
|
<a name="line467">467 |</a> sprintf( s, " [%s(%d)", (pwent ? pwent->pw_name : _unknown), uid);
|
|
<a name="line468">468 |</a> s += strlen( s);
|
|
<a name="line469">469 |</a> grpent = getgrgid( gid = getgid());
|
|
<a name="line470">470 |</a> sprintf( s, ".%s(%d)]", (grpent ? grpent->gr_name : _unknown), gid);
|
|
<a name="line471">471 |</a> s += strlen( s);
|
|
<a name="line472">472 |</a>
|
|
<a name="line473">473 |</a> pwent = getpwuid( uid = geteuid());
|
|
<a name="line474">474 |</a> sprintf( s, " [%s(%d)", (pwent ? pwent->pw_name : _unknown), uid);
|
|
<a name="line475">475 |</a> s += strlen( s);
|
|
<a name="line476">476 |</a> grpent = getgrgid( gid = getegid());
|
|
<a name="line477">477 |</a> sprintf( s, ".%s(%d)] = ", (grpent ? grpent->gr_name : _unknown), gid);
|
|
<a name="line478">478 |</a> s += strlen( s);
|
|
<a name="line479">479 |</a>
|
|
<a name="line480">480 |</a> /**
|
|
<a name="line481">481 |</a> ** Add the commands result
|
|
<a name="line482">482 |</a> **/
|
|
<a name="line483">483 |</a>
|
|
<a name="line484">484 |</a> switch( result) {
|
|
<a name="line485">485 |</a> case TCL_OK:
|
|
<a name="line486">486 |</a> strcpy( s, "TCL_OK");
|
|
<a name="line487">487 |</a> break;
|
|
<a name="line488">488 |</a> case TCL_ERROR:
|
|
<a name="line489">489 |</a> strcpy( s, "TCL_ERROR");
|
|
<a name="line490">490 |</a> break;
|
|
<a name="line491">491 |</a> case TCL_RETURN:
|
|
<a name="line492">492 |</a> strcpy( s, "TCL_RETURN");
|
|
<a name="line493">493 |</a> break;
|
|
<a name="line494">494 |</a> case TCL_BREAK:
|
|
<a name="line495">495 |</a> strcpy( s, "TCL_BREAK");
|
|
<a name="line496">496 |</a> break;
|
|
<a name="line497">497 |</a> case TCL_CONTINUE:
|
|
<a name="line498">498 |</a> strcpy( s, "TCL_CONTINUE");
|
|
<a name="line499">499 |</a> break;
|
|
<a name="line500">500 |</a> default:
|
|
<a name="line501">501 |</a> strcpy( s, "UNKNOWN");
|
|
<a name="line502">502 |</a> break;
|
|
<a name="line503">503 |</a> }
|
|
<a name="line504">504 |</a>
|
|
<a name="line505">505 |</a> s += strlen( s);
|
|
<a name="line506">506 |</a> sprintf( s, "(%d)", result);
|
|
<a name="line507">507 |</a>
|
|
<a name="line508">508 |</a> } /** End of 'Module_Tracing' **/
|
|
<a name="line509">509 |</a>
|
|
<a name="line510">510 |</a> /*++++
|
|
<a name="line511">511 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line512">512 |</a> ** **
|
|
<a name="line513">513 |</a> ** Function: Enable_Error, Disable_Error, Restore_Error **
|
|
<a name="line514">514 |</a> ** **
|
|
<a name="line515">515 |</a> ** Description: Enables, disables, or restores error logging **
|
|
<a name="line516">516 |</a> ** Sometimes an error isn't really an error **
|
|
<a name="line517">517 |</a> ** **
|
|
<a name="line518">518 |</a> ** First Edition: 1999/11/11 **
|
|
<a name="line519">519 |</a> ** **
|
|
<a name="line520">520 |</a> ** Parameters: none **
|
|
<a name="line521">521 |</a> ** **
|
|
<a name="line522">522 |</a> ** Result: none **
|
|
<a name="line523">523 |</a> ** **
|
|
<a name="line524">524 |</a> ** ************************************************************************ **
|
|
<a name="line525">525 |</a> ++++*/
|
|
<a name="line526">526 |</a>
|
|
<a name="line527">527 |</a> static void save_error_state(int reset) {
|
|
<a name="line528">528 |</a> static int in_effect = 0;
|
|
<a name="line529">529 |</a> static int saved_state = 0;
|
|
<a name="line530">530 |</a>
|
|
<a name="line531">531 |</a> if (reset && in_effect ) {
|
|
<a name="line532">532 |</a> quiet_on_error = saved_state;
|
|
<a name="line533">533 |</a> in_effect = 0;
|
|
<a name="line534">534 |</a> } else if (!reset && !in_effect ) {
|
|
<a name="line535">535 |</a> saved_state = quiet_on_error;
|
|
<a name="line536">536 |</a> in_effect = 1;
|
|
<a name="line537">537 |</a> }
|
|
<a name="line538">538 |</a> }
|
|
<a name="line539">539 |</a>
|
|
<a name="line540">540 |</a>
|
|
<a name="line541">541 |</a> void Enable_Error(void) {
|
|
<a name="line542">542 |</a> save_error_state(0);
|
|
<a name="line543">543 |</a> quiet_on_error = 0;
|
|
<a name="line544">544 |</a> }
|
|
<a name="line545">545 |</a>
|
|
<a name="line546">546 |</a> void Disable_Error(void) {
|
|
<a name="line547">547 |</a> save_error_state(0);
|
|
<a name="line548">548 |</a> quiet_on_error = 1;
|
|
<a name="line549">549 |</a> }
|
|
<a name="line550">550 |</a>
|
|
<a name="line551">551 |</a> void Restore_Error(void) {
|
|
<a name="line552">552 |</a> quiet_on_error = 0; /* the default is to output errors */
|
|
<a name="line553">553 |</a> save_error_state(1);
|
|
<a name="line554">554 |</a> }
|
|
<a name="line555">555 |</a>
|
|
<a name="line556">556 |</a> /*++++
|
|
<a name="line557">557 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line558">558 |</a> ** **
|
|
<a name="line559">559 |</a> ** Function: Module_Error **
|
|
<a name="line560">560 |</a> ** **
|
|
<a name="line561">561 |</a> ** Description: Error handling for the modules package **
|
|
<a name="line562">562 |</a> ** **
|
|
<a name="line563">563 |</a> ** First Edition: 1995/08/06 **
|
|
<a name="line564">564 |</a> ** **
|
|
<a name="line565">565 |</a> ** Parameters: ErrType error_type Type of the error **
|
|
<a name="line566">566 |</a> ** char *module Affected module **
|
|
<a name="line567">567 |</a> ** int lineo Line number **
|
|
<a name="line568">568 |</a> ** ... Argument list **
|
|
<a name="line569">569 |</a> ** **
|
|
<a name="line570">570 |</a> ** Result: ErrCode OK No error **
|
|
<a name="line571">571 |</a> ** PROBLEM Problem. Program may **
|
|
<a name="line572">572 |</a> ** continue running **
|
|
<a name="line573">573 |</a> ** ERROR Caller should try to **
|
|
<a name="line574">574 |</a> ** exit gracefully **
|
|
<a name="line575">575 |</a> ** **
|
|
<a name="line576">576 |</a> ** Attached Globals: **
|
|
<a name="line577">577 |</a> ** **
|
|
<a name="line578">578 |</a> ** ************************************************************************ **
|
|
<a name="line579">579 |</a> ++++*/
|
|
<a name="line580">580 |</a>
|
|
<a name="line581">581 |</a> int Module_Error( ErrType error_type,
|
|
<a name="line582">582 |</a> char *module,
|
|
<a name="line583">583 |</a> int lineno,
|
|
<a name="line584">584 |</a> ... )
|
|
<a name="line585">585 |</a> {
|
|
<a name="line586">586 |</a> int listsize = ARGLIST_SIZE, /** Initial size of the argu-**/
|
|
<a name="line587">587 |</a> /** ment list **/
|
|
<a name="line588">588 |</a> argc = 0; /** Actual number of args **/
|
|
<a name="line589">589 |</a> char **argv, /** Argument array **/
|
|
<a name="line590">590 |</a> *arg; /** A single argument **/
|
|
<a name="line591">591 |</a> va_list parptr; /** Varargs scan pointer **/
|
|
<a name="line592">592 |</a> ErrTransTab *TransPtr; /** Error transtab entry **/
|
|
<a name="line593">593 |</a> ErrMeasr *MeasPtr; /** Measurement pointer **/
|
|
<a name="line594">594 |</a> ErrCode ret_code;
|
|
<a name="line595">595 |</a> int NoArgs = (error_type == ERR_ALLOC);
|
|
<a name="line596">596 |</a>
|
|
<a name="line597">597 |</a> if( quiet_on_error ) return OK; /* do nothing - just OK */
|
|
<a name="line598">598 |</a>
|
|
<a name="line599">599 |</a> /**
|
|
<a name="line600">600 |</a> ** Argument check
|
|
<a name="line601">601 |</a> **/
|
|
<a name="line602">602 |</a> if( NO_ERR_VERBOSE == error_type && !sw_verbose)
|
|
<a name="line603">603 |</a> return( OK);
|
|
<a name="line604">604 |</a>
|
|
<a name="line605">605 |</a> if( !module)
|
|
<a name="line606">606 |</a> module = unknown;
|
|
<a name="line607">607 |</a>
|
|
<a name="line608">608 |</a> /**
|
|
<a name="line609">609 |</a> ** Build the argument array at first
|
|
<a name="line610">610 |</a> **/
|
|
<a name="line611">611 |</a>
|
|
<a name="line612">612 |</a> if( NULL == (argv = (char **) malloc( listsize * sizeof( char *)))) {
|
|
<a name="line613">613 |</a> module = module_name;
|
|
<a name="line614">614 |</a> error_type = ERR_ALLOC;
|
|
<a name="line615">615 |</a> NoArgs = 1;
|
|
<a name="line616">616 |</a> }
|
|
<a name="line617">617 |</a>
|
|
<a name="line618">618 |</a> va_start( parptr, lineno);
|
|
<a name="line619">619 |</a> while( !NoArgs && (NULL != (arg = va_arg( parptr, char *)))) {
|
|
<a name="line620">620 |</a>
|
|
<a name="line621">621 |</a> /**
|
|
<a name="line622">622 |</a> ** Conditionally realloc
|
|
<a name="line623">623 |</a> **/
|
|
<a name="line624">624 |</a> while( argc >= listsize) {
|
|
<a name="line625">625 |</a> listsize += ARGLIST_SIZE;
|
|
<a name="line626">626 |</a> if( NULL == (argv = (char **) realloc( argv,
|
|
<a name="line627">627 |</a> listsize * sizeof(char *)))) {
|
|
<a name="line628">628 |</a> module = module_name;
|
|
<a name="line629">629 |</a> error_type = ERR_ALLOC;
|
|
<a name="line630">630 |</a> NoArgs = 1;
|
|
<a name="line631">631 |</a> break;
|
|
<a name="line632">632 |</a> }
|
|
<a name="line633">633 |</a> }
|
|
<a name="line634">634 |</a>
|
|
<a name="line635">635 |</a> argv[ argc++] = arg;
|
|
<a name="line636">636 |</a>
|
|
<a name="line637">637 |</a> } /** while **/
|
|
<a name="line638">638 |</a>
|
|
<a name="line639">639 |</a> if( NO_ERR_VERBOSE == error_type && !argc)
|
|
<a name="line640">640 |</a> return( OK);
|
|
<a name="line641">641 |</a>
|
|
<a name="line642">642 |</a> /**
|
|
<a name="line643">643 |</a> ** Locate the error translation table entry according to the
|
|
<a name="line644">644 |</a> ** passed error type
|
|
<a name="line645">645 |</a> **/
|
|
<a name="line646">646 |</a> if( NULL == (TransPtr = ErrorLookup( error_type))) {
|
|
<a name="line647">647 |</a> if( argv)
|
|
<a name="line648">648 |</a> null_free((void *) &argv);
|
|
<a name="line649">649 |</a> return( ErrorLogger( ERR_INVAL, LOC, (sprintf( buffer, "%d",
|
|
<a name="line650">650 |</a> error_type), buffer), NULL));
|
|
<a name="line651">651 |</a> }
|
|
<a name="line652">652 |</a>
|
|
<a name="line653">653 |</a> /**
|
|
<a name="line654">654 |</a> ** Now locate the assigned error weight ...
|
|
<a name="line655">655 |</a> **/
|
|
<a name="line656">656 |</a>
|
|
<a name="line657">657 |</a> if( NULL == (MeasPtr = MeasLookup( TransPtr->error_weight))) {
|
|
<a name="line658">658 |</a> if( argv)
|
|
<a name="line659">659 |</a> null_free((void *) &argv);
|
|
<a name="line660">660 |</a> argc = 0;
|
|
<a name="line661">661 |</a> return( ErrorLogger( ERR_INVWGHT, LOC, (sprintf( buffer, "%d",
|
|
<a name="line662">662 |</a> TransPtr->error_weight), buffer), NULL));
|
|
<a name="line663">663 |</a> }
|
|
<a name="line664">664 |</a>
|
|
<a name="line665">665 |</a> /**
|
|
<a name="line666">666 |</a> ** Use the return code as defined for the current user level
|
|
<a name="line667">667 |</a> **/
|
|
<a name="line668">668 |</a> switch( sw_userlvl) {
|
|
<a name="line669">669 |</a> case UL_NOVICE:
|
|
<a name="line670">670 |</a> ret_code = MeasPtr->ret_nov;
|
|
<a name="line671">671 |</a> break;
|
|
<a name="line672">672 |</a> case UL_ADVANCED:
|
|
<a name="line673">673 |</a> ret_code = MeasPtr->ret_adv;
|
|
<a name="line674">674 |</a> break;
|
|
<a name="line675">675 |</a> case UL_EXPERT:
|
|
<a name="line676">676 |</a> ret_code = MeasPtr->ret_exp;
|
|
<a name="line677">677 |</a> break;
|
|
<a name="line678">678 |</a> }
|
|
<a name="line679">679 |</a>
|
|
<a name="line680">680 |</a> /**
|
|
<a name="line681">681 |</a> ** Print the error message
|
|
<a name="line682">682 |</a> **/
|
|
<a name="line683">683 |</a> if( TransPtr->error_weight <= WGHT_TRACE || ret_code != OK)
|
|
<a name="line684">684 |</a> if( !FlushError( error_type, module, lineno, TransPtr->error_weight,
|
|
<a name="line685">685 |</a> MeasPtr->message, TransPtr->messages, argc, argv)) {
|
|
<a name="line686">686 |</a> if( argv)
|
|
<a name="line687">687 |</a> null_free((void *) &argv);
|
|
<a name="line688">688 |</a> argc = 0;
|
|
<a name="line689">689 |</a> return( ErrorLogger( ERR_INTERRL, LOC, NULL));
|
|
<a name="line690">690 |</a> }
|
|
<a name="line691">691 |</a>
|
|
<a name="line692">692 |</a> /**
|
|
<a name="line693">693 |</a> ** Return to the caller ... conditionally ...
|
|
<a name="line694">694 |</a> **/
|
|
<a name="line695">695 |</a> if( WARN == ret_code)
|
|
<a name="line696">696 |</a> ret_code = OK;
|
|
<a name="line697">697 |</a>
|
|
<a name="line698">698 |</a> if( argv)
|
|
<a name="line699">699 |</a> null_free((void *) &argv);
|
|
<a name="line700">700 |</a> argc = 0;
|
|
<a name="line701">701 |</a>
|
|
<a name="line702">702 |</a> if( ret_code > ERROR)
|
|
<a name="line703">703 |</a> exit( ret_code);
|
|
<a name="line704">704 |</a>
|
|
<a name="line705">705 |</a> return( ret_code);
|
|
<a name="line706">706 |</a> } /** End of 'Module_Error' **/
|
|
<a name="line707">707 |</a>
|
|
<a name="line708">708 |</a> /*++++
|
|
<a name="line709">709 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line710">710 |</a> ** **
|
|
<a name="line711">711 |</a> ** Function: ErrorLookup **
|
|
<a name="line712">712 |</a> ** **
|
|
<a name="line713">713 |</a> ** Description: Look up the passed error type in the translation tab.**
|
|
<a name="line714">714 |</a> ** **
|
|
<a name="line715">715 |</a> ** First Edition: 1995/08/06 **
|
|
<a name="line716">716 |</a> ** **
|
|
<a name="line717">717 |</a> ** Parameters: ErrType error_type Type of the error **
|
|
<a name="line718">718 |</a> ** **
|
|
<a name="line719">719 |</a> ** Result: ErrTransTab* NULL Not found **
|
|
<a name="line720">720 |</a> ** else Pointer to the acc. entry **
|
|
<a name="line721">721 |</a> ** **
|
|
<a name="line722">722 |</a> ** Attached Globals: **
|
|
<a name="line723">723 |</a> ** **
|
|
<a name="line724">724 |</a> ** ************************************************************************ **
|
|
<a name="line725">725 |</a> ++++*/
|
|
<a name="line726">726 |</a>
|
|
<a name="line727">727 |</a> static ErrTransTab *ErrorLookup( ErrType error_type )
|
|
<a name="line728">728 |</a> {
|
|
<a name="line729">729 |</a> ErrTransTab *low, *mid, *high, *save; /** Search pointers **/
|
|
<a name="line730">730 |</a>
|
|
<a name="line731">731 |</a> /**
|
|
<a name="line732">732 |</a> ** Init serach pointers
|
|
<a name="line733">733 |</a> **/
|
|
<a name="line734">734 |</a>
|
|
<a name="line735">735 |</a> low = TransTab;
|
|
<a name="line736">736 |</a> high = TransTab + (sizeof( TransTab) / sizeof( TransTab[0]) -1);
|
|
<a name="line737">737 |</a> mid = (ErrTransTab *) NULL;
|
|
<a name="line738">738 |</a>
|
|
<a name="line739">739 |</a> /**
|
|
<a name="line740">740 |</a> ** Search loop
|
|
<a name="line741">741 |</a> **/
|
|
<a name="line742">742 |</a>
|
|
<a name="line743">743 |</a> while( low < high) {
|
|
<a name="line744">744 |</a>
|
|
<a name="line745">745 |</a> save = mid;
|
|
<a name="line746">746 |</a> mid = low + ((high - low) / 2);
|
|
<a name="line747">747 |</a> if( save == mid)
|
|
<a name="line748">748 |</a> low = mid = high; /** Just for safety ... **/
|
|
<a name="line749">749 |</a>
|
|
<a name="line750">750 |</a> if( mid->error_type < error_type ) {
|
|
<a name="line751">751 |</a> low = mid;
|
|
<a name="line752">752 |</a> } else if( mid->error_type > error_type ) {
|
|
<a name="line753">753 |</a> high = mid;
|
|
<a name="line754">754 |</a> } else
|
|
<a name="line755">755 |</a> return( mid); /** Yep! Got it! **/
|
|
<a name="line756">756 |</a>
|
|
<a name="line757">757 |</a> } /** while **/
|
|
<a name="line758">758 |</a>
|
|
<a name="line759">759 |</a> /**
|
|
<a name="line760">760 |</a> ** Maybe the loop has been finished before the comparison took place
|
|
<a name="line761">761 |</a> ** (low == high) and hit!
|
|
<a name="line762">762 |</a> **/
|
|
<a name="line763">763 |</a>
|
|
<a name="line764">764 |</a> if( mid->error_type == error_type )
|
|
<a name="line765">765 |</a> return( mid); /** Yep! Got it! **/
|
|
<a name="line766">766 |</a>
|
|
<a name="line767">767 |</a> /**
|
|
<a name="line768">768 |</a> ** If this point is reached, nothing has been found ...
|
|
<a name="line769">769 |</a> **/
|
|
<a name="line770">770 |</a>
|
|
<a name="line771">771 |</a> return( NULL);
|
|
<a name="line772">772 |</a>
|
|
<a name="line773">773 |</a> } /** End of 'ErrorLookup' **/
|
|
<a name="line774">774 |</a>
|
|
<a name="line775">775 |</a> /*++++
|
|
<a name="line776">776 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line777">777 |</a> ** **
|
|
<a name="line778">778 |</a> ** Function: MeasLookup **
|
|
<a name="line779">779 |</a> ** **
|
|
<a name="line780">780 |</a> ** Description: Look up the passed error weight in the measurement **
|
|
<a name="line781">781 |</a> ** table **
|
|
<a name="line782">782 |</a> ** **
|
|
<a name="line783">783 |</a> ** First Edition: 1995/08/06 **
|
|
<a name="line784">784 |</a> ** **
|
|
<a name="line785">785 |</a> ** Parameters: ErrWeights weigth Weight of the error **
|
|
<a name="line786">786 |</a> ** **
|
|
<a name="line787">787 |</a> ** Result: ErrMeasr* NULL Not found **
|
|
<a name="line788">788 |</a> ** else Pointer to the acc. entry **
|
|
<a name="line789">789 |</a> ** **
|
|
<a name="line790">790 |</a> ** Attached Globals: **
|
|
<a name="line791">791 |</a> ** **
|
|
<a name="line792">792 |</a> ** ************************************************************************ **
|
|
<a name="line793">793 |</a> ++++*/
|
|
<a name="line794">794 |</a>
|
|
<a name="line795">795 |</a> static ErrMeasr *MeasLookup( ErrWeights weigth )
|
|
<a name="line796">796 |</a> {
|
|
<a name="line797">797 |</a> ErrMeasr *low, *mid, *high, *save; /** Search pointers **/
|
|
<a name="line798">798 |</a>
|
|
<a name="line799">799 |</a> /**
|
|
<a name="line800">800 |</a> ** Init serach pointers
|
|
<a name="line801">801 |</a> **/
|
|
<a name="line802">802 |</a>
|
|
<a name="line803">803 |</a> low = Measurements;
|
|
<a name="line804">804 |</a> high = Measurements + (sizeof( Measurements) / sizeof( Measurements[0]) -1);
|
|
<a name="line805">805 |</a> save = (ErrMeasr *) NULL;
|
|
<a name="line806">806 |</a> mid = (ErrMeasr *) NULL;
|
|
<a name="line807">807 |</a>
|
|
<a name="line808">808 |</a> /**
|
|
<a name="line809">809 |</a> ** Search loop
|
|
<a name="line810">810 |</a> **/
|
|
<a name="line811">811 |</a>
|
|
<a name="line812">812 |</a> while( low < high) {
|
|
<a name="line813">813 |</a>
|
|
<a name="line814">814 |</a> save = mid;
|
|
<a name="line815">815 |</a> mid = low + ((high - low) / 2);
|
|
<a name="line816">816 |</a> if( save == mid)
|
|
<a name="line817">817 |</a> low = mid = high; /** Just to be sure ... **/
|
|
<a name="line818">818 |</a>
|
|
<a name="line819">819 |</a> if( mid->error_weight < weigth ) {
|
|
<a name="line820">820 |</a> low = mid;
|
|
<a name="line821">821 |</a> } else if( mid->error_weight > weigth ) {
|
|
<a name="line822">822 |</a> high = mid;
|
|
<a name="line823">823 |</a> } else
|
|
<a name="line824">824 |</a> return( mid); /** Yep! Got it! **/
|
|
<a name="line825">825 |</a>
|
|
<a name="line826">826 |</a> } /** while **/
|
|
<a name="line827">827 |</a>
|
|
<a name="line828">828 |</a> /**
|
|
<a name="line829">829 |</a> ** Maybe the loop has been finished before the comparison took place
|
|
<a name="line830">830 |</a> ** (low == high) and hit!
|
|
<a name="line831">831 |</a> **/
|
|
<a name="line832">832 |</a>
|
|
<a name="line833">833 |</a> if( mid->error_weight == weigth )
|
|
<a name="line834">834 |</a> return( mid); /** Yep! Got it! **/
|
|
<a name="line835">835 |</a>
|
|
<a name="line836">836 |</a> /**
|
|
<a name="line837">837 |</a> ** If this point is reached, nothing has been found ...
|
|
<a name="line838">838 |</a> **/
|
|
<a name="line839">839 |</a>
|
|
<a name="line840">840 |</a> return( NULL);
|
|
<a name="line841">841 |</a>
|
|
<a name="line842">842 |</a> } /** End of 'MeasLookup' **/
|
|
<a name="line843">843 |</a>
|
|
<a name="line844">844 |</a> /*++++
|
|
<a name="line845">845 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line846">846 |</a> ** **
|
|
<a name="line847">847 |</a> ** Function: FlushError **
|
|
<a name="line848">848 |</a> ** **
|
|
<a name="line849">849 |</a> ** Description: Print the error message. Decide which facility to **
|
|
<a name="line850">850 |</a> ** use and schedule the according logger routine **
|
|
<a name="line851">851 |</a> ** **
|
|
<a name="line852">852 |</a> ** First Edition: 1995/12/21 **
|
|
<a name="line853">853 |</a> ** **
|
|
<a name="line854">854 |</a> ** Parameters: ErrType Type Error type as passed **
|
|
<a name="line855">855 |</a> ** char *module Module name **
|
|
<a name="line856">856 |</a> ** int lineno Line number **
|
|
<a name="line857">857 |</a> ** ErrWeights Weight Error Weight **
|
|
<a name="line858">858 |</a> ** char *WeightMsg Printable Weight **
|
|
<a name="line859">859 |</a> ** char *ErrMsgs Error message **
|
|
<a name="line860">860 |</a> ** int argc Number of arguments **
|
|
<a name="line861">861 |</a> ** char **argv Argument array **
|
|
<a name="line862">862 |</a> ** **
|
|
<a name="line863">863 |</a> ** Result: int 1 Everything OK **
|
|
<a name="line864">864 |</a> ** 0 Error occured while printing **
|
|
<a name="line865">865 |</a> ** **
|
|
<a name="line866">866 |</a> ** ************************************************************************ **
|
|
<a name="line867">867 |</a> ++++*/
|
|
<a name="line868">868 |</a>
|
|
<a name="line869">869 |</a> static int FlushError( ErrType Type,
|
|
<a name="line870">870 |</a> char *module,
|
|
<a name="line871">871 |</a> int lineno,
|
|
<a name="line872">872 |</a> ErrWeights Weight,
|
|
<a name="line873">873 |</a> char *WeightMsg,
|
|
<a name="line874">874 |</a> char *ErrMsgs,
|
|
<a name="line875">875 |</a> int argc,
|
|
<a name="line876">876 |</a> char **argv)
|
|
<a name="line877">877 |</a> {
|
|
<a name="line878">878 |</a> char *facilities, *buffer;
|
|
<a name="line879">879 |</a> char *fac;
|
|
<a name="line880">880 |</a> FILE *facfp;
|
|
<a name="line881">881 |</a> char *errmsg_buffer;
|
|
<a name="line882">882 |</a> int fac_alloc = 0;
|
|
<a name="line883">883 |</a>
|
|
<a name="line884">884 |</a> /**
|
|
<a name="line885">885 |</a> ** get the error facilities at first. If there isn't any, we may
|
|
<a name="line886">886 |</a> ** return on success immediatelly.
|
|
<a name="line887">887 |</a> **/
|
|
<a name="line888">888 |</a> if((char *) NULL == (facilities = GetFacility( Weight)))
|
|
<a name="line889">889 |</a> goto success0;
|
|
<a name="line890">890 |</a>
|
|
<a name="line891">891 |</a> /**
|
|
<a name="line892">892 |</a> ** PANIC and FATAL error messages ought to be on stderr at least!
|
|
<a name="line893">893 |</a> **/
|
|
<a name="line894">894 |</a> if( WGHT_FATAL == Weight || WGHT_PANIC == Weight)
|
|
<a name="line895">895 |</a> if( !strstr( facilities, _stderr)) {
|
|
<a name="line896">896 |</a>
|
|
<a name="line897">897 |</a> if((char *) NULL == (buffer = stringer(NULL,0,
|
|
<a name="line898">898 |</a> _stderr,":", facilities, NULL))) {
|
|
<a name="line899">899 |</a> ErrorLogger( ERR_STRING, LOC, NULL);
|
|
<a name="line900">900 |</a> goto unwind0;
|
|
<a name="line901">901 |</a> }
|
|
<a name="line902">902 |</a>
|
|
<a name="line903">903 |</a> facilities = buffer;
|
|
<a name="line904">904 |</a> fac_alloc = 1;
|
|
<a name="line905">905 |</a> }
|
|
<a name="line906">906 |</a>
|
|
<a name="line907">907 |</a> /**
|
|
<a name="line908">908 |</a> ** Print the error message into the buffer
|
|
<a name="line909">909 |</a> **/
|
|
<a name="line910">910 |</a> if((char *) NULL == (errmsg_buffer = stringer(NULL, ERR_BUFSIZE, NULL))) {
|
|
<a name="line911">911 |</a> ErrorLogger( ERR_ALLOC, LOC, NULL);
|
|
<a name="line912">912 |</a> goto unwind1;
|
|
<a name="line913">913 |</a> }
|
|
<a name="line914">914 |</a>
|
|
<a name="line915">915 |</a> /**
|
|
<a name="line916">916 |</a> ** In case of verbosity, the first argument is the ErrMsgs format string
|
|
<a name="line917">917 |</a> **/
|
|
<a name="line918">918 |</a> if( WGHT_VERBOSE == Weight) {
|
|
<a name="line919">919 |</a> ErrMsgs = *argv++;
|
|
<a name="line920">920 |</a> --argc;
|
|
<a name="line921">921 |</a> }
|
|
<a name="line922">922 |</a>
|
|
<a name="line923">923 |</a> if( WGHT_TRACE == Weight)
|
|
<a name="line924">924 |</a> Print_Tracing( errmsg_buffer, lineno, argc, argv);
|
|
<a name="line925">925 |</a> else if( !PrintError( errmsg_buffer, Type, module, lineno, Weight,
|
|
<a name="line926">926 |</a> WeightMsg, ErrMsgs, argc, argv))
|
|
<a name="line927">927 |</a> goto unwind2;
|
|
<a name="line928">928 |</a>
|
|
<a name="line929">929 |</a> /**
|
|
<a name="line930">930 |</a> ** Now tokenize the facilities string and schedule the error messge
|
|
<a name="line931">931 |</a> ** for every single facility
|
|
<a name="line932">932 |</a> **/
|
|
<a name="line933">933 |</a> for( fac = strtok( facilities, ":");
|
|
<a name="line934">934 |</a> fac;
|
|
<a name="line935">935 |</a> fac = strtok( (char *) NULL, ":") ) {
|
|
<a name="line936">936 |</a>
|
|
<a name="line937">937 |</a> /**
|
|
<a name="line938">938 |</a> ** Check for filenames. Two specials are defined: stderr and stdout
|
|
<a name="line939">939 |</a> ** Otherwise filenames are expected to begin on '.' or '/'.
|
|
<a name="line940">940 |</a> ** Everthing not recognized as a filename is assumed to be a
|
|
<a name="line941">941 |</a> ** syslog facility
|
|
<a name="line942">942 |</a> ** 'null' and 'none' are known as 'no logging'
|
|
<a name="line943">943 |</a> **/
|
|
<a name="line944">944 |</a> if( !strcmp( fac, _null) || !strcmp( fac, _none))
|
|
<a name="line945">945 |</a> continue;
|
|
<a name="line946">946 |</a>
|
|
<a name="line947">947 |</a> else if( !strcmp( fac, _stderr))
|
|
<a name="line948">948 |</a> fprintf( stderr, "%s", errmsg_buffer);
|
|
<a name="line949">949 |</a>
|
|
<a name="line950">950 |</a> else if( !strcmp( fac, _stdout))
|
|
<a name="line951">951 |</a> fprintf( stdout, "%s", errmsg_buffer);
|
|
<a name="line952">952 |</a>
|
|
<a name="line953">953 |</a> /**
|
|
<a name="line954">954 |</a> ** Syslog
|
|
<a name="line955">955 |</a> **/
|
|
<a name="line956">956 |</a> else if( '.' != *fac && '/' != *fac) {
|
|
<a name="line957">957 |</a> #if defined(HAVE_SYSLOG) && defined(WITH_LOGGING)
|
|
<a name="line958">958 |</a> int syslog_fac, syslog_lvl;
|
|
<a name="line959">959 |</a>
|
|
<a name="line960">960 |</a> if( CheckFacility( fac, &syslog_fac, &syslog_lvl)) {
|
|
<a name="line961">961 |</a> openlog( "modulecmd", LOG_PID, syslog_fac);
|
|
<a name="line962">962 |</a> setlogmask( LOG_UPTO( syslog_lvl));
|
|
<a name="line963">963 |</a> syslog( (syslog_fac | syslog_lvl), "%s", errmsg_buffer);
|
|
<a name="line964">964 |</a> closelog();
|
|
<a name="line965">965 |</a>
|
|
<a name="line966">966 |</a> /**
|
|
<a name="line967">967 |</a> ** Invalid facilities ... take care not to end up in
|
|
<a name="line968">968 |</a> ** infinite loops
|
|
<a name="line969">969 |</a> **/
|
|
<a name="line970">970 |</a> } else if( Type == ERR_INVFAC ||
|
|
<a name="line971">971 |</a> OK == ErrorLogger( ERR_INVFAC, LOC, fac, NULL))
|
|
<a name="line972">972 |</a> continue;
|
|
<a name="line973">973 |</a>
|
|
<a name="line974">974 |</a> #else
|
|
<a name="line975">975 |</a> # ifdef SYSLOG_DIR
|
|
<a name="line976">976 |</a> /* this is an intential memory leak */
|
|
<a name="line977">977 |</a> buffer = stringer(NULL,0, SYSLOG_DIR, "/", fac);
|
|
<a name="line978">978 |</a> fac = buffer;
|
|
<a name="line979">979 |</a> # endif
|
|
<a name="line980">980 |</a> #endif
|
|
<a name="line981">981 |</a> }
|
|
<a name="line982">982 |</a>
|
|
<a name="line983">983 |</a> /**
|
|
<a name="line984">984 |</a> ** Custom files ...
|
|
<a name="line985">985 |</a> ** This may result from the syslog part above
|
|
<a name="line986">986 |</a> **/
|
|
<a name="line987">987 |</a> if( '.' == *fac || '/' == *fac) {
|
|
<a name="line988">988 |</a> if((FILE *) NULL == (facfp = fopen( fac, "a"))) {
|
|
<a name="line989">989 |</a>
|
|
<a name="line990">990 |</a> if( WGHT_PANIC == Weight) /** Avoid endless loops! **/
|
|
<a name="line991">991 |</a> goto unwind2;
|
|
<a name="line992">992 |</a>
|
|
<a name="line993">993 |</a> /**
|
|
<a name="line994">994 |</a> ** Invalid facilities ... take care not to end up in
|
|
<a name="line995">995 |</a> ** infinite loops
|
|
<a name="line996">996 |</a> **/
|
|
<a name="line997">997 |</a> if( Type == ERR_INVFAC ||
|
|
<a name="line998">998 |</a> OK == ErrorLogger( ERR_INVFAC, LOC, fac, NULL))
|
|
<a name="line999">999 |</a> continue;
|
|
<a name="line1000">1000 |</a> else
|
|
<a name="line1001">1001 |</a> goto unwind2;
|
|
<a name="line1002">1002 |</a> }
|
|
<a name="line1003">1003 |</a>
|
|
<a name="line1004">1004 |</a> fprintf( facfp, "%s", errmsg_buffer);
|
|
<a name="line1005">1005 |</a>
|
|
<a name="line1006">1006 |</a> if( EOF == fclose( facfp))
|
|
<a name="line1007">1007 |</a> if( OK != ErrorLogger( ERR_CLOSE, LOC, fac, NULL))
|
|
<a name="line1008">1008 |</a> goto unwind2;
|
|
<a name="line1009">1009 |</a>
|
|
<a name="line1010">1010 |</a> }
|
|
<a name="line1011">1011 |</a> } /** for **/
|
|
<a name="line1012">1012 |</a>
|
|
<a name="line1013">1013 |</a> /**
|
|
<a name="line1014">1014 |</a> ** Return on success
|
|
<a name="line1015">1015 |</a> **/
|
|
<a name="line1016">1016 |</a> null_free((void *) &errmsg_buffer);
|
|
<a name="line1017">1017 |</a> if( fac_alloc)
|
|
<a name="line1018">1018 |</a> null_free((void *) &facilities);
|
|
<a name="line1019">1019 |</a> success0:
|
|
<a name="line1020">1020 |</a> return( 1); /** -------- EXIT (SUCCESS) -------> **/
|
|
<a name="line1021">1021 |</a>
|
|
<a name="line1022">1022 |</a> unwind2:
|
|
<a name="line1023">1023 |</a> null_free((void *) &errmsg_buffer);
|
|
<a name="line1024">1024 |</a> unwind1:
|
|
<a name="line1025">1025 |</a> if( fac_alloc)
|
|
<a name="line1026">1026 |</a> null_free((void *) &facilities);
|
|
<a name="line1027">1027 |</a> unwind0:
|
|
<a name="line1028">1028 |</a> return( 0); /** -------- EXIT (FAILURE) -------> **/
|
|
<a name="line1029">1029 |</a>
|
|
<a name="line1030">1030 |</a> } /** End of 'FlushError' **/
|
|
<a name="line1031">1031 |</a>
|
|
<a name="line1032">1032 |</a> /*++++
|
|
<a name="line1033">1033 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line1034">1034 |</a> ** **
|
|
<a name="line1035">1035 |</a> ** Function: GetFacility **
|
|
<a name="line1036">1036 |</a> ** **
|
|
<a name="line1037">1037 |</a> ** Description: Get the log facility according to the passed error **
|
|
<a name="line1038">1038 |</a> ** weight **
|
|
<a name="line1039">1039 |</a> ** **
|
|
<a name="line1040">1040 |</a> ** First Edition: 1995/12/21 **
|
|
<a name="line1041">1041 |</a> ** **
|
|
<a name="line1042">1042 |</a> ** Parameters: ErrWeights Weight Error Weight **
|
|
<a name="line1043">1043 |</a> ** **
|
|
<a name="line1044">1044 |</a> ** Result: char* NULL No facility found **
|
|
<a name="line1045">1045 |</a> ** Otherwise Pointer to the colon separa- **
|
|
<a name="line1046">1046 |</a> ** ted facility string **
|
|
<a name="line1047">1047 |</a> ** **
|
|
<a name="line1048">1048 |</a> ** ************************************************************************ **
|
|
<a name="line1049">1049 |</a> ++++*/
|
|
<a name="line1050">1050 |</a>
|
|
<a name="line1051">1051 |</a> static char *GetFacility( ErrWeights Weight)
|
|
<a name="line1052">1052 |</a> {
|
|
<a name="line1053">1053 |</a> ErrFacilities *facility;
|
|
<a name="line1054">1054 |</a>
|
|
<a name="line1055">1055 |</a> /**
|
|
<a name="line1056">1056 |</a> ** Get the facility table entry at first
|
|
<a name="line1057">1057 |</a> **/
|
|
<a name="line1058">1058 |</a> if( !(facility = GetFacility_sub( Weight)))
|
|
<a name="line1059">1059 |</a> return((char *) NULL);
|
|
<a name="line1060">1060 |</a>
|
|
<a name="line1061">1061 |</a> /**
|
|
<a name="line1062">1062 |</a> ** Now we've got two possibilities:
|
|
<a name="line1063">1063 |</a> ** First of all there may be a custom facilitiy defined
|
|
<a name="line1064">1064 |</a> ** Otherwise the default facility is to be returned now
|
|
<a name="line1065">1065 |</a> **/
|
|
<a name="line1066">1066 |</a> return( facility->facility ? facility->facility : facility->def_facility);
|
|
<a name="line1067">1067 |</a>
|
|
<a name="line1068">1068 |</a> } /** End of 'GetFacility' **/
|
|
<a name="line1069">1069 |</a>
|
|
<a name="line1070">1070 |</a> static ErrFacilities *GetFacility_sub( ErrWeights Weight)
|
|
<a name="line1071">1071 |</a> {
|
|
<a name="line1072">1072 |</a> ErrFacilities *low, *mid, *high, *save;
|
|
<a name="line1073">1073 |</a> char buffer[ 20];
|
|
<a name="line1074">1074 |</a>
|
|
<a name="line1075">1075 |</a> /**
|
|
<a name="line1076">1076 |</a> ** Binary search for the passed facility in the Facilities table.
|
|
<a name="line1077">1077 |</a> ** This requires the table to be sorted on ascending error weight
|
|
<a name="line1078">1078 |</a> **/
|
|
<a name="line1079">1079 |</a> low = Facilities;
|
|
<a name="line1080">1080 |</a> high = Facilities + (sizeof( Facilities) / sizeof( Facilities[0]));
|
|
<a name="line1081">1081 |</a> save = (ErrFacilities *) NULL;
|
|
<a name="line1082">1082 |</a> mid = (ErrFacilities *) NULL;
|
|
<a name="line1083">1083 |</a>
|
|
<a name="line1084">1084 |</a> while( low < high) {
|
|
<a name="line1085">1085 |</a> save = mid;
|
|
<a name="line1086">1086 |</a> mid = low + ((high - low) / 2);
|
|
<a name="line1087">1087 |</a> if( save == mid)
|
|
<a name="line1088">1088 |</a> low = mid = high; /** Just to be sure ... **/
|
|
<a name="line1089">1089 |</a>
|
|
<a name="line1090">1090 |</a> if( mid->Weight > Weight)
|
|
<a name="line1091">1091 |</a> high = mid;
|
|
<a name="line1092">1092 |</a> else if( mid->Weight < Weight)
|
|
<a name="line1093">1093 |</a> low = mid;
|
|
<a name="line1094">1094 |</a> else
|
|
<a name="line1095">1095 |</a> break; /** found! **/
|
|
<a name="line1096">1096 |</a> }
|
|
<a name="line1097">1097 |</a>
|
|
<a name="line1098">1098 |</a> /**
|
|
<a name="line1099">1099 |</a> ** We have to check, if we've found something or if there's an internal
|
|
<a name="line1100">1100 |</a> ** error (wrong weight)
|
|
<a name="line1101">1101 |</a> **/
|
|
<a name="line1102">1102 |</a> if( mid->Weight != Weight) {
|
|
<a name="line1103">1103 |</a> if( OK == ErrorLogger( ERR_INVWGHT, LOC, (sprintf( buffer, "%d",
|
|
<a name="line1104">1104 |</a> Weight), buffer), NULL))
|
|
<a name="line1105">1105 |</a> return( NULL);
|
|
<a name="line1106">1106 |</a> }
|
|
<a name="line1107">1107 |</a>
|
|
<a name="line1108">1108 |</a> return( mid);
|
|
<a name="line1109">1109 |</a>
|
|
<a name="line1110">1110 |</a> } /** End of 'GetFacility_sub' **/
|
|
<a name="line1111">1111 |</a>
|
|
<a name="line1112">1112 |</a> /*++++
|
|
<a name="line1113">1113 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line1114">1114 |</a> ** **
|
|
<a name="line1115">1115 |</a> ** Function: CheckFacility **
|
|
<a name="line1116">1116 |</a> ** **
|
|
<a name="line1117">1117 |</a> ** Description: Check the passwd string to be a valid combination **
|
|
<a name="line1118">1118 |</a> ** of <syslog_facility>.<syslog_level> **
|
|
<a name="line1119">1119 |</a> ** **
|
|
<a name="line1120">1120 |</a> ** First Edition: 1995/12/21 **
|
|
<a name="line1121">1121 |</a> ** **
|
|
<a name="line1122">1122 |</a> ** Parameters: char *string Input facility string **
|
|
<a name="line1123">1123 |</a> ** int *facility Buffer for the real facility **
|
|
<a name="line1124">1124 |</a> ** int *level Buffer for the real level **
|
|
<a name="line1125">1125 |</a> ** **
|
|
<a name="line1126">1126 |</a> ** Result: int 1 Success **
|
|
<a name="line1127">1127 |</a> ** 0 Failure. String not valid **
|
|
<a name="line1128">1128 |</a> ** **
|
|
<a name="line1129">1129 |</a> ** ************************************************************************ **
|
|
<a name="line1130">1130 |</a> ++++*/
|
|
<a name="line1131">1131 |</a>
|
|
<a name="line1132">1132 |</a> int CheckFacility( char *string, int *facility, int *level)
|
|
<a name="line1133">1133 |</a> {
|
|
<a name="line1134">1134 |</a> char *s, *buf;
|
|
<a name="line1135">1135 |</a> int x;
|
|
<a name="line1136">1136 |</a>
|
|
<a name="line1137">1137 |</a> /**
|
|
<a name="line1138">1138 |</a> ** We do not want to change the strings ... so allocate a buffer here
|
|
<a name="line1139">1139 |</a> **/
|
|
<a name="line1140">1140 |</a> if((char *) NULL == (buf = stringer(NULL,0, string,NULL)))
|
|
<a name="line1141">1141 |</a> if( OK == ErrorLogger( ERR_STRING, LOC, NULL))
|
|
<a name="line1142">1142 |</a> goto unwind0;
|
|
<a name="line1143">1143 |</a>
|
|
<a name="line1144">1144 |</a> /**
|
|
<a name="line1145">1145 |</a> ** We cannot use strtok here, because there's one initialized in an
|
|
<a name="line1146">1146 |</a> ** outter loop!
|
|
<a name="line1147">1147 |</a> **/
|
|
<a name="line1148">1148 |</a> for( s=buf; s && *s && *s != '.'; s++);
|
|
<a name="line1149">1149 |</a> if( !s || !*s)
|
|
<a name="line1150">1150 |</a> goto unwind1;
|
|
<a name="line1151">1151 |</a> *s = '\0';
|
|
<a name="line1152">1152 |</a>
|
|
<a name="line1153">1153 |</a> /**
|
|
<a name="line1154">1154 |</a> ** This should be the facility
|
|
<a name="line1155">1155 |</a> **/
|
|
<a name="line1156">1156 |</a> if( -1 == (x = scan_facility( buf, facility_names,
|
|
<a name="line1157">1157 |</a> (sizeof( facility_names) / sizeof( facility_names[0])) )))
|
|
<a name="line1158">1158 |</a> goto unwind1;
|
|
<a name="line1159">1159 |</a> *facility = x;
|
|
<a name="line1160">1160 |</a>
|
|
<a name="line1161">1161 |</a> /**
|
|
<a name="line1162">1162 |</a> ** This should be the level
|
|
<a name="line1163">1163 |</a> **/
|
|
<a name="line1164">1164 |</a> if( -1 == (x = scan_facility( ++s, level_names,
|
|
<a name="line1165">1165 |</a> (sizeof( level_names) / sizeof( level_names[0])) )))
|
|
<a name="line1166">1166 |</a> goto unwind1;
|
|
<a name="line1167">1167 |</a> *level = x;
|
|
<a name="line1168">1168 |</a>
|
|
<a name="line1169">1169 |</a> /**
|
|
<a name="line1170">1170 |</a> ** Success
|
|
<a name="line1171">1171 |</a> **/
|
|
<a name="line1172">1172 |</a> null_free((void *) &buf);
|
|
<a name="line1173">1173 |</a> return( 1); /** -------- EXIT (SUCCESS) -------> **/
|
|
<a name="line1174">1174 |</a>
|
|
<a name="line1175">1175 |</a> unwind1:
|
|
<a name="line1176">1176 |</a> null_free((void *) &buf);
|
|
<a name="line1177">1177 |</a> unwind0:
|
|
<a name="line1178">1178 |</a> return( 0); /** -------- EXIT (FAILURE) -------> **/
|
|
<a name="line1179">1179 |</a>
|
|
<a name="line1180">1180 |</a> } /** End of 'CheckFacility' **/
|
|
<a name="line1181">1181 |</a>
|
|
<a name="line1182">1182 |</a> /*++++
|
|
<a name="line1183">1183 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line1184">1184 |</a> ** **
|
|
<a name="line1185">1185 |</a> ** Function: scan_facility **
|
|
<a name="line1186">1186 |</a> ** **
|
|
<a name="line1187">1187 |</a> ** Description: Scan the passed facility names table for the given **
|
|
<a name="line1188">1188 |</a> ** string and pass back the assigned token **
|
|
<a name="line1189">1189 |</a> ** **
|
|
<a name="line1190">1190 |</a> ** First Edition: 1995/12/21 **
|
|
<a name="line1191">1191 |</a> ** **
|
|
<a name="line1192">1192 |</a> ** Parameters: char *s String to be checked **
|
|
<a name="line1193">1193 |</a> ** FacilityNames *table Table of valid names and **
|
|
<a name="line1194">1194 |</a> ** tokens **
|
|
<a name="line1195">1195 |</a> ** int size Size of the table **
|
|
<a name="line1196">1196 |</a> ** **
|
|
<a name="line1197">1197 |</a> ** Result: int -1 name not found in the table **
|
|
<a name="line1198">1198 |</a> ** Otherwise Assigned token **
|
|
<a name="line1199">1199 |</a> ** **
|
|
<a name="line1200">1200 |</a> ** ************************************************************************ **
|
|
<a name="line1201">1201 |</a> ++++*/
|
|
<a name="line1202">1202 |</a>
|
|
<a name="line1203">1203 |</a> static int scan_facility( char *s, FacilityNames *table, int size)
|
|
<a name="line1204">1204 |</a> {
|
|
<a name="line1205">1205 |</a> FacilityNames *low, *mid, *high, *save;
|
|
<a name="line1206">1206 |</a>
|
|
<a name="line1207">1207 |</a> low = table;
|
|
<a name="line1208">1208 |</a> high = table + size;
|
|
<a name="line1209">1209 |</a> save = (FacilityNames *) NULL;
|
|
<a name="line1210">1210 |</a>
|
|
<a name="line1211">1211 |</a> while( low < high) {
|
|
<a name="line1212">1212 |</a> int x; /** Have to use this, because strcmp will **/
|
|
<a name="line1213">1213 |</a> /** not return -1 and 1 on Solaris 2.x **/
|
|
<a name="line1214">1214 |</a> save = mid;
|
|
<a name="line1215">1215 |</a> mid = low + ((high - low) / 2);
|
|
<a name="line1216">1216 |</a> if( save == mid)
|
|
<a name="line1217">1217 |</a> low = mid = high; /** To prevent endless loops **/
|
|
<a name="line1218">1218 |</a>
|
|
<a name="line1219">1219 |</a> if (mid == high)
|
|
<a name="line1220">1220 |</a> return -1;
|
|
<a name="line1221">1221 |</a> x = strcmp( mid->name, s);
|
|
<a name="line1222">1222 |</a>
|
|
<a name="line1223">1223 |</a> if( x < 0 )
|
|
<a name="line1224">1224 |</a> low = mid;
|
|
<a name="line1225">1225 |</a> else if( x > 0)
|
|
<a name="line1226">1226 |</a> high = mid;
|
|
<a name="line1227">1227 |</a> else
|
|
<a name="line1228">1228 |</a> return( mid->token);
|
|
<a name="line1229">1229 |</a>
|
|
<a name="line1230">1230 |</a> } /** while **/
|
|
<a name="line1231">1231 |</a>
|
|
<a name="line1232">1232 |</a> return( !strcmp( mid->name, s) ? mid->token : -1 );
|
|
<a name="line1233">1233 |</a>
|
|
<a name="line1234">1234 |</a> } /** End of 'scan_facility' **/
|
|
<a name="line1235">1235 |</a>
|
|
<a name="line1236">1236 |</a> /*++++
|
|
<a name="line1237">1237 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line1238">1238 |</a> ** **
|
|
<a name="line1239">1239 |</a> ** Function: GetFacilityPtr **
|
|
<a name="line1240">1240 |</a> ** **
|
|
<a name="line1241">1241 |</a> ** Description: Scan the passed facility names table for the given **
|
|
<a name="line1242">1242 |</a> ** string and pass back the assigned token **
|
|
<a name="line1243">1243 |</a> ** **
|
|
<a name="line1244">1244 |</a> ** First Edition: 1995/12/21 **
|
|
<a name="line1245">1245 |</a> ** **
|
|
<a name="line1246">1246 |</a> ** Parameters: char *facility Name of the facility **
|
|
<a name="line1247">1247 |</a> ** **
|
|
<a name="line1248">1248 |</a> ** Result: char** NULL Invalid facility name **
|
|
<a name="line1249">1249 |</a> ** Otherwise Pointer to the facilty string**
|
|
<a name="line1250">1250 |</a> ** reference **
|
|
<a name="line1251">1251 |</a> ** **
|
|
<a name="line1252">1252 |</a> ** ************************************************************************ **
|
|
<a name="line1253">1253 |</a> ++++*/
|
|
<a name="line1254">1254 |</a>
|
|
<a name="line1255">1255 |</a> char **GetFacilityPtr( char *facility)
|
|
<a name="line1256">1256 |</a> {
|
|
<a name="line1257">1257 |</a> int i, len;
|
|
<a name="line1258">1258 |</a> ErrMeasr *measptr;
|
|
<a name="line1259">1259 |</a> char *buf, *s, *t;
|
|
<a name="line1260">1260 |</a> ErrFacilities *facptr;
|
|
<a name="line1261">1261 |</a>
|
|
<a name="line1262">1262 |</a> /**
|
|
<a name="line1263">1263 |</a> ** Try to figure out the error weight at first
|
|
<a name="line1264">1264 |</a> ** Need the given weight in upper case for this
|
|
<a name="line1265">1265 |</a> **/
|
|
<a name="line1266">1266 |</a> len = strlen( facility);
|
|
<a name="line1267">1267 |</a>
|
|
<a name="line1268">1268 |</a> if((char *) NULL == (buf = stringer(NULL, 0, facility, NULL)))
|
|
<a name="line1269">1269 |</a> if( OK != ErrorLogger( ERR_ALLOC, LOC, NULL))
|
|
<a name="line1270">1270 |</a> goto unwind0;
|
|
<a name="line1271">1271 |</a>
|
|
<a name="line1272">1272 |</a> for( t = buf; *t; ++t) *t = toupper(*t);
|
|
<a name="line1273">1273 |</a>
|
|
<a name="line1274">1274 |</a> /**
|
|
<a name="line1275">1275 |</a> ** Now look up the measurements table for the uppercase weight
|
|
<a name="line1276">1276 |</a> **/
|
|
<a name="line1277">1277 |</a> i = sizeof( Measurements) / sizeof( Measurements[ 0]);
|
|
<a name="line1278">1278 |</a> measptr = Measurements;
|
|
<a name="line1279">1279 |</a>
|
|
<a name="line1280">1280 |</a> while( i) {
|
|
<a name="line1281">1281 |</a> if( !strncmp( measptr->message, buf, len))
|
|
<a name="line1282">1282 |</a> break;
|
|
<a name="line1283">1283 |</a> i--; measptr++;
|
|
<a name="line1284">1284 |</a> }
|
|
<a name="line1285">1285 |</a>
|
|
<a name="line1286">1286 |</a> null_free((void *) &buf);
|
|
<a name="line1287">1287 |</a>
|
|
<a name="line1288">1288 |</a> if( !i) /** not found **/
|
|
<a name="line1289">1289 |</a> goto unwind0;
|
|
<a name="line1290">1290 |</a>
|
|
<a name="line1291">1291 |</a> /**
|
|
<a name="line1292">1292 |</a> ** Now get the facility table entry
|
|
<a name="line1293">1293 |</a> **/
|
|
<a name="line1294">1294 |</a>
|
|
<a name="line1295">1295 |</a> if((ErrFacilities *) NULL == (facptr = GetFacility_sub(
|
|
<a name="line1296">1296 |</a> measptr->error_weight))) {
|
|
<a name="line1297">1297 |</a> ErrorLogger( ERR_INVWGHT_WARN, LOC, facility, NULL);
|
|
<a name="line1298">1298 |</a> goto unwind0;
|
|
<a name="line1299">1299 |</a> }
|
|
<a name="line1300">1300 |</a>
|
|
<a name="line1301">1301 |</a> /**
|
|
<a name="line1302">1302 |</a> ** Got it ... return the desired pointer
|
|
<a name="line1303">1303 |</a> **/
|
|
<a name="line1304">1304 |</a> return( &facptr->facility); /** -------- EXIT (RESULT) -------> **/
|
|
<a name="line1305">1305 |</a>
|
|
<a name="line1306">1306 |</a> unwind0:
|
|
<a name="line1307">1307 |</a> return((char **) NULL); /** -------- EXIT (FAILURE) -------> **/
|
|
<a name="line1308">1308 |</a>
|
|
<a name="line1309">1309 |</a> } /** End of 'GetFacilityPtr' **/
|
|
<a name="line1310">1310 |</a>
|
|
<a name="line1311">1311 |</a> /*++++
|
|
<a name="line1312">1312 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line1313">1313 |</a> ** **
|
|
<a name="line1314">1314 |</a> ** Function: PrintError **
|
|
<a name="line1315">1315 |</a> ** **
|
|
<a name="line1316">1316 |</a> ** Description: Print the error message **
|
|
<a name="line1317">1317 |</a> ** **
|
|
<a name="line1318">1318 |</a> ** First Edition: 1995/08/06 **
|
|
<a name="line1319">1319 |</a> ** **
|
|
<a name="line1320">1320 |</a> ** Parameters: char *errbuffer Buffer to hold the **
|
|
<a name="line1321">1321 |</a> ** error messge **
|
|
<a name="line1322">1322 |</a> ** ErrType Type Error type as passed **
|
|
<a name="line1323">1323 |</a> ** char *module Module name **
|
|
<a name="line1324">1324 |</a> ** int lineno Line number **
|
|
<a name="line1325">1325 |</a> ** ErrWeights Weight Error Weight **
|
|
<a name="line1326">1326 |</a> ** char *WeightMsg Printable Weight **
|
|
<a name="line1327">1327 |</a> ** char *ErrMsgs Error message **
|
|
<a name="line1328">1328 |</a> ** int argc Number of arguments **
|
|
<a name="line1329">1329 |</a> ** char **argv Argument array **
|
|
<a name="line1330">1330 |</a> ** **
|
|
<a name="line1331">1331 |</a> ** Result: int 1 Everything OK **
|
|
<a name="line1332">1332 |</a> ** 0 Error occured while printing **
|
|
<a name="line1333">1333 |</a> ** **
|
|
<a name="line1334">1334 |</a> ** Notes: According to the error type, the passed module and line num- **
|
|
<a name="line1335">1335 |</a> ** ber will be handled as a module-file related one or depending**
|
|
<a name="line1336">1336 |</a> ** on the packages source code: **
|
|
<a name="line1337">1337 |</a> ** **
|
|
<a name="line1338">1338 |</a> ** src -> ERR_IN_MODULEFILE -> modulefile -> ERR_INTERNAL -> src**
|
|
<a name="line1339">1339 |</a> ** **
|
|
<a name="line1340">1340 |</a> ** ************************************************************************ **
|
|
<a name="line1341">1341 |</a> ++++*/
|
|
<a name="line1342">1342 |</a>
|
|
<a name="line1343">1343 |</a> static int PrintError( char *errbuffer,
|
|
<a name="line1344">1344 |</a> ErrType Type,
|
|
<a name="line1345">1345 |</a> char *module,
|
|
<a name="line1346">1346 |</a> int lineno,
|
|
<a name="line1347">1347 |</a> ErrWeights Weight,
|
|
<a name="line1348">1348 |</a> char *WeightMsg,
|
|
<a name="line1349">1349 |</a> char *ErrMsgs,
|
|
<a name="line1350">1350 |</a> int argc,
|
|
<a name="line1351">1351 |</a> char **argv)
|
|
<a name="line1352">1352 |</a> {
|
|
<a name="line1353">1353 |</a> char *error_string;
|
|
<a name="line1354">1354 |</a>
|
|
<a name="line1355">1355 |</a> /**
|
|
<a name="line1356">1356 |</a> ** Build the error string at first. Note - we cannot alloc memory any
|
|
<a name="line1357">1357 |</a> ** more!
|
|
<a name="line1358">1358 |</a> **/
|
|
<a name="line1359">1359 |</a> if( ERR_ALLOC == Type)
|
|
<a name="line1360">1360 |</a> error_string = ErrMsgs;
|
|
<a name="line1361">1361 |</a> else
|
|
<a name="line1362">1362 |</a> if( NULL == (error_string = ErrorString( ErrMsgs, argc, argv)))
|
|
<a name="line1363">1363 |</a> return( 0);
|
|
<a name="line1364">1364 |</a>
|
|
<a name="line1365">1365 |</a> /**
|
|
<a name="line1366">1366 |</a> ** Print
|
|
<a name="line1367">1367 |</a> **/
|
|
<a name="line1368">1368 |</a>
|
|
<a name="line1369">1369 |</a> if( ERR_INTERNAL > Type && ERR_IN_MODULEFILE < Type &&
|
|
<a name="line1370">1370 |</a> linenum && g_current_module )
|
|
<a name="line1371">1371 |</a>
|
|
<a name="line1372">1372 |</a> sprintf( errbuffer, "%s(%s):%s:%d: %s\n", g_current_module,
|
|
<a name="line1373">1373 |</a> (sprintf( buffer, "%d", linenum), buffer),
|
|
<a name="line1374">1374 |</a> WeightMsg, Type, (error_string ? error_string : "") );
|
|
<a name="line1375">1375 |</a> else
|
|
<a name="line1376">1376 |</a>
|
|
<a name="line1377">1377 |</a> sprintf( errbuffer, "%s(%s):%s:%d: %s\n", (module ? module : "??"),
|
|
<a name="line1378">1378 |</a> ( lineno ? (sprintf( buffer, "%d", lineno), buffer) : "??" ),
|
|
<a name="line1379">1379 |</a> WeightMsg, Type, (error_string ? error_string : "") );
|
|
<a name="line1380">1380 |</a>
|
|
<a name="line1381">1381 |</a> /**
|
|
<a name="line1382">1382 |</a> ** Success
|
|
<a name="line1383">1383 |</a> **/
|
|
<a name="line1384">1384 |</a> return( 1);
|
|
<a name="line1385">1385 |</a>
|
|
<a name="line1386">1386 |</a> } /** End of 'PrintError' **/
|
|
<a name="line1387">1387 |</a>
|
|
<a name="line1388">1388 |</a> /*++++
|
|
<a name="line1389">1389 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line1390">1390 |</a> ** **
|
|
<a name="line1391">1391 |</a> ** Function: ErrorString **
|
|
<a name="line1392">1392 |</a> ** **
|
|
<a name="line1393">1393 |</a> ** Description: Print the error message **
|
|
<a name="line1394">1394 |</a> ** **
|
|
<a name="line1395">1395 |</a> ** First Edition: 1995/08/06 **
|
|
<a name="line1396">1396 |</a> ** **
|
|
<a name="line1397">1397 |</a> ** Parameters: char *ErrMsgs Error message **
|
|
<a name="line1398">1398 |</a> ** int argc Number of arguments **
|
|
<a name="line1399">1399 |</a> ** char **argv Argument array **
|
|
<a name="line1400">1400 |</a> ** **
|
|
<a name="line1401">1401 |</a> ** Result: char* NULL Parse or alloc error **
|
|
<a name="line1402">1402 |</a> ** else Pointer to the error string **
|
|
<a name="line1403">1403 |</a> ** **
|
|
<a name="line1404">1404 |</a> ** Attached Globals: - **
|
|
<a name="line1405">1405 |</a> ** **
|
|
<a name="line1406">1406 |</a> ** ************************************************************************ **
|
|
<a name="line1407">1407 |</a> ++++*/
|
|
<a name="line1408">1408 |</a>
|
|
<a name="line1409">1409 |</a> static char *ErrorString( char *ErrMsgs,
|
|
<a name="line1410">1410 |</a> int argc,
|
|
<a name="line1411">1411 |</a> char **argv)
|
|
<a name="line1412">1412 |</a> {
|
|
<a name="line1413">1413 |</a> char *s; /** Insertion pointer **/
|
|
<a name="line1414">1414 |</a> int len = 0; /** Current length **/
|
|
<a name="line1415">1415 |</a> int backslash = 0; /** backslash found ? **/
|
|
<a name="line1416">1416 |</a>
|
|
<a name="line1417">1417 |</a> if( !ErrMsgs)
|
|
<a name="line1418">1418 |</a> return( NULL);
|
|
<a name="line1419">1419 |</a>
|
|
<a name="line1420">1420 |</a> /**
|
|
<a name="line1421">1421 |</a> ** Allocate memory if neccessary
|
|
<a name="line1422">1422 |</a> **/
|
|
<a name="line1423">1423 |</a> if( !error_line)
|
|
<a name="line1424">1424 |</a> if((char *) NULL ==(error_line = stringer(NULL,strsize = ERR_LINELEN,
|
|
<a name="line1425">1425 |</a> NULL))){
|
|
<a name="line1426">1426 |</a> ErrorLogger( ERR_STRING, LOC, NULL);
|
|
<a name="line1427">1427 |</a> return( NULL);
|
|
<a name="line1428">1428 |</a> }
|
|
<a name="line1429">1429 |</a>
|
|
<a name="line1430">1430 |</a> s = error_line;
|
|
<a name="line1431">1431 |</a>
|
|
<a name="line1432">1432 |</a> /**
|
|
<a name="line1433">1433 |</a> ** Scan the error strings to be printed
|
|
<a name="line1434">1434 |</a> **/
|
|
<a name="line1435">1435 |</a> while( *ErrMsgs) {
|
|
<a name="line1436">1436 |</a>
|
|
<a name="line1437">1437 |</a> /**
|
|
<a name="line1438">1438 |</a> ** Check for special characters
|
|
<a name="line1439">1439 |</a> **/
|
|
<a name="line1440">1440 |</a> switch( *ErrMsgs) {
|
|
<a name="line1441">1441 |</a> case '\\': if( !backslash) {
|
|
<a name="line1442">1442 |</a> backslash = 1;
|
|
<a name="line1443">1443 |</a> ErrMsgs++;
|
|
<a name="line1444">1444 |</a> continue; /** while( *ErrMsgs) **/
|
|
<a name="line1445">1445 |</a> }
|
|
<a name="line1446">1446 |</a> break; /** switch **/
|
|
<a name="line1447">1447 |</a>
|
|
<a name="line1448">1448 |</a> case '$': if( !backslash) {
|
|
<a name="line1449">1449 |</a> ErrMsgs++;
|
|
<a name="line1450">1450 |</a> add_param( &ErrMsgs, &s, &len, argc, argv);
|
|
<a name="line1451">1451 |</a> error_line = s - len;
|
|
<a name="line1452">1452 |</a> continue; /** while( *ErrMsgs) **/
|
|
<a name="line1453">1453 |</a> }
|
|
<a name="line1454">1454 |</a> break; /** switch **/
|
|
<a name="line1455">1455 |</a> } /** switch **/
|
|
<a name="line1456">1456 |</a>
|
|
<a name="line1457">1457 |</a> /**
|
|
<a name="line1458">1458 |</a> ** Add a single character to the error string
|
|
<a name="line1459">1459 |</a> **/
|
|
<a name="line1460">1460 |</a> if( ++len >= strsize - 5) { /** 5 Bytes for safety **/
|
|
<a name="line1461">1461 |</a> if( NULL == (error_line = (char *) realloc( error_line,
|
|
<a name="line1462">1462 |</a> strsize += ERR_LINELEN))) {
|
|
<a name="line1463">1463 |</a> ErrorLogger( ERR_ALLOC, LOC, NULL);
|
|
<a name="line1464">1464 |</a> return( NULL);
|
|
<a name="line1465">1465 |</a> }
|
|
<a name="line1466">1466 |</a> s = error_line + len - 1;
|
|
<a name="line1467">1467 |</a> }
|
|
<a name="line1468">1468 |</a>
|
|
<a name="line1469">1469 |</a> *s++ = *ErrMsgs++;
|
|
<a name="line1470">1470 |</a> backslash = 0;
|
|
<a name="line1471">1471 |</a>
|
|
<a name="line1472">1472 |</a> } /** while( *ErrMsgs) **/
|
|
<a name="line1473">1473 |</a>
|
|
<a name="line1474">1474 |</a> /**
|
|
<a name="line1475">1475 |</a> ** Success. Return a pointer to the newly created string
|
|
<a name="line1476">1476 |</a> **/
|
|
<a name="line1477">1477 |</a> *s++ = '\0';
|
|
<a name="line1478">1478 |</a> return( error_line);
|
|
<a name="line1479">1479 |</a>
|
|
<a name="line1480">1480 |</a> } /** End of 'ErrorString' **/
|
|
<a name="line1481">1481 |</a>
|
|
<a name="line1482">1482 |</a> /*++++
|
|
<a name="line1483">1483 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line1484">1484 |</a> ** **
|
|
<a name="line1485">1485 |</a> ** Function: add_param **
|
|
<a name="line1486">1486 |</a> ** **
|
|
<a name="line1487">1487 |</a> ** Description: Put an argument to the error string **
|
|
<a name="line1488">1488 |</a> ** **
|
|
<a name="line1489">1489 |</a> ** First Edition: 1995/08/06 **
|
|
<a name="line1490">1490 |</a> ** **
|
|
<a name="line1491">1491 |</a> ** Parameters: char **Control Parameter control **
|
|
<a name="line1492">1492 |</a> ** char **Target Target to print to **
|
|
<a name="line1493">1493 |</a> ** int *Length Current length of the**
|
|
<a name="line1494">1494 |</a> ** output string **
|
|
<a name="line1495">1495 |</a> ** int argc Number of arguments **
|
|
<a name="line1496">1496 |</a> ** char **argv Argument array **
|
|
<a name="line1497">1497 |</a> ** **
|
|
<a name="line1498">1498 |</a> ** Result: - **
|
|
<a name="line1499">1499 |</a> ** **
|
|
<a name="line1500">1500 |</a> ** Attached Globals: - **
|
|
<a name="line1501">1501 |</a> ** **
|
|
<a name="line1502">1502 |</a> ** ************************************************************************ **
|
|
<a name="line1503">1503 |</a> ++++*/
|
|
<a name="line1504">1504 |</a>
|
|
<a name="line1505">1505 |</a> static void add_param( char **Control,
|
|
<a name="line1506">1506 |</a> char **Target,
|
|
<a name="line1507">1507 |</a> int *Length,
|
|
<a name="line1508">1508 |</a> int argc,
|
|
<a name="line1509">1509 |</a> char **argv)
|
|
<a name="line1510">1510 |</a> {
|
|
<a name="line1511">1511 |</a> char *s; /** Scan pointer fot the ctrl field **/
|
|
<a name="line1512">1512 |</a> int index, last = 0; /** parameter index **/
|
|
<a name="line1513">1513 |</a> int len = 0; /** Parameter string length **/
|
|
<a name="line1514">1514 |</a>
|
|
<a name="line1515">1515 |</a> /**
|
|
<a name="line1516">1516 |</a> ** Copy the current control field into the buffer
|
|
<a name="line1517">1517 |</a> **/
|
|
<a name="line1518">1518 |</a>
|
|
<a name="line1519">1519 |</a> for( s = buffer; **Control; (*Control)++ ) {
|
|
<a name="line1520">1520 |</a>
|
|
<a name="line1521">1521 |</a> if( **Control == '*') {
|
|
<a name="line1522">1522 |</a> last = argc;
|
|
<a name="line1523">1523 |</a> continue;
|
|
<a name="line1524">1524 |</a> } else if( **Control < '0' || **Control > '9')
|
|
<a name="line1525">1525 |</a> break;
|
|
<a name="line1526">1526 |</a>
|
|
<a name="line1527">1527 |</a> *s++ = **Control;
|
|
<a name="line1528">1528 |</a> }
|
|
<a name="line1529">1529 |</a>
|
|
<a name="line1530">1530 |</a> *s = '\0';
|
|
<a name="line1531">1531 |</a>
|
|
<a name="line1532">1532 |</a> /**
|
|
<a name="line1533">1533 |</a> ** Has something been found ? If not, print a '$'
|
|
<a name="line1534">1534 |</a> **/
|
|
<a name="line1535">1535 |</a> if( s == buffer && !last) {
|
|
<a name="line1536">1536 |</a>
|
|
<a name="line1537">1537 |</a> if( ++(*Length) >= strsize) {
|
|
<a name="line1538">1538 |</a> if( NULL == (error_line = (char*) realloc( error_line,
|
|
<a name="line1539">1539 |</a> strsize += ERR_LINELEN))) {
|
|
<a name="line1540">1540 |</a> ErrorLogger( ERR_ALLOC, LOC, NULL);
|
|
<a name="line1541">1541 |</a> return;
|
|
<a name="line1542">1542 |</a> }
|
|
<a name="line1543">1543 |</a> *Target = error_line + *Length - 1;
|
|
<a name="line1544">1544 |</a> }
|
|
<a name="line1545">1545 |</a>
|
|
<a name="line1546">1546 |</a> *(*Target++) = '$';
|
|
<a name="line1547">1547 |</a>
|
|
<a name="line1548">1548 |</a> } else {
|
|
<a name="line1549">1549 |</a>
|
|
<a name="line1550">1550 |</a> /**
|
|
<a name="line1551">1551 |</a> ** Something has been found. Form the parameter index at first
|
|
<a name="line1552">1552 |</a> **/
|
|
<a name="line1553">1553 |</a> if( s == buffer)
|
|
<a name="line1554">1554 |</a> index = 0;
|
|
<a name="line1555">1555 |</a> else
|
|
<a name="line1556">1556 |</a> index = atoi( buffer) - 1;
|
|
<a name="line1557">1557 |</a>
|
|
<a name="line1558">1558 |</a> if( !last)
|
|
<a name="line1559">1559 |</a> last = index + 1;
|
|
<a name="line1560">1560 |</a> if( last > argc)
|
|
<a name="line1561">1561 |</a> last = argc;
|
|
<a name="line1562">1562 |</a>
|
|
<a name="line1563">1563 |</a> /**
|
|
<a name="line1564">1564 |</a> ** Spool them all out
|
|
<a name="line1565">1565 |</a> **/
|
|
<a name="line1566">1566 |</a> while( index < last) {
|
|
<a name="line1567">1567 |</a>
|
|
<a name="line1568">1568 |</a> len = strlen( argv[ index]);
|
|
<a name="line1569">1569 |</a>
|
|
<a name="line1570">1570 |</a> while(( *Length + len + 1) >= strsize - 5) {
|
|
<a name="line1571">1571 |</a> if( NULL == (error_line = (char*) realloc( error_line,
|
|
<a name="line1572">1572 |</a> strsize += ERR_LINELEN))) {
|
|
<a name="line1573">1573 |</a> ErrorLogger( ERR_ALLOC, LOC, NULL);
|
|
<a name="line1574">1574 |</a> return;
|
|
<a name="line1575">1575 |</a> }
|
|
<a name="line1576">1576 |</a> *Target = error_line + *Length;
|
|
<a name="line1577">1577 |</a> }
|
|
<a name="line1578">1578 |</a>
|
|
<a name="line1579">1579 |</a> strcpy( *Target, argv[ index]);
|
|
<a name="line1580">1580 |</a> *Target += len;
|
|
<a name="line1581">1581 |</a> *Length += len;
|
|
<a name="line1582">1582 |</a>
|
|
<a name="line1583">1583 |</a> index++;
|
|
<a name="line1584">1584 |</a>
|
|
<a name="line1585">1585 |</a> } /** while **/
|
|
<a name="line1586">1586 |</a> } /** if **/
|
|
<a name="line1587">1587 |</a>
|
|
<a name="line1588">1588 |</a> } /** End of 'add_param' **/
|
|
</pre>
|
|
|
|
</BODY>
|
|
</HTML>
|