mirror of
https://github.com/envmodules/modules.git
synced 2026-06-10 00:56:30 +08:00
815 lines
45 KiB
HTML
815 lines
45 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 main.c
|
|
CPP : cxref-cpp -lang-c -C -dD -dI
|
|
-->
|
|
|
|
<HTML>
|
|
|
|
<HEAD>
|
|
<TITLE>Source File main.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: main.c **
|
|
<a name="line8">8 |</a> ** First Edition: 1991/10/23 **
|
|
<a name="line9">9 |</a> ** **
|
|
<a name="line10">10 |</a> ** Authors: John Furlan, jlf@behere.com **
|
|
<a name="line11">11 |</a> ** Jens Hamisch, jens@Strawberry.COM **
|
|
<a name="line12">12 |</a> ** **
|
|
<a name="line13">13 |</a> ** Description: The main routine of Tcl Modules including all of **
|
|
<a name="line14">14 |</a> ** the global data. **
|
|
<a name="line15">15 |</a> ** **
|
|
<a name="line16">16 |</a> ** Exports: main Main program **
|
|
<a name="line17">17 |</a> ** module_usage Module usage information **
|
|
<a name="line18">18 |</a> ** Tcl_AppInit Tcl Application initialization **
|
|
<a name="line19">19 |</a> ** **
|
|
<a name="line20">20 |</a> ** Notes: **
|
|
<a name="line21">21 |</a> ** **
|
|
<a name="line22">22 |</a> ** ************************************************************************ **
|
|
<a name="line23">23 |</a> ****/
|
|
<a name="line24">24 |</a>
|
|
<a name="line25">25 |</a> /** ** Copyright *********************************************************** **
|
|
<a name="line26">26 |</a> ** **
|
|
<a name="line27">27 |</a> ** Copyright 1991-1994 by John L. Furlan. **
|
|
<a name="line28">28 |</a> ** see LICENSE.GPL, which must be provided, for details **
|
|
<a name="line29">29 |</a> ** **
|
|
<a name="line30">30 |</a> ** ************************************************************************ **/
|
|
<a name="line31">31 |</a>
|
|
<a name="line32">32 |</a> static char Id[] = "@(#)$Id: main.c.src.html,v 1.6 2006/01/18 05:35:11 rkowen Exp $";
|
|
<a name="line33">33 |</a> static void *UseId[] = { &UseId, Id };
|
|
<a name="line34">34 |</a>
|
|
<a name="line35">35 |</a> /** ************************************************************************ **/
|
|
<a name="line36">36 |</a> /** HEADERS **/
|
|
<a name="line37">37 |</a> /** ************************************************************************ **/
|
|
<a name="line38">38 |</a>
|
|
<a name="line39">39 |</a> #include "modules_def.h"
|
|
<a name="line40">40 |</a> #include "getopt.h"
|
|
<a name="line41">41 |</a>
|
|
<a name="line42">42 |</a> /** ************************************************************************ **/
|
|
<a name="line43">43 |</a> /** LOCAL DATATYPES **/
|
|
<a name="line44">44 |</a> /** ************************************************************************ **/
|
|
<a name="line45">45 |</a>
|
|
<a name="line46">46 |</a> /** not applicable **/
|
|
<a name="line47">47 |</a>
|
|
<a name="line48">48 |</a> /** ************************************************************************ **/
|
|
<a name="line49">49 |</a> /** CONSTANTS **/
|
|
<a name="line50">50 |</a> /** ************************************************************************ **/
|
|
<a name="line51">51 |</a>
|
|
<a name="line52">52 |</a> /** not applicable **/
|
|
<a name="line53">53 |</a>
|
|
<a name="line54">54 |</a> /** ************************************************************************ **/
|
|
<a name="line55">55 |</a> /** MACROS **/
|
|
<a name="line56">56 |</a> /** ************************************************************************ **/
|
|
<a name="line57">57 |</a>
|
|
<a name="line58">58 |</a> /** not applicable **/
|
|
<a name="line59">59 |</a>
|
|
<a name="line60">60 |</a> /** ************************************************************************ **/
|
|
<a name="line61">61 |</a> /** GLOBAL DATA **/
|
|
<a name="line62">62 |</a> /** ************************************************************************ **/
|
|
<a name="line63">63 |</a>
|
|
<a name="line64">64 |</a> char *g_current_module = NULL, /** The module which is handled by **/
|
|
<a name="line65">65 |</a> /** the current command **/
|
|
<a name="line66">66 |</a> *g_specified_module = NULL, /** The module that was specified **/
|
|
<a name="line67">67 |</a> /** on the command line **/
|
|
<a name="line68">68 |</a> *g_module_path = NULL, /** The path to the module **/
|
|
<a name="line69">69 |</a> *shell_name, /** Name of the shell **/
|
|
<a name="line70">70 |</a> /** (first parameter to modulcmd) **/
|
|
<a name="line71">71 |</a> *shell_derelict, /** Shell family (sh, csh, etc) **/
|
|
<a name="line72">72 |</a> *shell_init, /** Shell init script name **/
|
|
<a name="line73">73 |</a> *shell_cmd_separator; /** Shell command separator char **/
|
|
<a name="line74">74 |</a> int g_flags = 0, /** Control what to do at the moment **/
|
|
<a name="line75">75 |</a> /** The posible values are defined in**/
|
|
<a name="line76">76 |</a> /** module_def.h **/
|
|
<a name="line77">77 |</a> append_flag = 0; /** only used by the 'use' command **/
|
|
<a name="line78">78 |</a>
|
|
<a name="line79">79 |</a> char _default[] = "default"; /** id string for default versions **/
|
|
<a name="line80">80 |</a>
|
|
<a name="line81">81 |</a> /**
|
|
<a name="line82">82 |</a> ** Name of the rc files
|
|
<a name="line83">83 |</a> ** PREFIX points to the location where modules is going to be installed.
|
|
<a name="line84">84 |</a> ** It comes from the Makefile
|
|
<a name="line85">85 |</a> **/
|
|
<a name="line86">86 |</a>
|
|
<a name="line87">87 |</a> char *instpath = PREFIX,
|
|
<a name="line88">88 |</a> *rc_file = RCFILE,
|
|
<a name="line89">89 |</a> *modulerc_file = MODULERCFILE,
|
|
<a name="line90">90 |</a> *version_file = VERSIONFILE;
|
|
<a name="line91">91 |</a>
|
|
<a name="line92">92 |</a> /**
|
|
<a name="line93">93 |</a> ** pointers for regular expression evaluations
|
|
<a name="line94">94 |</a> **/
|
|
<a name="line95">95 |</a> char
|
|
<a name="line96">96 |</a> *addRE = "^(add|load)", /** 'module add <file>' **/
|
|
<a name="line97">97 |</a> *rmRE = "^(rm|del|era|remov|unload)", /** 'module unload <file>' **/
|
|
<a name="line98">98 |</a> *swRE = "^sw", /** 'module switch <file>' **/
|
|
<a name="line99">99 |</a> *dispRE = "^(disp|show)", /** 'module display <file>' **/
|
|
<a name="line100">100 |</a> *listRE = "^li", /** 'module list <file>' **/
|
|
<a name="line101">101 |</a> *availRE = "^av", /** 'module avail <file>' **/
|
|
<a name="line102">102 |</a> *helpRE = "^(help|\\?)", /** 'module help <file>' **/
|
|
<a name="line103">103 |</a> *initRE = "^init", /** 'module init' **/
|
|
<a name="line104">104 |</a> *useRE = "^use", /** 'module use <file>' **/
|
|
<a name="line105">105 |</a> *unuseRE = "^unuse", /** 'module unuse <file>' **/
|
|
<a name="line106">106 |</a> *updateRE = "^update", /** 'module update' **/
|
|
<a name="line107">107 |</a> *purgeRE = "^purge", /** 'module purge' **/
|
|
<a name="line108">108 |</a> *clearRE = "^clear", /** 'module clear' **/
|
|
<a name="line109">109 |</a> *whatisRE = "^wh", /** 'module whatis' **/
|
|
<a name="line110">110 |</a> *aproposRE = "^(apr|key)", /** 'module apropos' **/
|
|
<a name="line111">111 |</a> *refreshRE = "^refr"; /** 'module refresh' **/
|
|
<a name="line112">112 |</a>
|
|
<a name="line113">113 |</a> /**
|
|
<a name="line114">114 |</a> ** Hash-Tables for all changes to the environment.
|
|
<a name="line115">115 |</a>
|
|
<a name="line116">116 |</a> /**
|
|
<a name="line117">117 |</a> ** Hash-Tables for all changes to the environment.
|
|
<a name="line118">118 |</a> ** ??? What do we save here, the old or the new setup ???
|
|
<a name="line119">119 |</a> **/
|
|
<a name="line120">120 |</a>
|
|
<a name="line121">121 |</a> Tcl_HashTable *setenvHashTable,
|
|
<a name="line122">122 |</a> *unsetenvHashTable,
|
|
<a name="line123">123 |</a> *aliasSetHashTable,
|
|
<a name="line124">124 |</a> *aliasUnsetHashTable,
|
|
<a name="line125">125 |</a> *markVariableHashTable,
|
|
<a name="line126">126 |</a> *markAliasHashTable;
|
|
<a name="line127">127 |</a>
|
|
<a name="line128">128 |</a> /**
|
|
<a name="line129">129 |</a> ** A buffer for reading a single line
|
|
<a name="line130">130 |</a> **/
|
|
<a name="line131">131 |</a>
|
|
<a name="line132">132 |</a> char *line = NULL;
|
|
<a name="line133">133 |</a>
|
|
<a name="line134">134 |</a> /**
|
|
<a name="line135">135 |</a> ** Flags influenced by the command line switches
|
|
<a name="line136">136 |</a> **/
|
|
<a name="line137">137 |</a>
|
|
<a name="line138">138 |</a> int sw_force = 0,
|
|
<a name="line139">139 |</a> sw_detach = 0,
|
|
<a name="line140">140 |</a> sw_format = 0,
|
|
<a name="line141">141 |</a> sw_verbose = 0,
|
|
<a name="line142">142 |</a> sw_create = 0,
|
|
<a name="line143">143 |</a> sw_userlvl = UL_ADVANCED,
|
|
<a name="line144">144 |</a> sw_icase = 0;
|
|
<a name="line145">145 |</a>
|
|
<a name="line146">146 |</a> /** ************************************************************************ **/
|
|
<a name="line147">147 |</a> /** LOCAL DATA **/
|
|
<a name="line148">148 |</a> /** ************************************************************************ **/
|
|
<a name="line149">149 |</a>
|
|
<a name="line150">150 |</a> static char module_name[] = "main.c"; /** File name of this module **/
|
|
<a name="line151">151 |</a>
|
|
<a name="line152">152 |</a> #if WITH_DEBUGGING
|
|
<a name="line153">153 |</a> static char _proc_main[] = "main";
|
|
<a name="line154">154 |</a> #endif
|
|
<a name="line155">155 |</a> #if WITH_DEBUGGING_INIT
|
|
<a name="line156">156 |</a> static char _proc_Check_Switches[] = "Check_Switches";
|
|
<a name="line157">157 |</a> static char _proc_Tcl_AppInit[] = "Tcl_AppInit";
|
|
<a name="line158">158 |</a> #endif
|
|
<a name="line159">159 |</a>
|
|
<a name="line160">160 |</a> /** ************************************************************************ **/
|
|
<a name="line161">161 |</a> /** PROTOTYPES **/
|
|
<a name="line162">162 |</a> /** ************************************************************************ **/
|
|
<a name="line163">163 |</a>
|
|
<a name="line164">164 |</a> static int Check_Switches( int *argc, char *argv[]);
|
|
<a name="line165">165 |</a> static void version (FILE *output);
|
|
<a name="line166">166 |</a>
|
|
<a name="line167">167 |</a> /*++++
|
|
<a name="line168">168 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line169">169 |</a> ** **
|
|
<a name="line170">170 |</a> ** Function: main **
|
|
<a name="line171">171 |</a> ** **
|
|
<a name="line172">172 |</a> ** Description: Main program **
|
|
<a name="line173">173 |</a> ** **
|
|
<a name="line174">174 |</a> ** First Edition: 1991/10/23 **
|
|
<a name="line175">175 |</a> ** **
|
|
<a name="line176">176 |</a> ** Parameters: int argc Number of parameters **
|
|
<a name="line177">177 |</a> ** char *argv[] Command line arguments **
|
|
<a name="line178">178 |</a> ** char *environ[] Pointer to the process' en- **
|
|
<a name="line179">179 |</a> ** vironment. **
|
|
<a name="line180">180 |</a> ** Result: int 1 Usage information printed **
|
|
<a name="line181">181 |</a> ** TCL_OK Successful completion **
|
|
<a name="line182">182 |</a> ** other Return value of the module **
|
|
<a name="line183">183 |</a> ** subcomand **
|
|
<a name="line184">184 |</a> ** **
|
|
<a name="line185">185 |</a> ** Attached Globals: *Ptr by InitializeTcl **
|
|
<a name="line186">186 |</a> ** *HashTable by InitializeTcl **
|
|
<a name="line187">187 |</a> ** **
|
|
<a name="line188">188 |</a> ** ************************************************************************ **
|
|
<a name="line189">189 |</a> ++++*/
|
|
<a name="line190">190 |</a>
|
|
<a name="line191">191 |</a> int main( int argc, char *argv[], char *environ[]) {
|
|
<a name="line192">192 |</a>
|
|
<a name="line193">193 |</a> Tcl_Interp *interp;
|
|
<a name="line194">194 |</a> int return_val = 0;
|
|
<a name="line195">195 |</a> char *rc_name;
|
|
<a name="line196">196 |</a> char *rc_path;
|
|
<a name="line197">197 |</a>
|
|
<a name="line198">198 |</a> #if WITH_DEBUGGING
|
|
<a name="line199">199 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_main, NULL);
|
|
<a name="line200">200 |</a> #endif
|
|
<a name="line201">201 |</a> /**
|
|
<a name="line202">202 |</a> ** check if first argument is --version or -V then output the
|
|
<a name="line203">203 |</a> ** version to stdout. This is a special circumstance handled
|
|
<a name="line204">204 |</a> ** by the regular options.
|
|
<a name="line205">205 |</a> **/
|
|
<a name="line206">206 |</a> if (argc > 1 && *argv[1] == '-') {
|
|
<a name="line207">207 |</a> if (!strcmp("-V", argv[1]) || !strcmp("--version", argv[1])) {
|
|
<a name="line208">208 |</a> version(stdout);
|
|
<a name="line209">209 |</a> return 0;
|
|
<a name="line210">210 |</a> }
|
|
<a name="line211">211 |</a> }
|
|
<a name="line212">212 |</a> /**
|
|
<a name="line213">213 |</a> ** Initialization.
|
|
<a name="line214">214 |</a> ** Check the command line syntax. There will be no return from the
|
|
<a name="line215">215 |</a> ** initialization function in case of invalid command line arguments.
|
|
<a name="line216">216 |</a> **/
|
|
<a name="line217">217 |</a>
|
|
<a name="line218">218 |</a> if( TCL_OK != Initialize_Tcl( &interp, argc, argv, environ))
|
|
<a name="line219">219 |</a> goto unwind0;
|
|
<a name="line220">220 |</a>
|
|
<a name="line221">221 |</a> if( TCL_OK != Setup_Environment( interp))
|
|
<a name="line222">222 |</a> goto unwind0;
|
|
<a name="line223">223 |</a>
|
|
<a name="line224">224 |</a> /**
|
|
<a name="line225">225 |</a> ** Check for command line switches
|
|
<a name="line226">226 |</a> **/
|
|
<a name="line227">227 |</a>
|
|
<a name="line228">228 |</a> if( TCL_OK != Check_Switches( &argc, argv))
|
|
<a name="line229">229 |</a> goto unwind0;
|
|
<a name="line230">230 |</a>
|
|
<a name="line231">231 |</a> /**
|
|
<a name="line232">232 |</a> ** Figure out, which global RC file to use. This depends on the environ-
|
|
<a name="line233">233 |</a> ** ment variable 'MODULERCFILE', which can be set to one of the following:
|
|
<a name="line234">234 |</a> **
|
|
<a name="line235">235 |</a> ** <filename> --> PREFIX/etc/<filename>
|
|
<a name="line236">236 |</a> ** <dir>/ --> <dir>/RC_FILE
|
|
<a name="line237">237 |</a> ** <dir>/<file> --> <dir>/<file>
|
|
<a name="line238">238 |</a> ** Use xgetenv to expand 1 level of env.vars.
|
|
<a name="line239">239 |</a> **/
|
|
<a name="line240">240 |</a>
|
|
<a name="line241">241 |</a> if((rc_name = xgetenv( "MODULERCFILE"))) {
|
|
<a name="line242">242 |</a> /* found something in MODULERCFILE */
|
|
<a name="line243">243 |</a> if((char *) NULL == (rc_path = stringer(NULL,0,rc_name,NULL))) {
|
|
<a name="line244">244 |</a> if( OK != ErrorLogger( ERR_STRING, LOC, NULL))
|
|
<a name="line245">245 |</a> goto unwind1;
|
|
<a name="line246">246 |</a> else
|
|
<a name="line247">247 |</a> null_free((void *) &rc_name);
|
|
<a name="line248">248 |</a> } else {
|
|
<a name="line249">249 |</a> null_free((void *) &rc_name);
|
|
<a name="line250">250 |</a> if((char *) NULL == (rc_name = strrchr( rc_path, '/'))) {
|
|
<a name="line251">251 |</a> rc_name = rc_path;
|
|
<a name="line252">252 |</a> rc_path = instpath;
|
|
<a name="line253">253 |</a> } else
|
|
<a name="line254">254 |</a> *rc_name++ = '\0';
|
|
<a name="line255">255 |</a> if( !*rc_name) {
|
|
<a name="line256">256 |</a> rc_name = rc_file;
|
|
<a name="line257">257 |</a> }
|
|
<a name="line258">258 |</a> }
|
|
<a name="line259">259 |</a> } else {
|
|
<a name="line260">260 |</a> rc_path = instpath;
|
|
<a name="line261">261 |</a> null_free((void *) &rc_name);
|
|
<a name="line262">262 |</a> rc_name = rc_file;
|
|
<a name="line263">263 |</a> }
|
|
<a name="line264">264 |</a>
|
|
<a name="line265">265 |</a> /**
|
|
<a name="line266">266 |</a> ** Finally we have to change PREFIX -> PREFIX/etc
|
|
<a name="line267">267 |</a> **/
|
|
<a name="line268">268 |</a>
|
|
<a name="line269">269 |</a> if( rc_path == instpath) {
|
|
<a name="line270">270 |</a> if((char *) NULL == (rc_path = stringer(NULL,0, instpath,"/etc",NULL))){
|
|
<a name="line271">271 |</a> if( OK != ErrorLogger( ERR_ALLOC, LOC, NULL))
|
|
<a name="line272">272 |</a> goto unwind1;
|
|
<a name="line273">273 |</a> else
|
|
<a name="line274">274 |</a> rc_path = NULL;
|
|
<a name="line275">275 |</a>
|
|
<a name="line276">276 |</a> }
|
|
<a name="line277">277 |</a> }
|
|
<a name="line278">278 |</a>
|
|
<a name="line279">279 |</a> /**
|
|
<a name="line280">280 |</a> ** Source the global and the user defined RC file
|
|
<a name="line281">281 |</a> **/
|
|
<a name="line282">282 |</a>
|
|
<a name="line283">283 |</a> g_current_module = (char *) NULL;
|
|
<a name="line284">284 |</a>
|
|
<a name="line285">285 |</a> if( TCL_ERROR == SourceRC( interp, rc_path, rc_name) ||
|
|
<a name="line286">286 |</a> TCL_ERROR == SourceRC( interp, getenv( "HOME"), modulerc_file))
|
|
<a name="line287">287 |</a> exit( 1);
|
|
<a name="line288">288 |</a>
|
|
<a name="line289">289 |</a> if( rc_path)
|
|
<a name="line290">290 |</a> null_free((void *) &rc_path);
|
|
<a name="line291">291 |</a>
|
|
<a name="line292">292 |</a> /**
|
|
<a name="line293">293 |</a> ** Invocation of the module command as specified in the command line
|
|
<a name="line294">294 |</a> **/
|
|
<a name="line295">295 |</a>
|
|
<a name="line296">296 |</a> g_flags = 0;
|
|
<a name="line297">297 |</a> return_val = cmdModule((ClientData) 0,interp,(argc-1),
|
|
<a name="line298">298 |</a> (CONST84 char **) (argv + 1));
|
|
<a name="line299">299 |</a>
|
|
<a name="line300">300 |</a> /**
|
|
<a name="line301">301 |</a> ** If we were doing some operation that has already flushed its output,
|
|
<a name="line302">302 |</a> ** then we don't need to re-flush the output here.
|
|
<a name="line303">303 |</a> **
|
|
<a name="line304">304 |</a> ** Also, if we've had an error here, then the whole modulecmd failed
|
|
<a name="line305">305 |</a> ** and not just the values for a single modulefile. So, we'll pass in
|
|
<a name="line306">306 |</a> ** a NULL here to indicate that any error message should say that
|
|
<a name="line307">307 |</a> ** absolutely NO changes were made to the environment.
|
|
<a name="line308">308 |</a> **/
|
|
<a name="line309">309 |</a>
|
|
<a name="line310">310 |</a> if( TCL_OK == return_val) {
|
|
<a name="line311">311 |</a> Output_Modulefile_Changes( interp);
|
|
<a name="line312">312 |</a> #ifdef HAS_X11LIBS
|
|
<a name="line313">313 |</a> xresourceFinish( 1);
|
|
<a name="line314">314 |</a> #endif
|
|
<a name="line315">315 |</a> } else {
|
|
<a name="line316">316 |</a> Unwind_Modulefile_Changes( interp, NULL);
|
|
<a name="line317">317 |</a> #ifdef HAS_X11LIBS
|
|
<a name="line318">318 |</a> xresourceFinish( 0);
|
|
<a name="line319">319 |</a> #endif
|
|
<a name="line320">320 |</a> }
|
|
<a name="line321">321 |</a>
|
|
<a name="line322">322 |</a> /**
|
|
<a name="line323">323 |</a> ** Finally clean up. Delete the required hash tables and conditionally
|
|
<a name="line324">324 |</a> ** allocated areas.
|
|
<a name="line325">325 |</a> **/
|
|
<a name="line326">326 |</a>
|
|
<a name="line327">327 |</a> Delete_Global_Hash_Tables();
|
|
<a name="line328">328 |</a>
|
|
<a name="line329">329 |</a> if( line)
|
|
<a name="line330">330 |</a> null_free((void *) &line);
|
|
<a name="line331">331 |</a> if( error_line)
|
|
<a name="line332">332 |</a> null_free((void *) &error_line);
|
|
<a name="line333">333 |</a>
|
|
<a name="line334">334 |</a> /**
|
|
<a name="line335">335 |</a> ** This return value may be evaluated by the calling shell
|
|
<a name="line336">336 |</a> **/
|
|
<a name="line337">337 |</a> #if WITH_DEBUGGING
|
|
<a name="line338">338 |</a> ErrorLogger( NO_ERR_END, LOC, _proc_main, NULL);
|
|
<a name="line339">339 |</a> #endif
|
|
<a name="line340">340 |</a>
|
|
<a name="line341">341 |</a> return ( return_val);
|
|
<a name="line342">342 |</a>
|
|
<a name="line343">343 |</a> unwind2:
|
|
<a name="line344">344 |</a> null_free((void *) &rc_path);
|
|
<a name="line345">345 |</a> unwind1:
|
|
<a name="line346">346 |</a> null_free((void *) &rc_name);
|
|
<a name="line347">347 |</a> unwind0:
|
|
<a name="line348">348 |</a>
|
|
<a name="line349">349 |</a> /* and error occurred of some type */
|
|
<a name="line350">350 |</a> return( 1);
|
|
<a name="line351">351 |</a>
|
|
<a name="line352">352 |</a> } /** End of 'main' **/
|
|
<a name="line353">353 |</a>
|
|
<a name="line354">354 |</a> /*++++
|
|
<a name="line355">355 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line356">356 |</a> ** **
|
|
<a name="line357">357 |</a> ** Function: module_usage **
|
|
<a name="line358">358 |</a> ** **
|
|
<a name="line359">359 |</a> ** Description: Lists out the helpful usage info that we've all come **
|
|
<a name="line360">360 |</a> ** to expect from unix commands. **
|
|
<a name="line361">361 |</a> ** **
|
|
<a name="line362">362 |</a> ** First Edition: 2002/10/13 **
|
|
<a name="line363">363 |</a> ** **
|
|
<a name="line364">364 |</a> ** Parameters: FILE *output Where the output goes **
|
|
<a name="line365">365 |</a> ** **
|
|
<a name="line366">366 |</a> ** Result: void No return values **
|
|
<a name="line367">367 |</a> ** **
|
|
<a name="line368">368 |</a> ** Attached Globals: **
|
|
<a name="line369">369 |</a> ** version_string Current module version **
|
|
<a name="line370">370 |</a> ** date_string Current module date **
|
|
<a name="line371">371 |</a> ** **
|
|
<a name="line372">372 |</a> ** ************************************************************************ **
|
|
<a name="line373">373 |</a> ++++*/
|
|
<a name="line374">374 |</a>
|
|
<a name="line375">375 |</a> void module_usage(FILE *output)
|
|
<a name="line376">376 |</a> {
|
|
<a name="line377">377 |</a> /**
|
|
<a name="line378">378 |</a> ** General help wanted.
|
|
<a name="line379">379 |</a> **/
|
|
<a name="line380">380 |</a>
|
|
<a name="line381">381 |</a> #if WITH_DEBUGGING_MODULECMD
|
|
<a name="line382">382 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_ModuleCmd_Help, NULL);
|
|
<a name="line383">383 |</a> #endif
|
|
<a name="line384">384 |</a>
|
|
<a name="line385">385 |</a> fprintf(output,
|
|
<a name="line386">386 |</a> "\n Modules Release %s %s (Copyright GNU GPL v2 1991):\n\n",
|
|
<a name="line387">387 |</a> version_string,date_string);
|
|
<a name="line388">388 |</a>
|
|
<a name="line389">389 |</a> fprintf(output,
|
|
<a name="line390">390 |</a> " Usage: module [ switches ] [ subcommand ] [subcommand-args ]\n\n"
|
|
<a name="line391">391 |</a> "Switches:\n"
|
|
<a name="line392">392 |</a> " -H|--help this usage info\n"
|
|
<a name="line393">393 |</a> " -V|--version modules version & configuration options\n"
|
|
<a name="line394">394 |</a> " -f|--force force active dependency resolution\n"
|
|
<a name="line395">395 |</a> " -t|--terse terse format avail and list format\n"
|
|
<a name="line396">396 |</a> " -l|--long long format avail and list format\n"
|
|
<a name="line397">397 |</a> " -h|--human readable format avail and list format\n"
|
|
<a name="line398">398 |</a> " -v|--verbose enable verbose messages\n"
|
|
<a name="line399">399 |</a> " -s|--silent disable verbose messages\n"
|
|
<a name="line400">400 |</a> " -c|--create create caches for avail and apropos\n"
|
|
<a name="line401">401 |</a> " -i|--icase case insensitive\n"
|
|
<a name="line402">402 |</a> " -u|--userlvl <lvl> set user level to (nov[ice],exp[ert],adv[anced])\n"
|
|
<a name="line403">403 |</a> " Available SubCommands and Args:\n"
|
|
<a name="line404">404 |</a> " + add|load modulefile [modulefile ...]\n"
|
|
<a name="line405">405 |</a> " + rm|unload modulefile [modulefile ...]\n"
|
|
<a name="line406">406 |</a> " + switch|swap [modulefile1] modulefile2\n"
|
|
<a name="line407">407 |</a> " + display|show modulefile [modulefile ...]\n"
|
|
<a name="line408">408 |</a> " + avail [modulefile [modulefile ...]]\n"
|
|
<a name="line409">409 |</a> " + use [-a|--append] dir [dir ...]\n"
|
|
<a name="line410">410 |</a> " + unuse dir [dir ...]\n"
|
|
<a name="line411">411 |</a> #ifdef BEGINENV
|
|
<a name="line412">412 |</a> " + update\n"
|
|
<a name="line413">413 |</a> #endif
|
|
<a name="line414">414 |</a> " + refresh\n"
|
|
<a name="line415">415 |</a> " + purge\n"
|
|
<a name="line416">416 |</a> " + list\n"
|
|
<a name="line417">417 |</a> " + clear\n"
|
|
<a name="line418">418 |</a> " + help [modulefile [modulefile ...]]\n"
|
|
<a name="line419">419 |</a> " + whatis [modulefile [modulefile ...]]\n"
|
|
<a name="line420">420 |</a> " + apropos|keyword string\n"
|
|
<a name="line421">421 |</a> " + initadd modulefile [modulefile ...]\n"
|
|
<a name="line422">422 |</a> " + initprepend modulefile [modulefile ...]\n"
|
|
<a name="line423">423 |</a> " + initrm modulefile [modulefile ...]\n"
|
|
<a name="line424">424 |</a> " + initswitch modulefile1 modulefile2\n"
|
|
<a name="line425">425 |</a> " + initlist\n"
|
|
<a name="line426">426 |</a> " + initclear\n\n");
|
|
<a name="line427">427 |</a>
|
|
<a name="line428">428 |</a> } /** End of 'module_usage' **/
|
|
<a name="line429">429 |</a>
|
|
<a name="line430">430 |</a> /*++++
|
|
<a name="line431">431 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line432">432 |</a> ** **
|
|
<a name="line433">433 |</a> ** Function: Tcl_AppInit **
|
|
<a name="line434">434 |</a> ** **
|
|
<a name="line435">435 |</a> ** Description: This is needed if you use shared TCL libraries. **
|
|
<a name="line436">436 |</a> ** It won't be called, but the linker complains if it **
|
|
<a name="line437">437 |</a> ** doesn't exist. **
|
|
<a name="line438">438 |</a> ** **
|
|
<a name="line439">439 |</a> ** First Edition: 1991/10/23 **
|
|
<a name="line440">440 |</a> ** **
|
|
<a name="line441">441 |</a> ** Parameters: Tcl_Interp *interp Tcl interpreter to **
|
|
<a name="line442">442 |</a> ** be initialized **
|
|
<a name="line443">443 |</a> ** Result: int TCL_OK Initialization succ. **
|
|
<a name="line444">444 |</a> ** Attached Globals: - **
|
|
<a name="line445">445 |</a> ** **
|
|
<a name="line446">446 |</a> ** ************************************************************************ **
|
|
<a name="line447">447 |</a> ++++*/
|
|
<a name="line448">448 |</a>
|
|
<a name="line449">449 |</a> int Tcl_AppInit(Tcl_Interp *interp)
|
|
<a name="line450">450 |</a> {
|
|
<a name="line451">451 |</a>
|
|
<a name="line452">452 |</a> #if WITH_DEBUGGING_INIT
|
|
<a name="line453">453 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_Tcl_AppInit, NULL);
|
|
<a name="line454">454 |</a> #endif
|
|
<a name="line455">455 |</a>
|
|
<a name="line456">456 |</a> return( TCL_OK);
|
|
<a name="line457">457 |</a>
|
|
<a name="line458">458 |</a> } /** End of 'Tcl_AppInit' **/
|
|
<a name="line459">459 |</a>
|
|
<a name="line460">460 |</a> /*++++
|
|
<a name="line461">461 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line462">462 |</a> ** **
|
|
<a name="line463">463 |</a> ** Function: Check_Switches **
|
|
<a name="line464">464 |</a> ** **
|
|
<a name="line465">465 |</a> ** Description: Check for command line switches and set internal **
|
|
<a name="line466">466 |</a> ** control variable according to them. Command line **
|
|
<a name="line467">467 |</a> ** switches are defined to appear between the shell and **
|
|
<a name="line468">468 |</a> ** the module command. They begin on a dash and may **
|
|
<a name="line469">469 |</a> ** appear in long and short format. **
|
|
<a name="line470">470 |</a> ** **
|
|
<a name="line471">471 |</a> ** The following switches are defined: **
|
|
<a name="line472">472 |</a> ** **
|
|
<a name="line473">473 |</a> ** --force, -f Force prerequired actions **
|
|
<a name="line474">474 |</a> ** --terse, -t Terse, parseable messages **
|
|
<a name="line475">475 |</a> ** --human, -h Human readable form **
|
|
<a name="line476">476 |</a> ** --long, -l Long messages **
|
|
<a name="line477">477 |</a> ** --verbose, -v Verbose mode on **
|
|
<a name="line478">478 |</a> ** --silent, -s Verbose mode off **
|
|
<a name="line479">479 |</a> ** --create, -c Create a cache while execu- **
|
|
<a name="line480">480 |</a> ** ting the command **
|
|
<a name="line481">481 |</a> ** --userlvl, -u Change the user level **
|
|
<a name="line482">482 |</a> ** --icase, -i Ignore case of modulefile **
|
|
<a name="line483">483 |</a> ** names **
|
|
<a name="line484">484 |</a> ** --help, -H Helpful usage info **
|
|
<a name="line485">485 |</a> ** --version, -V Report version only **
|
|
<a name="line486">486 |</a> ** **
|
|
<a name="line487">487 |</a> ** First Edition: 1995/12/20 **
|
|
<a name="line488">488 |</a> ** **
|
|
<a name="line489">489 |</a> ** Parameters: int *argc Number of parameters **
|
|
<a name="line490">490 |</a> ** char *argv[] Command line arguments **
|
|
<a name="line491">491 |</a> ** **
|
|
<a name="line492">492 |</a> ** Result: int TCL_OK Successful completion **
|
|
<a name="line493">493 |</a> ** TCL_ERROR Unknown switch found **
|
|
<a name="line494">494 |</a> ** *argc, *argv All switches are removed **
|
|
<a name="line495">495 |</a> ** from the argv vector **
|
|
<a name="line496">496 |</a> ** **
|
|
<a name="line497">497 |</a> ** Attached Globals: sw_force --force, -f **
|
|
<a name="line498">498 |</a> ** sw_format -t, -l, -h, -p **
|
|
<a name="line499">499 |</a> ** sw_verbose --verbose, -v, --silent, -s **
|
|
<a name="line500">500 |</a> ** sw_create --create, -c **
|
|
<a name="line501">501 |</a> ** sw_userlvl --userlvl, -u **
|
|
<a name="line502">502 |</a> ** sw_icase --icase, -i **
|
|
<a name="line503">503 |</a> ** **
|
|
<a name="line504">504 |</a> ** ************************************************************************ **
|
|
<a name="line505">505 |</a> ++++*/
|
|
<a name="line506">506 |</a>
|
|
<a name="line507">507 |</a> static int Check_Switches( int *argc, char *argv[])
|
|
<a name="line508">508 |</a> {
|
|
<a name="line509">509 |</a>
|
|
<a name="line510">510 |</a> int c;
|
|
<a name="line511">511 |</a>
|
|
<a name="line512">512 |</a> /**
|
|
<a name="line513">513 |</a> ** These are the options we do provide
|
|
<a name="line514">514 |</a> **/
|
|
<a name="line515">515 |</a>
|
|
<a name="line516">516 |</a> const struct option longopts[] = {
|
|
<a name="line517">517 |</a> { "force", no_argument, NULL, 'f' },
|
|
<a name="line518">518 |</a> { "terse", no_argument, NULL, 't' },
|
|
<a name="line519">519 |</a> { "long", no_argument, NULL, 'l' },
|
|
<a name="line520">520 |</a> { "human", no_argument, NULL, 'h' },
|
|
<a name="line521">521 |</a> { "parseable", no_argument, NULL, 'p' },
|
|
<a name="line522">522 |</a> { "parse", no_argument, NULL, 'p' },
|
|
<a name="line523">523 |</a> { "verbose", no_argument, NULL, 'v' },
|
|
<a name="line524">524 |</a> { "silent", no_argument, NULL, 's' },
|
|
<a name="line525">525 |</a> { "create", no_argument, NULL, 'c' },
|
|
<a name="line526">526 |</a> { "icase", no_argument, NULL, 'i' },
|
|
<a name="line527">527 |</a> { "userlvl", required_argument, NULL, 'u'},
|
|
<a name="line528">528 |</a> { "append", no_argument, NULL, 'a' },
|
|
<a name="line529">529 |</a> { "help", no_argument, NULL, 'H' },
|
|
<a name="line530">530 |</a> { "version", no_argument, NULL, 'V' },
|
|
<a name="line531">531 |</a> { NULL, no_argument, NULL, 0 }
|
|
<a name="line532">532 |</a> };
|
|
<a name="line533">533 |</a>
|
|
<a name="line534">534 |</a> #if WITH_DEBUGGING_INIT
|
|
<a name="line535">535 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_Check_Switches, NULL);
|
|
<a name="line536">536 |</a> #endif
|
|
<a name="line537">537 |</a>
|
|
<a name="line538">538 |</a> /**
|
|
<a name="line539">539 |</a> ** Scan the command line for options defined in the longopt table.
|
|
<a name="line540">540 |</a> ** Skip the very first argument, which is the shell to be used
|
|
<a name="line541">541 |</a> **/
|
|
<a name="line542">542 |</a>
|
|
<a name="line543">543 |</a> if( *argc > 1) {
|
|
<a name="line544">544 |</a>
|
|
<a name="line545">545 |</a> while( EOF != (c = getopt_long( *argc-1, &argv[1], "hpftlvsciu:aHV",
|
|
<a name="line546">546 |</a> longopts, NULL))) {
|
|
<a name="line547">547 |</a>
|
|
<a name="line548">548 |</a> switch( c) {
|
|
<a name="line549">549 |</a>
|
|
<a name="line550">550 |</a> /**
|
|
<a name="line551">551 |</a> ** Force
|
|
<a name="line552">552 |</a> **/
|
|
<a name="line553">553 |</a>
|
|
<a name="line554">554 |</a> case 'f': /* force */
|
|
<a name="line555">555 |</a> sw_force = 1;
|
|
<a name="line556">556 |</a> break;
|
|
<a name="line557">557 |</a>
|
|
<a name="line558">558 |</a> /**
|
|
<a name="line559">559 |</a> ** Format of the messages
|
|
<a name="line560">560 |</a> **/
|
|
<a name="line561">561 |</a>
|
|
<a name="line562">562 |</a> case 't': /* terse */
|
|
<a name="line563">563 |</a> sw_format |= (SW_SET | SW_TERSE);
|
|
<a name="line564">564 |</a> sw_format &= ~ SW_LONG;
|
|
<a name="line565">565 |</a> break;
|
|
<a name="line566">566 |</a>
|
|
<a name="line567">567 |</a> case 'l': /* long */
|
|
<a name="line568">568 |</a> sw_format |= (SW_SET | SW_LONG);
|
|
<a name="line569">569 |</a> sw_format &= ~ SW_TERSE;
|
|
<a name="line570">570 |</a> break;
|
|
<a name="line571">571 |</a>
|
|
<a name="line572">572 |</a> case 'h': /* human */
|
|
<a name="line573">573 |</a> sw_format |= (SW_SET | SW_HUMAN);
|
|
<a name="line574">574 |</a> sw_format &= ~ SW_PARSE;
|
|
<a name="line575">575 |</a> break;
|
|
<a name="line576">576 |</a>
|
|
<a name="line577">577 |</a> case 'p': /* parseable */
|
|
<a name="line578">578 |</a> sw_format |= (SW_SET | SW_PARSE);
|
|
<a name="line579">579 |</a> sw_format &= ~ SW_HUMAN;
|
|
<a name="line580">580 |</a> break;
|
|
<a name="line581">581 |</a>
|
|
<a name="line582">582 |</a> /**
|
|
<a name="line583">583 |</a> ** Verbosity
|
|
<a name="line584">584 |</a> **/
|
|
<a name="line585">585 |</a>
|
|
<a name="line586">586 |</a> case 'v': /* verbose */
|
|
<a name="line587">587 |</a> sw_verbose = 1;
|
|
<a name="line588">588 |</a> break;
|
|
<a name="line589">589 |</a>
|
|
<a name="line590">590 |</a> case 's': /* silent */
|
|
<a name="line591">591 |</a> sw_detach = 1;
|
|
<a name="line592">592 |</a> break;
|
|
<a name="line593">593 |</a>
|
|
<a name="line594">594 |</a> /**
|
|
<a name="line595">595 |</a> ** Caching control
|
|
<a name="line596">596 |</a> **/
|
|
<a name="line597">597 |</a>
|
|
<a name="line598">598 |</a> case 'c': /* create */
|
|
<a name="line599">599 |</a> sw_create = 1;
|
|
<a name="line600">600 |</a> break;
|
|
<a name="line601">601 |</a>
|
|
<a name="line602">602 |</a> /**
|
|
<a name="line603">603 |</a> ** Locating
|
|
<a name="line604">604 |</a> **/
|
|
<a name="line605">605 |</a>
|
|
<a name="line606">606 |</a> case 'i': /* icase */
|
|
<a name="line607">607 |</a> sw_icase = 1;
|
|
<a name="line608">608 |</a> break;
|
|
<a name="line609">609 |</a>
|
|
<a name="line610">610 |</a> /**
|
|
<a name="line611">611 |</a> ** The user level comes as a string argument to the -u option
|
|
<a name="line612">612 |</a> **/
|
|
<a name="line613">613 |</a>
|
|
<a name="line614">614 |</a> case 'u': /* userlvl */
|
|
<a name="line615">615 |</a> cmdModuleUser_sub( optarg);
|
|
<a name="line616">616 |</a> break;
|
|
<a name="line617">617 |</a>
|
|
<a name="line618">618 |</a> /**
|
|
<a name="line619">619 |</a> ** a special purpose flag for 'use' only
|
|
<a name="line620">620 |</a> **/
|
|
<a name="line621">621 |</a> case 'a': /* --append */
|
|
<a name="line622">622 |</a> append_flag = 1;
|
|
<a name="line623">623 |</a> break;
|
|
<a name="line624">624 |</a>
|
|
<a name="line625">625 |</a> case 'H': /* helpful info */
|
|
<a name="line626">626 |</a> module_usage(stderr);
|
|
<a name="line627">627 |</a> return ~TCL_OK;
|
|
<a name="line628">628 |</a>
|
|
<a name="line629">629 |</a> case 'V': /* version */
|
|
<a name="line630">630 |</a> version(stderr);
|
|
<a name="line631">631 |</a> return ~TCL_OK;
|
|
<a name="line632">632 |</a>
|
|
<a name="line633">633 |</a> /**
|
|
<a name="line634">634 |</a> ** All remaining options will influence their flags as defined
|
|
<a name="line635">635 |</a> ** in the optlong table above.
|
|
<a name="line636">636 |</a> **/
|
|
<a name="line637">637 |</a>
|
|
<a name="line638">638 |</a> case 0:
|
|
<a name="line639">639 |</a> break;
|
|
<a name="line640">640 |</a>
|
|
<a name="line641">641 |</a> /**
|
|
<a name="line642">642 |</a> ** Error messages for unknown options will be printed by
|
|
<a name="line643">643 |</a> ** getopt ...
|
|
<a name="line644">644 |</a> **/
|
|
<a name="line645">645 |</a>
|
|
<a name="line646">646 |</a> case '?':
|
|
<a name="line647">647 |</a> break;
|
|
<a name="line648">648 |</a>
|
|
<a name="line649">649 |</a> /**
|
|
<a name="line650">650 |</a> ** Well, this seems to be an internal error
|
|
<a name="line651">651 |</a> **/
|
|
<a name="line652">652 |</a>
|
|
<a name="line653">653 |</a> default:
|
|
<a name="line654">654 |</a> if( OK != ErrorLogger( ERR_GETOPT, LOC, NULL))
|
|
<a name="line655">655 |</a> return( TCL_ERROR); /** --- EXIT (FAILURE) ----> **/
|
|
<a name="line656">656 |</a> break;
|
|
<a name="line657">657 |</a>
|
|
<a name="line658">658 |</a> } /** switch() **/
|
|
<a name="line659">659 |</a> } /** while() **/
|
|
<a name="line660">660 |</a> } /** if( argc) **/
|
|
<a name="line661">661 |</a>
|
|
<a name="line662">662 |</a> /**
|
|
<a name="line663">663 |</a> ** Special things to be dine for the 'silent' option: Pipe stderr
|
|
<a name="line664">664 |</a> ** output to /dev/null
|
|
<a name="line665">665 |</a> **/
|
|
<a name="line666">666 |</a>
|
|
<a name="line667">667 |</a> if( sw_detach) {
|
|
<a name="line668">668 |</a> sw_verbose = 0;
|
|
<a name="line669">669 |</a> if (!ttyname(2)) {
|
|
<a name="line670">670 |</a> int temp_fd = open("/dev/null", O_RDWR);
|
|
<a name="line671">671 |</a>
|
|
<a name="line672">672 |</a> close(2);
|
|
<a name="line673">673 |</a> dup2(temp_fd, 2);
|
|
<a name="line674">674 |</a> }
|
|
<a name="line675">675 |</a> }
|
|
<a name="line676">676 |</a>
|
|
<a name="line677">677 |</a> /**
|
|
<a name="line678">678 |</a> ** Finally remove all options from the command line stream
|
|
<a name="line679">679 |</a> **/
|
|
<a name="line680">680 |</a>
|
|
<a name="line681">681 |</a> c = optind - 1;
|
|
<a name="line682">682 |</a> if( optind < *argc && c > 0) {
|
|
<a name="line683">683 |</a> while( optind < *argc) {
|
|
<a name="line684">684 |</a> argv[ optind-c] = argv[ optind];
|
|
<a name="line685">685 |</a> optind++;
|
|
<a name="line686">686 |</a> }
|
|
<a name="line687">687 |</a> *argc -= c;
|
|
<a name="line688">688 |</a> }
|
|
<a name="line689">689 |</a>
|
|
<a name="line690">690 |</a> /**
|
|
<a name="line691">691 |</a> ** Exit on success
|
|
<a name="line692">692 |</a> **/
|
|
<a name="line693">693 |</a>
|
|
<a name="line694">694 |</a> #if WITH_DEBUGGING_INIT
|
|
<a name="line695">695 |</a> ErrorLogger( NO_ERR_END, LOC, _proc_Check_Switches, NULL);
|
|
<a name="line696">696 |</a> #endif
|
|
<a name="line697">697 |</a>
|
|
<a name="line698">698 |</a> return( TCL_OK);
|
|
<a name="line699">699 |</a>
|
|
<a name="line700">700 |</a> } /** End of 'Check_Switches' **/
|
|
<a name="line701">701 |</a>
|
|
<a name="line702">702 |</a> /*++++
|
|
<a name="line703">703 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line704">704 |</a> ** **
|
|
<a name="line705">705 |</a> ** Function: dup2 **
|
|
<a name="line706">706 |</a> ** **
|
|
<a name="line707">707 |</a> ** Description: Duplicate file descriptor **
|
|
<a name="line708">708 |</a> ** **
|
|
<a name="line709">709 |</a> ** First Edition: 1996/02/08 **
|
|
<a name="line710">710 |</a> ** **
|
|
<a name="line711">711 |</a> ** Parameters: int old Old file descriptor **
|
|
<a name="line712">712 |</a> ** int new New file descriptor **
|
|
<a name="line713">713 |</a> ** **
|
|
<a name="line714">714 |</a> ** Result: int -1 any error **
|
|
<a name="line715">715 |</a> ** other new file descriptor **
|
|
<a name="line716">716 |</a> ** **
|
|
<a name="line717">717 |</a> ** ************************************************************************ **
|
|
<a name="line718">718 |</a> ++++*/
|
|
<a name="line719">719 |</a>
|
|
<a name="line720">720 |</a> #ifndef HAVE_DUP2
|
|
<a name="line721">721 |</a> int dup2( int old, int new)
|
|
<a name="line722">722 |</a> {
|
|
<a name="line723">723 |</a> int fd;
|
|
<a name="line724">724 |</a>
|
|
<a name="line725">725 |</a> close(new);
|
|
<a name="line726">726 |</a> fd = dup(old);
|
|
<a name="line727">727 |</a> if (fd != new) {
|
|
<a name="line728">728 |</a> close( fd);
|
|
<a name="line729">729 |</a> errno = EMFILE;
|
|
<a name="line730">730 |</a> fd = -1;
|
|
<a name="line731">731 |</a> }
|
|
<a name="line732">732 |</a>
|
|
<a name="line733">733 |</a> return( fd);
|
|
<a name="line734">734 |</a> }
|
|
<a name="line735">735 |</a> #endif
|
|
<a name="line736">736 |</a>
|
|
<a name="line737">737 |</a> /*++++
|
|
<a name="line738">738 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line739">739 |</a> ** **
|
|
<a name="line740">740 |</a> ** Function: version **
|
|
<a name="line741">741 |</a> ** **
|
|
<a name="line742">742 |</a> ** Description: Outputs the Modules version and features **
|
|
<a name="line743">743 |</a> ** **
|
|
<a name="line744">744 |</a> ** First Edition: 2002/06/13 **
|
|
<a name="line745">745 |</a> ** **
|
|
<a name="line746">746 |</a> ** Parameters: FILE * output All input is from defined **
|
|
<a name="line747">747 |</a> ** macros **
|
|
<a name="line748">748 |</a> ** Result: void no return value **
|
|
<a name="line749">749 |</a> ** All output is to output **
|
|
<a name="line750">750 |</a> ** **
|
|
<a name="line751">751 |</a> ** Attached Globals: **
|
|
<a name="line752">752 |</a> ** version_string Current module version **
|
|
<a name="line753">753 |</a> ** date_string Current module date **
|
|
<a name="line754">754 |</a> ** **
|
|
<a name="line755">755 |</a> ** ************************************************************************ **
|
|
<a name="line756">756 |</a> ++++*/
|
|
<a name="line757">757 |</a>
|
|
<a name="line758">758 |</a> #define str(a) #a
|
|
<a name="line759">759 |</a> #define isdefined(a,b) {if (strcmp(str(a),b)) x=str(a); else x="undef"; \
|
|
<a name="line760">760 |</a> fprintf(output,format,b,x);}
|
|
<a name="line761">761 |</a>
|
|
<a name="line762">762 |</a> static void version (FILE *output) {
|
|
<a name="line763">763 |</a> char *x,
|
|
<a name="line764">764 |</a> *format = "%s=%s\n";
|
|
<a name="line765">765 |</a>
|
|
<a name="line766">766 |</a> fprintf(output, format, "VERSION", version_string);
|
|
<a name="line767">767 |</a> fprintf(output, format, "DATE", date_string);
|
|
<a name="line768">768 |</a> fprintf(output, "\n");
|
|
<a name="line769">769 |</a> isdefined(AUTOLOADPATH,str(AUTOLOADPATH));
|
|
<a name="line770">770 |</a> isdefined(BEGINENV,str(BEGINENV));
|
|
<a name="line771">771 |</a> isdefined(CACHE_AVAIL,str(CACHE_AVAIL));
|
|
<a name="line772">772 |</a> isdefined(DEF_COLLATE_BY_NUMBER,str(DEF_COLLATE_BY_NUMBER));
|
|
<a name="line773">773 |</a> isdefined(DOT_EXT,str(DOT_EXT));
|
|
<a name="line774">774 |</a> isdefined(HAS_BOURNE_FUNCS,str(HAS_BOURNE_FUNCS));
|
|
<a name="line775">775 |</a> isdefined(HAS_BOURNE_ALIAS,str(HAS_BOURNE_ALIAS));
|
|
<a name="line776">776 |</a> isdefined(EVAL_ALIAS,str(EVAL_ALIAS));
|
|
<a name="line777">777 |</a> isdefined(LMSPLIT_SIZE,str(LMSPLIT_SIZE));
|
|
<a name="line778">778 |</a> isdefined(MODULEPATH,str(MODULEPATH));
|
|
<a name="line779">779 |</a> isdefined(MODULES_INIT_DIR,str(MODULES_INIT_DIR));
|
|
<a name="line780">780 |</a> isdefined(PREFIX,str(PREFIX));
|
|
<a name="line781">781 |</a> isdefined(TMP_DIR,str(TMP_DIR));
|
|
<a name="line782">782 |</a> isdefined(USE_FREE,str(USE_FREE));
|
|
<a name="line783">783 |</a> isdefined(VERSION_MAGIC,str(VERSION_MAGIC));
|
|
<a name="line784">784 |</a> isdefined(VERSIONPATH,str(VERSIONPATH));
|
|
<a name="line785">785 |</a> isdefined(WANTS_VERSIONING,str(WANTS_VERSIONING));
|
|
<a name="line786">786 |</a> isdefined(WITH_DEBUG_INFO,str(WITH_DEBUG_INFO));
|
|
<a name="line787">787 |</a> }
|
|
<a name="line788">788 |</a>
|
|
<a name="line789">789 |</a> #undef str
|
|
<a name="line790">790 |</a> #undef isdefined
|
|
</pre>
|
|
|
|
</BODY>
|
|
</HTML>
|