head 1.11; access; symbols OSSP_RC_0_7_3:1.11 OSSP_RC_0_7_2:1.11 OSSP_RC_0_7_1:1.9 OSSP_RC_ALPHA_06:1.1 OSSP_RC_EXBROKEN:1.1; locks; strict; comment @ * @; 1.11 date 2003.07.11.09.18.20; author ms; state Exp; branches; next 1.10; 1.10 date 2003.07.08.15.09.50; author mlelstv; state Exp; branches; next 1.9; 1.9 date 2003.07.07.13.30.51; author ms; state Exp; branches; next 1.8; 1.8 date 2003.07.07.12.55.42; author ms; state Exp; branches; next 1.7; 1.7 date 2003.07.02.15.29.08; author ms; state Exp; branches; next 1.6; 1.6 date 2003.07.02.15.07.48; author ms; state Exp; branches; next 1.5; 1.5 date 2003.07.02.12.40.15; author ms; state Exp; branches; next 1.4; 1.4 date 2003.06.30.15.27.38; author ms; state Exp; branches; next 1.3; 1.3 date 2003.06.24.09.35.39; author ms; state Exp; branches; next 1.2; 1.2 date 2003.06.23.16.09.47; author ms; state Exp; branches; next 1.1; 1.1 date 2002.07.10.19.02.24; author ms; state Exp; branches; next ; desc @@ 1.11 log @Replace embedded text strings from code to constants header. Address two functional problems identified by Thomas and Ralf, namely missing error message identifiers and confusing period punctuation with info option. @ text @/* OSSP rc - Run-Command Processor ** Copyright (c) 2002-2003 Ralf S. Engelschall ** Copyright (c) 2002-2003 Cable & Wireless Deutschland GmbH ** Copyright (c) 2002-2003 The OSSP Project ** ** This file is part of OSSP rc, a portable run-command processor ** which can be found at http://www.ossp.org/pkg/lib/rc/ ** ** Permission to use, copy, modify, and distribute this software for ** any purpose with or without fee is hereby granted, provided that ** the above copyright notice and this permission notice appear in all ** copies. ** ** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED ** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR ** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF ** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ** SUCH DAMAGE. ** ** rc_error.c: Run-Command Processor ISO C source file */ #include /* Just for calling 'exit(3)' once */ #include "rc.h" /* Public interfaces */ #include "rc_config.h" /* Interface to the configuration */ #include "rc_const.h" /* Error message string constants */ /************************************************ * rcError(ex_t) * * Main rc error handler * ************************************************/ void rcError(ex_t Localerr) { /* FIXME mlelstv -- looks like a case for a switch (pun intended) */ if (FAILED((rc_return_t)Localerr.ex_value)) { /* Error condition */ if ((rc_return_t)Localerr.ex_value == RC_ERR_TRM) exit(0); else if ((rc_return_t)Localerr.ex_value == RC_ERR_USE) { fprintf(stderr, RC_ERRTXT_USE); if (configGetval(RC_DBG_VAL)) fprintf(stderr, RC_ERRTXT_ALL, \ Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); } else if ((rc_return_t)Localerr.ex_value == RC_ERR_MEM) { fprintf(stderr, RC_ERRTXT_MEM); if (configGetval(RC_DBG_VAL)) fprintf(stderr, RC_ERRTXT_ALL, \ Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); } else if ((rc_return_t)Localerr.ex_value == RC_ERR_SYS) { fprintf(stderr, RC_ERRTXT_SYS); if (configGetval(RC_DBG_VAL)) fprintf(stderr, RC_ERRTXT_ALL, \ Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); } else if ((rc_return_t)Localerr.ex_value == RC_ERR_IO) { fprintf(stderr, RC_ERRTXT_IO); if (configGetval(RC_DBG_VAL)) fprintf(stderr, RC_ERRTXT_ALL, \ Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); } else if ((rc_return_t)Localerr.ex_value == RC_ERR_INT) { fprintf(stderr, RC_ERRTXT_INT); if (configGetval(RC_DBG_VAL)) fprintf(stderr, RC_ERRTXT_ALL, \ Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); } else if ((rc_return_t)Localerr.ex_value == RC_ERR_FNC) { fprintf(stderr, RC_ERRTXT_FNC, \ configGetval(RC_FNC_VAL)); if (configGetval(RC_DBG_VAL)) fprintf(stderr, RC_ERRTXT_ALL, \ Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); } else if ((rc_return_t)Localerr.ex_value == RC_ERR_LOC) { fprintf(stderr, RC_ERRTXT_LOC, \ configGetval(RC_LOC_VAL)); if (configGetval(RC_DBG_VAL)) fprintf(stderr, RC_ERRTXT_ALL, \ Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); } else if ((rc_return_t)Localerr.ex_value == RC_ERR_TMP) { fprintf(stderr, RC_ERRTXT_TMP, \ configGetval(RC_TMP_VAL)); if (configGetval(RC_DBG_VAL)) fprintf(stderr, RC_ERRTXT_ALL, \ Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); } else if ((rc_return_t)Localerr.ex_value == RC_ERR_RCF) { fprintf(stderr, RC_ERRTXT_RCF); if (configGetval(RC_DBG_VAL)) fprintf(stderr, RC_ERRTXT_ALL, \ Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); } else if ((rc_return_t)Localerr.ex_value == RC_ERR_CFG) { fprintf(stderr, RC_ERRTXT_CFG); if (configGetval(RC_DBG_VAL)) fprintf(stderr, RC_ERRTXT_ALL, \ Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); } else if ((rc_return_t)Localerr.ex_value == RC_ERR_ROOT) { fprintf(stderr, RC_ERRTXT_ROOT); if (configGetval(RC_DBG_VAL)) fprintf(stderr, RC_ERRTXT_ALL, \ Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); } else { fprintf(stderr, RC_ERRTXT_GEN, (char *)Localerr.ex_class); if (configGetval(RC_DBG_VAL)) fprintf(stderr, RC_ERRTXT_ALL, \ Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); } /* Return a corresponding failure code in every case */ exit((int)Localerr.ex_value); } #ifdef DEBUG else /* Warning condition */ fprintf(stderr, " Warning condition of class '%s',\n exception %d in %s:%s():%d.\n", (char *)Localerr.ex_class, (int)Localerr.ex_value, Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); #else else /* Warning condition */ RC_NOP; /* No operation on warnings */ #endif } @ 1.10 log @flush audit comments and changes @ text @d33 1 d48 1 a48 1 fprintf(stderr, " API usage is wrong.\n"); d50 1 a50 1 fprintf(stderr, " Error condition in %s:%s():%d.\n", \ d54 1 a54 1 fprintf(stderr, " Memory allocation failure.\n"); d56 1 a56 1 fprintf(stderr, " Error condition in %s:%s():%d.\n", \ d60 1 a60 1 fprintf(stderr, " Underlying system failure.\n"); d62 1 a62 1 fprintf(stderr, " Error condition in %s:%s():%d.\n", \ d66 1 a66 1 fprintf(stderr, " Input output failure.\n"); d68 1 a68 1 fprintf(stderr, " Error condition in %s:%s():%d.\n", \ d72 1 a72 1 fprintf(stderr, " Internal failure.\n"); d74 1 a74 1 fprintf(stderr, " Error condition in %s:%s():%d.\n", \ d78 1 a78 1 fprintf(stderr, " Function file %s could not be opened.\n", \ d81 1 a81 1 fprintf(stderr, " Error condition in %s:%s():%d.\n", \ d85 1 a85 1 fprintf(stderr, " Location dir %s could not be opened.\n", \ d88 1 a88 1 fprintf(stderr, " Error condition in %s:%s():%d.\n", \ d92 1 a92 1 fprintf(stderr, " Temporary dir %s could not be opened.\n", \ d95 1 a95 1 fprintf(stderr, " Error condition in %s:%s():%d.\n", \ d99 1 a99 1 fprintf(stderr, " One or more rc files could not be opened.\n"); d101 1 a101 1 fprintf(stderr, " Error condition in %s:%s():%d.\n", \ d105 1 a105 1 fprintf(stderr, " Configuration failure.\n"); d107 1 a107 1 fprintf(stderr, " Error condition in %s:%s():%d.\n", \ d111 1 a111 1 fprintf(stderr, " You must be root to run these commands.\n"); d113 1 a113 1 fprintf(stderr, " Error condition in %s:%s():%d.\n", \ d117 1 a117 1 fprintf(stderr, " Generic failure condition of class '%s',.\n", (char *)Localerr.ex_class); d119 1 a119 1 fprintf(stderr, " Error condition in %s:%s():%d.\n", \ @ 1.9 log @More header corrections and improvements. @ text @d41 2 @ 1.8 log @Correct and update copyrights and source headers. @ text @d1 1 a1 1 /* OSSP rc - Run-command processor d6 1 a6 1 ** This file is part of OSSP rc, a portable Run-command processor d27 1 a27 1 ** rc_error.c: Run-command processor ISO C source file @ 1.7 log @Bugfix and add temporary dir error logic. @ text @d2 3 a4 3 ** Copyright (c) 2002 Ralf S. Engelschall ** Copyright (c) 2002 Cable & Wireless Deutschland GmbH ** Copyright (c) 2002 The OSSP Project @ 1.6 log @Repair and improve with more details in case of missing files or directory open failures. @ text @d81 1 a81 1 else if ((rc_return_t)Localerr.ex_value == RC_ERR_DIR) { d88 7 d114 1 a114 1 fprintf(stderr, " \n Generic failure condition of class '%s',.\n"); @ 1.5 log @Add debug option condition to error output, and reformat output to improve clarity of errors at runtime. @ text @d30 3 a32 2 #include /* Just for calling 'exit(3)' once */ #include "rc.h" /* Public interfaces */ d45 2 a46 2 fprintf(stderr, " API usage is wrong\n."); if (configGetvar(RC_DBG_VAL)) d51 2 a52 2 fprintf(stderr, " Memory allocation failure\n."); if (configGetvar(RC_DBG_VAL)) d57 2 a58 2 fprintf(stderr, " Underlying system failure\n."); if (configGetvar(RC_DBG_VAL)) d63 2 a64 2 fprintf(stderr, " Input output failure\n."); if (configGetvar(RC_DBG_VAL)) d69 2 a70 2 fprintf(stderr, " Internal failure\n."); if (configGetvar(RC_DBG_VAL)) d75 3 a77 2 fprintf(stderr, " Function file could not be opened\n."); if (configGetvar(RC_DBG_VAL)) d82 3 a84 2 fprintf(stderr, " Location dir could not be opened\n."); if (configGetvar(RC_DBG_VAL)) d89 2 a90 2 fprintf(stderr, " Rc file could not be opened\n."); if (configGetvar(RC_DBG_VAL)) d95 2 a96 2 fprintf(stderr, " Configuration and options failure\n."); if (configGetvar(RC_DBG_VAL)) d101 2 a102 2 fprintf(stderr, " You must be root to run these commands\n."); if (configGetvar(RC_DBG_VAL)) d107 2 a108 2 fprintf(stderr, " \n Generic failure condition of class '%s',\n."); if (configGetvar(RC_DBG_VAL)) @ 1.4 log @Add RC_ERR_ROOT error, and improve error handling during forked child op failures. @ text @d43 69 a111 33 else if ((rc_return_t)Localerr.ex_value == RC_ERR_USE) fprintf(stderr, " Error condition, API usage is wrong in %s:%s():%d.\n", \ Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); else if ((rc_return_t)Localerr.ex_value == RC_ERR_MEM) fprintf(stderr, " Error condition, memory allocation failure in %s:%s():%d.\n", \ Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); else if ((rc_return_t)Localerr.ex_value == RC_ERR_SYS) fprintf(stderr, " Error condition, underlying system failure in %s:%s():%d.\n", \ Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); else if ((rc_return_t)Localerr.ex_value == RC_ERR_IO) fprintf(stderr, " Error condition, input output failure in %s:%s():%d.\n", \ Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); else if ((rc_return_t)Localerr.ex_value == RC_ERR_INT) fprintf(stderr, " Error condition, internal failure in %s:%s():%d.\n", \ Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); else if ((rc_return_t)Localerr.ex_value == RC_ERR_FNC) fprintf(stderr, " Error condition, function file could not be opened in %s:%s():%d.\n", \ Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); else if ((rc_return_t)Localerr.ex_value == RC_ERR_DIR) fprintf(stderr, " Error condition, location dir could not be opened in %s:%s():%d.\n", \ Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); else if ((rc_return_t)Localerr.ex_value == RC_ERR_RCF) fprintf(stderr, " Error condition, rc file could not be opened in %s:%s():%d.\n", \ Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); else if ((rc_return_t)Localerr.ex_value == RC_ERR_CFG) fprintf(stderr, " Error condition, configuration and options failure in %s:%s():%d.\n", \ Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); else if ((rc_return_t)Localerr.ex_value == RC_ERR_ROOT) fprintf(stderr, " Error condition, in %s:%s():%d. You must be root to run these commands\n", \ Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); else fprintf(stderr, " Error condition of class '%s',\n exception %d in %s:%s():%d.\n", (char *)Localerr.ex_class, (int)Localerr.ex_value, Localerr.ex_file, Localerr.ex_func, Localerr.ex_line); exit((int)Localerr.ex_value); /* Return failure */ @ 1.3 log @Make error messages more descriptive. @ text @d70 3 d75 1 a75 1 exit(1); /* Return failure */ @ 1.2 log @Complete error handling method according to all defined error values. @ text @d44 2 a45 1 fprintf(stderr, " Error condition, API usage is wrong.\n"); d47 2 a48 1 fprintf(stderr, " Error condition, memory allocation failure.\n"); d50 2 a51 1 fprintf(stderr, " Error condition, underlying system failure.\n"); d53 2 a54 1 fprintf(stderr, " Error condition, input output failure.\n"); d56 2 a57 1 fprintf(stderr, " Error condition, internal failure.\n"); d59 2 a60 1 fprintf(stderr, " Error condition, function file could not be opened.\n"); d62 2 a63 1 fprintf(stderr, " Error condition, location dir could not be opened.\n"); d65 2 a66 1 fprintf(stderr, " Error condition, rc file could not be opened.\n"); d68 2 a69 1 fprintf(stderr, " Error condition, configuration and options failure.\n"); @ 1.1 log @Make the main source file even smaller by splitting out the error handling logic into a new rc_error source file. @ text @d43 10 d59 2 @