mirror of
https://github.com/envmodules/modules.git
synced 2026-06-10 00:56:30 +08:00
2128 lines
116 KiB
HTML
2128 lines
116 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 ModuleCmd_Avail.c
|
|
CPP : cxref-cpp -lang-c -C -dD -dI
|
|
-->
|
|
|
|
<HTML>
|
|
|
|
<HEAD>
|
|
<TITLE>Source File ModuleCmd_Avail.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: Modulate_Avail.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: This module command prints out the modulefiles that **
|
|
<a name="line14">14 |</a> ** are available in the directories listed in the **
|
|
<a name="line15">15 |</a> ** MODULEPATH environment variable. **
|
|
<a name="line16">16 |</a> ** **
|
|
<a name="line17">17 |</a> ** Exports: ModuleCmd_Avail **
|
|
<a name="line18">18 |</a> ** print_aligned_files **
|
|
<a name="line19">19 |</a> ** check_dir **
|
|
<a name="line20">20 |</a> ** get_dir **
|
|
<a name="line21">21 |</a> ** dirlst_to_list **
|
|
<a name="line22">22 |</a> ** delete_dirlst **
|
|
<a name="line23">23 |</a> ** delete_cache_list **
|
|
<a name="line24">24 |</a> ** **
|
|
<a name="line25">25 |</a> ** Notes: **
|
|
<a name="line26">26 |</a> ** **
|
|
<a name="line27">27 |</a> ** ************************************************************************ **
|
|
<a name="line28">28 |</a> ****/
|
|
<a name="line29">29 |</a>
|
|
<a name="line30">30 |</a> /** ** Copyright *********************************************************** **
|
|
<a name="line31">31 |</a> ** **
|
|
<a name="line32">32 |</a> ** Copyright 1991-1994 by John L. Furlan. **
|
|
<a name="line33">33 |</a> ** see LICENSE.GPL, which must be provided, for details **
|
|
<a name="line34">34 |</a> ** **
|
|
<a name="line35">35 |</a> ** ************************************************************************ **/
|
|
<a name="line36">36 |</a>
|
|
<a name="line37">37 |</a> static char Id[] = "@(#)$Id: ModuleCmd_Avail.c.src.html,v 1.6 2006/01/18 05:35:11 rkowen Exp $";
|
|
<a name="line38">38 |</a> static void *UseId[] = { &UseId, Id };
|
|
<a name="line39">39 |</a>
|
|
<a name="line40">40 |</a> /** ************************************************************************ **/
|
|
<a name="line41">41 |</a> /** HEADERS **/
|
|
<a name="line42">42 |</a> /** ************************************************************************ **/
|
|
<a name="line43">43 |</a>
|
|
<a name="line44">44 |</a> #include <time.h>
|
|
<a name="line45">45 |</a> #include "modules_def.h"
|
|
<a name="line46">46 |</a>
|
|
<a name="line47">47 |</a> /** ************************************************************************ **/
|
|
<a name="line48">48 |</a> /** LOCAL DATATYPES **/
|
|
<a name="line49">49 |</a> /** ************************************************************************ **/
|
|
<a name="line50">50 |</a>
|
|
<a name="line51">51 |</a> /**
|
|
<a name="line52">52 |</a> ** Structure for a linked list that stores directories to be listed.
|
|
<a name="line53">53 |</a> **/
|
|
<a name="line54">54 |</a>
|
|
<a name="line55">55 |</a> typedef struct _subdir_node {
|
|
<a name="line56">56 |</a> fi_ent* sd_dir;
|
|
<a name="line57">57 |</a> struct _subdir_node* sd_next;
|
|
<a name="line58">58 |</a> } sd_node;
|
|
<a name="line59">59 |</a>
|
|
<a name="line60">60 |</a> /** ************************************************************************ **/
|
|
<a name="line61">61 |</a> /** CONSTANTS **/
|
|
<a name="line62">62 |</a> /** ************************************************************************ **/
|
|
<a name="line63">63 |</a>
|
|
<a name="line64">64 |</a> /**
|
|
<a name="line65">65 |</a> ** I tried having a test for isgraph() in the configuration file,
|
|
<a name="line66">66 |</a> ** but it fails on AIX. This is the best I could come up with...
|
|
<a name="line67">67 |</a> **/
|
|
<a name="line68">68 |</a>
|
|
<a name="line69">69 |</a> #if !defined(isgraph) && defined(_P) && defined(_N)
|
|
<a name="line70">70 |</a> #define isgraph(c) ((_ctype_+1)[c]&(_P|_U|_L|_N))
|
|
<a name="line71">71 |</a> #endif
|
|
<a name="line72">72 |</a>
|
|
<a name="line73">73 |</a> #define DIREST 50
|
|
<a name="line74">74 |</a> #define CACHE_VERSION "v3.0.0"
|
|
<a name="line75">75 |</a>
|
|
<a name="line76">76 |</a> #if !defined(CACHE_UMASK)
|
|
<a name="line77">77 |</a> #define CACHE_UMASK 0
|
|
<a name="line78">78 |</a> #endif
|
|
<a name="line79">79 |</a>
|
|
<a name="line80">80 |</a> /** ************************************************************************ **/
|
|
<a name="line81">81 |</a> /** MACROS **/
|
|
<a name="line82">82 |</a> /** ************************************************************************ **/
|
|
<a name="line83">83 |</a>
|
|
<a name="line84">84 |</a> /** not applicable **/
|
|
<a name="line85">85 |</a>
|
|
<a name="line86">86 |</a> /** ************************************************************************ **/
|
|
<a name="line87">87 |</a> /** LOCAL DATA **/
|
|
<a name="line88">88 |</a> /** ************************************************************************ **/
|
|
<a name="line89">89 |</a>
|
|
<a name="line90">90 |</a> #ifdef CACHE_AVAIL
|
|
<a name="line91">91 |</a> static char *namebuf = NULL;
|
|
<a name="line92">92 |</a> #endif
|
|
<a name="line93">93 |</a> static char buffer[MOD_BUFSIZE];
|
|
<a name="line94">94 |</a> static char buf[ LINELENGTH];
|
|
<a name="line95">95 |</a> static char module_name[] = "ModuleCmd_Avail.c"; /** File name of this module **/
|
|
<a name="line96">96 |</a>
|
|
<a name="line97">97 |</a> #if WITH_DEBUGGING_MODULECMD
|
|
<a name="line98">98 |</a> static char _proc_ModuleCmd_Avail[] = "ModuleCmd_Avail";
|
|
<a name="line99">99 |</a> #endif
|
|
<a name="line100">100 |</a> #if WITH_DEBUGGING_UTIL_1
|
|
<a name="line101">101 |</a> static char _proc_print_dir[] = "print_dir";
|
|
<a name="line102">102 |</a> static char _proc_print_aligned_files[] = "print_aligned_files";
|
|
<a name="line103">103 |</a> #endif
|
|
<a name="line104">104 |</a> #if WITH_DEBUGGING_UTIL_2
|
|
<a name="line105">105 |</a> static char _proc_check_dir[] = "check_dir";
|
|
<a name="line106">106 |</a> static char _proc_get_dir[] = "get_dir";
|
|
<a name="line107">107 |</a> static char _proc_dirlst_to_list[] = "dirlst_to_list";
|
|
<a name="line108">108 |</a> static char _proc_delete_dirlst[] = "delete_dirlst";
|
|
<a name="line109">109 |</a> static char _proc_store_files[] = "store_files";
|
|
<a name="line110">110 |</a> static char _proc_store_dirlst[] = "store_dirlst";
|
|
<a name="line111">111 |</a> static char _proc_store_file[] = "store_file";
|
|
<a name="line112">112 |</a> #ifdef CACHE_AVAIL
|
|
<a name="line113">113 |</a> static char _proc_create_cache_list[] = "create_cache_list";
|
|
<a name="line114">114 |</a> #endif
|
|
<a name="line115">115 |</a> static char _proc_delete_cache_list[] = "delete_cache_list";
|
|
<a name="line116">116 |</a> static char _proc_print_spaced_file[] = "print_spaced_file";
|
|
<a name="line117">117 |</a> static char _proc_mkdirnm[] = "mkdirnm";
|
|
<a name="line118">118 |</a> #endif
|
|
<a name="line119">119 |</a>
|
|
<a name="line120">120 |</a> #if WITH_DEBUGGING
|
|
<a name="line121">121 |</a> static char buffer1[ 80], buffer2[ 80];
|
|
<a name="line122">122 |</a> #endif
|
|
<a name="line123">123 |</a>
|
|
<a name="line124">124 |</a> static char short_format[] = "%s";
|
|
<a name="line125">125 |</a> static char short_format_part[] = "%s/%s";
|
|
<a name="line126">126 |</a> static char short_format_full[] = "%s/%s(%s)";
|
|
<a name="line127">127 |</a> static char long_format[] = "%-39.39s %-10.10s %17s\n";
|
|
<a name="line128">128 |</a> char long_header[] = "\
|
|
<a name="line129">129 |</a> - Package -----------------------------+- Versions -+- Last mod. ------\n";
|
|
<a name="line130">130 |</a>
|
|
<a name="line131">131 |</a> /**
|
|
<a name="line132">132 |</a> ** Terse file list buffer
|
|
<a name="line133">133 |</a> **/
|
|
<a name="line134">134 |</a>
|
|
<a name="line135">135 |</a> #define FILE_LIST_SEGM_SIZE 100
|
|
<a name="line136">136 |</a> static char _file_list_buffer[ 200];
|
|
<a name="line137">137 |</a> static char **_file_list_ptr = (char **) NULL;
|
|
<a name="line138">138 |</a> static int _file_list_cnt = 0;
|
|
<a name="line139">139 |</a> static int _file_list_wr_ndx = 0;
|
|
<a name="line140">140 |</a> static int _file_list_rd_ndx = 0;
|
|
<a name="line141">141 |</a>
|
|
<a name="line142">142 |</a> /** ************************************************************************ **/
|
|
<a name="line143">143 |</a> /** PROTOTYPES **/
|
|
<a name="line144">144 |</a> /** ************************************************************************ **/
|
|
<a name="line145">145 |</a>
|
|
<a name="line146">146 |</a> static int print_dir( Tcl_Interp*, char*, char*);
|
|
<a name="line147">147 |</a> #ifdef CACHE_AVAIL
|
|
<a name="line148">148 |</a> static void store_dirlst( FILE*, FILE*, fi_ent*, int, char*);
|
|
<a name="line149">149 |</a> static void store_files( fi_ent*, int, int, char*);
|
|
<a name="line150">150 |</a> static void store_file( FILE*, char*, fi_ent*);
|
|
<a name="line151">151 |</a> #endif
|
|
<a name="line152">152 |</a> static void print_spaced_file( char*, int, int, int);
|
|
<a name="line153">153 |</a> static char *mkdirnm( char*, char*);
|
|
<a name="line154">154 |</a> static int fi_ent_cmp( const void*, const void*);
|
|
<a name="line155">155 |</a> #ifdef CACHE_AVAIL
|
|
<a name="line156">156 |</a> static int check_cache( char *dir);
|
|
<a name="line157">157 |</a> #endif
|
|
<a name="line158">158 |</a> static void _init_file_list(void);
|
|
<a name="line159">159 |</a> static void _add_file_list( char *name);
|
|
<a name="line160">160 |</a> static char *_get_file_list(void);
|
|
<a name="line161">161 |</a> static char *_pick_file_list( int ndx);
|
|
<a name="line162">162 |</a> static void print_terse_files( int terminal_width, int len, char *header,
|
|
<a name="line163">163 |</a> int numbered);
|
|
<a name="line164">164 |</a> #ifdef CACHE_AVAIL
|
|
<a name="line165">165 |</a> static char **create_cache_list( FILE*, int*, char* );
|
|
<a name="line166">166 |</a> #endif
|
|
<a name="line167">167 |</a>
|
|
<a name="line168">168 |</a> /*++++
|
|
<a name="line169">169 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line170">170 |</a> ** **
|
|
<a name="line171">171 |</a> ** Function: ModuleCmd_Avail **
|
|
<a name="line172">172 |</a> ** **
|
|
<a name="line173">173 |</a> ** Description: Execution of the 'module avail' command **
|
|
<a name="line174">174 |</a> ** **
|
|
<a name="line175">175 |</a> ** First Edition: 1991/10/23 **
|
|
<a name="line176">176 |</a> ** **
|
|
<a name="line177">177 |</a> ** Parameters: Tcl_Interp *interp Current Tcl Interpr. **
|
|
<a name="line178">178 |</a> ** char *argv[] Arguments to the **
|
|
<a name="line179">179 |</a> ** command **
|
|
<a name="line180">180 |</a> ** **
|
|
<a name="line181">181 |</a> ** Result: int TCL_OK Successfull operation **
|
|
<a name="line182">182 |</a> ** TCL_ERROR Any failure **
|
|
<a name="line183">183 |</a> ** **
|
|
<a name="line184">184 |</a> ** Attached Globals: g_specified_module The module name from the **
|
|
<a name="line185">185 |</a> ** command line. **
|
|
<a name="line186">186 |</a> ** **
|
|
<a name="line187">187 |</a> ** ************************************************************************ **
|
|
<a name="line188">188 |</a> ++++*/
|
|
<a name="line189">189 |</a>
|
|
<a name="line190">190 |</a> int ModuleCmd_Avail( Tcl_Interp *interp,
|
|
<a name="line191">191 |</a> int argc,
|
|
<a name="line192">192 |</a> char *argv[])
|
|
<a name="line193">193 |</a> {
|
|
<a name="line194">194 |</a> char *dirname;
|
|
<a name="line195">195 |</a> char *modpath;
|
|
<a name="line196">196 |</a> int Result = -TCL_ERROR;
|
|
<a name="line197">197 |</a>
|
|
<a name="line198">198 |</a> #if WITH_DEBUGGING_MODULECMD
|
|
<a name="line199">199 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_ModuleCmd_Avail, NULL);
|
|
<a name="line200">200 |</a> #endif
|
|
<a name="line201">201 |</a>
|
|
<a name="line202">202 |</a> /**
|
|
<a name="line203">203 |</a> ** If there's no MODULEPATH defined, we cannot output anything
|
|
<a name="line204">204 |</a> ** We perform 1 level of env.var. expansion
|
|
<a name="line205">205 |</a> **/
|
|
<a name="line206">206 |</a>
|
|
<a name="line207">207 |</a> if( !(modpath = (char *) xgetenv( "MODULEPATH")))
|
|
<a name="line208">208 |</a> if( OK != ErrorLogger( ERR_MODULE_PATH, LOC, NULL))
|
|
<a name="line209">209 |</a> goto unwind0;
|
|
<a name="line210">210 |</a>
|
|
<a name="line211">211 |</a> #ifdef CACHE_AVAIL
|
|
<a name="line212">212 |</a> if( (char *) NULL == (namebuf = stringer(NULL, MOD_BUFSIZE, NULL)))
|
|
<a name="line213">213 |</a> if( OK != ErrorLogger( ERR_ALLOC, LOC, NULL))
|
|
<a name="line214">214 |</a> goto unwind1;
|
|
<a name="line215">215 |</a> #endif
|
|
<a name="line216">216 |</a>
|
|
<a name="line217">217 |</a> /**
|
|
<a name="line218">218 |</a> ** If we're given a full-path, then we'll just check that directory.
|
|
<a name="line219">219 |</a> ** Otherwise, we'll check every directory in MODULESPATH.
|
|
<a name="line220">220 |</a> **/
|
|
<a name="line221">221 |</a>
|
|
<a name="line222">222 |</a> if( argc > 0 && **argv == '/') {
|
|
<a name="line223">223 |</a>
|
|
<a name="line224">224 |</a> while( argc--) {
|
|
<a name="line225">225 |</a>
|
|
<a name="line226">226 |</a> /**
|
|
<a name="line227">227 |</a> ** Set the name of the module specified on the command line
|
|
<a name="line228">228 |</a> **/
|
|
<a name="line229">229 |</a>
|
|
<a name="line230">230 |</a> g_specified_module = *argv;
|
|
<a name="line231">231 |</a>
|
|
<a name="line232">232 |</a> if( !check_dir( *argv))
|
|
<a name="line233">233 |</a> if( OK != ErrorLogger( ERR_PARAM, LOC, NULL)) {
|
|
<a name="line234">234 |</a> Result = TCL_ERROR; /** --- EXIT PROCEDURE (FAILURE) --> **/
|
|
<a name="line235">235 |</a> }
|
|
<a name="line236">236 |</a> else
|
|
<a name="line237">237 |</a> print_dir( interp, *argv, NULL);
|
|
<a name="line238">238 |</a>
|
|
<a name="line239">239 |</a> argv++;
|
|
<a name="line240">240 |</a> }
|
|
<a name="line241">241 |</a>
|
|
<a name="line242">242 |</a> } else {
|
|
<a name="line243">243 |</a>
|
|
<a name="line244">244 |</a> /**
|
|
<a name="line245">245 |</a> ** We're not given a full path. Tokenize the module path string and
|
|
<a name="line246">246 |</a> ** print the contents of each directory specified (if it exists ;-)
|
|
<a name="line247">247 |</a> **/
|
|
<a name="line248">248 |</a>
|
|
<a name="line249">249 |</a> if( sw_format & SW_LONG)
|
|
<a name="line250">250 |</a> fprintf( stderr, long_header);
|
|
<a name="line251">251 |</a>
|
|
<a name="line252">252 |</a> /**
|
|
<a name="line253">253 |</a> ** If a module category is specified check whether it is part
|
|
<a name="line254">254 |</a> ** of the directory we're scanning at the moment.
|
|
<a name="line255">255 |</a> **/
|
|
<a name="line256">256 |</a>
|
|
<a name="line257">257 |</a> if( argc > 0) { /* show sub directory */
|
|
<a name="line258">258 |</a> while( argc--) {
|
|
<a name="line259">259 |</a> /**
|
|
<a name="line260">260 |</a> ** Set the name of the module specified on the command line
|
|
<a name="line261">261 |</a> **/
|
|
<a name="line262">262 |</a>
|
|
<a name="line263">263 |</a> g_specified_module = *argv;
|
|
<a name="line264">264 |</a>
|
|
<a name="line265">265 |</a> dirname = modpath;
|
|
<a name="line266">266 |</a> while( dirname && *dirname) {
|
|
<a name="line267">267 |</a>
|
|
<a name="line268">268 |</a> /**
|
|
<a name="line269">269 |</a> ** We cannot use strtok here, because it interfers with
|
|
<a name="line270">270 |</a> ** subsequent calls while printing the list
|
|
<a name="line271">271 |</a> **/
|
|
<a name="line272">272 |</a>
|
|
<a name="line273">273 |</a> char *s;
|
|
<a name="line274">274 |</a>
|
|
<a name="line275">275 |</a> if( s = strchr( dirname, ':'))
|
|
<a name="line276">276 |</a> *s++ = '\0';
|
|
<a name="line277">277 |</a>
|
|
<a name="line278">278 |</a> /**
|
|
<a name="line279">279 |</a> ** Print the cathegory
|
|
<a name="line280">280 |</a> **/
|
|
<a name="line281">281 |</a>
|
|
<a name="line282">282 |</a> if( check_dir( dirname))
|
|
<a name="line283">283 |</a> print_dir( interp, dirname, *argv);
|
|
<a name="line284">284 |</a> dirname = s;
|
|
<a name="line285">285 |</a> }
|
|
<a name="line286">286 |</a>
|
|
<a name="line287">287 |</a> argv++;
|
|
<a name="line288">288 |</a> }
|
|
<a name="line289">289 |</a>
|
|
<a name="line290">290 |</a> /**
|
|
<a name="line291">291 |</a> ** Otherwise, if there's no category given, descend the current
|
|
<a name="line292">292 |</a> ** directory and print its contents.
|
|
<a name="line293">293 |</a> **/
|
|
<a name="line294">294 |</a>
|
|
<a name="line295">295 |</a> } else {
|
|
<a name="line296">296 |</a>
|
|
<a name="line297">297 |</a> dirname = modpath;
|
|
<a name="line298">298 |</a> while( dirname && *dirname) {
|
|
<a name="line299">299 |</a>
|
|
<a name="line300">300 |</a> /**
|
|
<a name="line301">301 |</a> ** We cannot use strtok here, because it interfers with
|
|
<a name="line302">302 |</a> ** subsequent calls while printing the list
|
|
<a name="line303">303 |</a> **/
|
|
<a name="line304">304 |</a>
|
|
<a name="line305">305 |</a> char *s;
|
|
<a name="line306">306 |</a>
|
|
<a name="line307">307 |</a> if( s = strchr( dirname, ':'))
|
|
<a name="line308">308 |</a> *s++ = '\0';
|
|
<a name="line309">309 |</a>
|
|
<a name="line310">310 |</a> /**
|
|
<a name="line311">311 |</a> ** Second part of tokenization
|
|
<a name="line312">312 |</a> **/
|
|
<a name="line313">313 |</a>
|
|
<a name="line314">314 |</a> if( check_dir( dirname))
|
|
<a name="line315">315 |</a> print_dir( interp, dirname, NULL);
|
|
<a name="line316">316 |</a> dirname = s;
|
|
<a name="line317">317 |</a> }
|
|
<a name="line318">318 |</a>
|
|
<a name="line319">319 |</a> } /** for **/
|
|
<a name="line320">320 |</a> } /** if( no full path name given) **/
|
|
<a name="line321">321 |</a>
|
|
<a name="line322">322 |</a> /**
|
|
<a name="line323">323 |</a> ** Free up what has been allocated and exit from this procedure
|
|
<a name="line324">324 |</a> **/
|
|
<a name="line325">325 |</a> /* if got here via this path ... it must have been OK */
|
|
<a name="line326">326 |</a> if(Result < 0) Result = TCL_OK;
|
|
<a name="line327">327 |</a>
|
|
<a name="line328">328 |</a> unwind2:
|
|
<a name="line329">329 |</a> #ifdef CACHE_AVAIL
|
|
<a name="line330">330 |</a> null_free((void *) &namebuf);
|
|
<a name="line331">331 |</a> #endif
|
|
<a name="line332">332 |</a> unwind1:
|
|
<a name="line333">333 |</a> null_free((void *) &modpath);
|
|
<a name="line334">334 |</a>
|
|
<a name="line335">335 |</a> unwind0:
|
|
<a name="line336">336 |</a> #if WITH_DEBUGGING_MODULECMD
|
|
<a name="line337">337 |</a> ErrorLogger( NO_ERR_END, LOC, _proc_ModuleCmd_Avail, NULL);
|
|
<a name="line338">338 |</a> #endif
|
|
<a name="line339">339 |</a>
|
|
<a name="line340">340 |</a> /* if Result is negative here ... must have been an unwind */
|
|
<a name="line341">341 |</a> if (Result < 0) Result = -Result;
|
|
<a name="line342">342 |</a>
|
|
<a name="line343">343 |</a> return( Result); /** --- EXIT PROCEDURE (FAILURE/SUCCESS) --> **/
|
|
<a name="line344">344 |</a>
|
|
<a name="line345">345 |</a> } /** End of 'ModuleCmd_Avail' **/
|
|
<a name="line346">346 |</a>
|
|
<a name="line347">347 |</a> /*++++
|
|
<a name="line348">348 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line349">349 |</a> ** **
|
|
<a name="line350">350 |</a> ** Function: check_dir **
|
|
<a name="line351">351 |</a> ** **
|
|
<a name="line352">352 |</a> ** Description: Open and close the passed directory in order to check**
|
|
<a name="line353">353 |</a> ** if it does exist and is readable **
|
|
<a name="line354">354 |</a> ** **
|
|
<a name="line355">355 |</a> ** First Edition: 1991/10/23 **
|
|
<a name="line356">356 |</a> ** **
|
|
<a name="line357">357 |</a> ** Parameters: char *dirname Name of the directory to be **
|
|
<a name="line358">358 |</a> ** checked **
|
|
<a name="line359">359 |</a> ** **
|
|
<a name="line360">360 |</a> ** Result: int 0 Not a directory or unreadable **
|
|
<a name="line361">361 |</a> ** 1 OK **
|
|
<a name="line362">362 |</a> ** **
|
|
<a name="line363">363 |</a> ** Attached Globals: - **
|
|
<a name="line364">364 |</a> ** **
|
|
<a name="line365">365 |</a> ** ************************************************************************ **
|
|
<a name="line366">366 |</a> ++++*/
|
|
<a name="line367">367 |</a>
|
|
<a name="line368">368 |</a> int check_dir( char *dirname)
|
|
<a name="line369">369 |</a> {
|
|
<a name="line370">370 |</a> DIR* dirp;
|
|
<a name="line371">371 |</a>
|
|
<a name="line372">372 |</a> #if WITH_DEBUGGING_UTIL_2
|
|
<a name="line373">373 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_check_dir, NULL);
|
|
<a name="line374">374 |</a> #endif
|
|
<a name="line375">375 |</a>
|
|
<a name="line376">376 |</a> if( !(dirp = opendir( dirname)))
|
|
<a name="line377">377 |</a> return( 0);
|
|
<a name="line378">378 |</a>
|
|
<a name="line379">379 |</a> if( -1 == closedir( dirp))
|
|
<a name="line380">380 |</a> if( OK != ErrorLogger( ERR_CLOSEDIR, LOC, dirname, NULL))
|
|
<a name="line381">381 |</a> return( 0);
|
|
<a name="line382">382 |</a>
|
|
<a name="line383">383 |</a> return( 1);
|
|
<a name="line384">384 |</a>
|
|
<a name="line385">385 |</a> } /** End of 'check_dir' **/
|
|
<a name="line386">386 |</a>
|
|
<a name="line387">387 |</a> /*++++
|
|
<a name="line388">388 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line389">389 |</a> ** **
|
|
<a name="line390">390 |</a> ** Function: print_dir **
|
|
<a name="line391">391 |</a> ** **
|
|
<a name="line392">392 |</a> ** Description: Print all files beyond the passed directory **
|
|
<a name="line393">393 |</a> ** **
|
|
<a name="line394">394 |</a> ** First Edition: 1991/10/23 **
|
|
<a name="line395">395 |</a> ** **
|
|
<a name="line396">396 |</a> ** Parameters: char *dir Directory to be scanned **
|
|
<a name="line397">397 |</a> ** char *module A selcted module name or NULL**
|
|
<a name="line398">398 |</a> ** **
|
|
<a name="line399">399 |</a> ** Result: int TCL_OK Successfull operation **
|
|
<a name="line400">400 |</a> ** **
|
|
<a name="line401">401 |</a> ** Attached Globals: - **
|
|
<a name="line402">402 |</a> ** **
|
|
<a name="line403">403 |</a> ** ************************************************************************ **
|
|
<a name="line404">404 |</a> ++++*/
|
|
<a name="line405">405 |</a>
|
|
<a name="line406">406 |</a> static int print_dir( Tcl_Interp *interp,
|
|
<a name="line407">407 |</a> char *dir,
|
|
<a name="line408">408 |</a> char *module)
|
|
<a name="line409">409 |</a> {
|
|
<a name="line410">410 |</a> fi_ent *dirlst_head = NULL; /** Directory list base pointer **/
|
|
<a name="line411">411 |</a> int count = 0; /** Number of elements in the top **/
|
|
<a name="line412">412 |</a> /** level directory list **/
|
|
<a name="line413">413 |</a> int tcount = 0; /** Total number of files to print **/
|
|
<a name="line414">414 |</a> int start = 0;
|
|
<a name="line415">415 |</a> int dirlen;
|
|
<a name="line416">416 |</a> char **cache_list = NULL;
|
|
<a name="line417">417 |</a> char *selection, *s;
|
|
<a name="line418">418 |</a>
|
|
<a name="line419">419 |</a> #ifdef CACHE_AVAIL
|
|
<a name="line420">420 |</a> int usecache;
|
|
<a name="line421">421 |</a> FILE *fi;
|
|
<a name="line422">422 |</a> #endif
|
|
<a name="line423">423 |</a>
|
|
<a name="line424">424 |</a> #if WITH_DEBUGGING_UTIL_1
|
|
<a name="line425">425 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_print_dir, "dir='", dir, NULL);
|
|
<a name="line426">426 |</a> #endif
|
|
<a name="line427">427 |</a>
|
|
<a name="line428">428 |</a> /**
|
|
<a name="line429">429 |</a> ** Print the directory name
|
|
<a name="line430">430 |</a> **/
|
|
<a name="line431">431 |</a>
|
|
<a name="line432">432 |</a> if( (sw_format & (SW_PARSE | SW_TERSE | SW_LONG))
|
|
<a name="line433">433 |</a> && !(sw_format & (SW_HUMAN | SW_LIST)) ) {
|
|
<a name="line434">434 |</a> /* char *base = strrchr( dir, '/');
|
|
<a name="line435">435 |</a> fprintf( stderr, "%s:\n", base ? ++base : dir);
|
|
<a name="line436">436 |</a> */
|
|
<a name="line437">437 |</a> fprintf( stderr, "%s:\n", dir);
|
|
<a name="line438">438 |</a> }
|
|
<a name="line439">439 |</a>
|
|
<a name="line440">440 |</a> if( dir)
|
|
<a name="line441">441 |</a> dirlen = strlen( dir) + 1;
|
|
<a name="line442">442 |</a> else
|
|
<a name="line443">443 |</a> dirlen = 0;
|
|
<a name="line444">444 |</a>
|
|
<a name="line445">445 |</a> /**
|
|
<a name="line446">446 |</a> ** If the is a module selection given, build the whole selected path
|
|
<a name="line447">447 |</a> **/
|
|
<a name="line448">448 |</a>
|
|
<a name="line449">449 |</a> if( module) {
|
|
<a name="line450">450 |</a>
|
|
<a name="line451">451 |</a> if( dir) {
|
|
<a name="line452">452 |</a> if((char *) NULL == (selection = stringer(NULL, 0,
|
|
<a name="line453">453 |</a> dir,"/",module, NULL))) {
|
|
<a name="line454">454 |</a> ErrorLogger( ERR_STRING, LOC, NULL);
|
|
<a name="line455">455 |</a> return( TCL_ERROR); /** --- EXIT (FAILURE) --------> **/
|
|
<a name="line456">456 |</a> }
|
|
<a name="line457">457 |</a>
|
|
<a name="line458">458 |</a> } else
|
|
<a name="line459">459 |</a> selection = module;
|
|
<a name="line460">460 |</a>
|
|
<a name="line461">461 |</a> } else
|
|
<a name="line462">462 |</a> selection = (char *) NULL;
|
|
<a name="line463">463 |</a>
|
|
<a name="line464">464 |</a> #ifdef CACHE_AVAIL
|
|
<a name="line465">465 |</a>
|
|
<a name="line466">466 |</a> /**
|
|
<a name="line467">467 |</a> ** Ensure any files I create can be read and written by everyone
|
|
<a name="line468">468 |</a> **/
|
|
<a name="line469">469 |</a>
|
|
<a name="line470">470 |</a> umask( CACHE_UMASK);
|
|
<a name="line471">471 |</a>
|
|
<a name="line472">472 |</a> /**
|
|
<a name="line473">473 |</a> ** OK, if cache is to be used, go on reading the entire cache.
|
|
<a name="line474">474 |</a> ** In case of success print the files. Otherwise read the files
|
|
<a name="line475">475 |</a> ** from the file system and rebuild the cache.
|
|
<a name="line476">476 |</a> **/
|
|
<a name="line477">477 |</a>
|
|
<a name="line478">478 |</a> if( usecache = check_cache( dir)) {
|
|
<a name="line479">479 |</a>
|
|
<a name="line480">480 |</a> if( !sw_create) {
|
|
<a name="line481">481 |</a>
|
|
<a name="line482">482 |</a> if( (char *) NULL == stringer(namebuf, MOD_BUFSIZE,
|
|
<a name="line483">483 |</a> dir, "/.moduleavailcache", NULL))
|
|
<a name="line484">484 |</a> if( OK != ErrorLogger( ERR_STRING, LOC, NULL))
|
|
<a name="line485">485 |</a> goto unwind1;
|
|
<a name="line486">486 |</a>
|
|
<a name="line487">487 |</a> if( NULL == (fi = fopen( namebuf, "r"))) {
|
|
<a name="line488">488 |</a> if( OK != ErrorLogger( ERR_OPEN, LOC, namebuf, "reading", NULL))
|
|
<a name="line489">489 |</a> goto unwind1;
|
|
<a name="line490">490 |</a>
|
|
<a name="line491">491 |</a> } else {
|
|
<a name="line492">492 |</a>
|
|
<a name="line493">493 |</a> cache_list = create_cache_list( fi, &tcount, selection);
|
|
<a name="line494">494 |</a>
|
|
<a name="line495">495 |</a> /**
|
|
<a name="line496">496 |</a> ** Close the cache file
|
|
<a name="line497">497 |</a> **/
|
|
<a name="line498">498 |</a>
|
|
<a name="line499">499 |</a> if( EOF == fclose( fi))
|
|
<a name="line500">500 |</a> if( OK != ErrorLogger( ERR_CLOSE, LOC, namebuf, NULL))
|
|
<a name="line501">501 |</a> goto unwind1;
|
|
<a name="line502">502 |</a> }
|
|
<a name="line503">503 |</a>
|
|
<a name="line504">504 |</a> } /** if( !create) **/
|
|
<a name="line505">505 |</a>
|
|
<a name="line506">506 |</a> }
|
|
<a name="line507">507 |</a> #endif
|
|
<a name="line508">508 |</a>
|
|
<a name="line509">509 |</a> if( !cache_list) {
|
|
<a name="line510">510 |</a> #ifdef CACHE_AVAIL
|
|
<a name="line511">511 |</a> usecache = 0;
|
|
<a name="line512">512 |</a> #endif
|
|
<a name="line513">513 |</a>
|
|
<a name="line514">514 |</a> /**
|
|
<a name="line515">515 |</a> ** Normal reading of the files
|
|
<a name="line516">516 |</a> **/
|
|
<a name="line517">517 |</a>
|
|
<a name="line518">518 |</a> if( NULL == (dirlst_head = get_dir( dir, NULL, &count, &tcount)))
|
|
<a name="line519">519 |</a> if( OK != ErrorLogger( ERR_READDIR, LOC, dir, NULL))
|
|
<a name="line520">520 |</a> goto unwind1;
|
|
<a name="line521">521 |</a>
|
|
<a name="line522">522 |</a> if( NULL == (cache_list = (char**) malloc( tcount * sizeof( char**))))
|
|
<a name="line523">523 |</a> if( OK != ErrorLogger( ERR_ALLOC, LOC, NULL))
|
|
<a name="line524">524 |</a> goto unwind1;
|
|
<a name="line525">525 |</a> (void) memset(cache_list, 0, tcount * sizeof( char **));
|
|
<a name="line526">526 |</a>
|
|
<a name="line527">527 |</a> start=0;
|
|
<a name="line528">528 |</a> dirlst_to_list( cache_list, dirlst_head, count, &start, dir, selection);
|
|
<a name="line529">529 |</a>
|
|
<a name="line530">530 |</a> }
|
|
<a name="line531">531 |</a> #ifdef CACHE_AVAIL
|
|
<a name="line532">532 |</a>
|
|
<a name="line533">533 |</a> /**
|
|
<a name="line534">534 |</a> ** Now open the files used for caching
|
|
<a name="line535">535 |</a> ** In case of any error flush out the read files and exit
|
|
<a name="line536">536 |</a> **/
|
|
<a name="line537">537 |</a>
|
|
<a name="line538">538 |</a> if( !usecache && sw_create)
|
|
<a name="line539">539 |</a> store_files( dirlst_head, count, tcount, dir);
|
|
<a name="line540">540 |</a> #endif
|
|
<a name="line541">541 |</a>
|
|
<a name="line542">542 |</a> /**
|
|
<a name="line543">543 |</a> ** In case of any selection, we have to force all .modulrc's and .versions
|
|
<a name="line544">544 |</a> ** on the path
|
|
<a name="line545">545 |</a> **/
|
|
<a name="line546">546 |</a>
|
|
<a name="line547">547 |</a> if( dir) {
|
|
<a name="line548">548 |</a>
|
|
<a name="line549">549 |</a> s = dir;
|
|
<a name="line550">550 |</a> while( s) {
|
|
<a name="line551">551 |</a> if( s = strchr( s, '/'))
|
|
<a name="line552">552 |</a> *s = '\0';
|
|
<a name="line553">553 |</a> else
|
|
<a name="line554">554 |</a> break;
|
|
<a name="line555">555 |</a>
|
|
<a name="line556">556 |</a> SourceRC( interp, dir, modulerc_file);
|
|
<a name="line557">557 |</a> SourceVers( interp, dir, module);
|
|
<a name="line558">558 |</a>
|
|
<a name="line559">559 |</a> if( s)
|
|
<a name="line560">560 |</a> *s++ = '/';
|
|
<a name="line561">561 |</a> }
|
|
<a name="line562">562 |</a>
|
|
<a name="line563">563 |</a> /**
|
|
<a name="line564">564 |</a> ** Finally source the rc files in the directory itself
|
|
<a name="line565">565 |</a> **/
|
|
<a name="line566">566 |</a>
|
|
<a name="line567">567 |</a> SourceRC( interp, dir, modulerc_file);
|
|
<a name="line568">568 |</a> SourceVers( interp, dir, module);
|
|
<a name="line569">569 |</a> }
|
|
<a name="line570">570 |</a>
|
|
<a name="line571">571 |</a> if( dir && selection)
|
|
<a name="line572">572 |</a> null_free((void *) &selection);
|
|
<a name="line573">573 |</a>
|
|
<a name="line574">574 |</a> /**
|
|
<a name="line575">575 |</a> ** Print and remove the cache list
|
|
<a name="line576">576 |</a> **/
|
|
<a name="line577">577 |</a>
|
|
<a name="line578">578 |</a> delete_dirlst( dirlst_head, count);
|
|
<a name="line579">579 |</a> print_aligned_files( interp, dir, dir, cache_list, tcount,
|
|
<a name="line580">580 |</a> (sw_format & SW_LIST ? 1 : -1));
|
|
<a name="line581">581 |</a> delete_cache_list( cache_list, start);
|
|
<a name="line582">582 |</a>
|
|
<a name="line583">583 |</a> if( sw_format & SW_LONG)
|
|
<a name="line584">584 |</a> fprintf( stderr, "\n");
|
|
<a name="line585">585 |</a> return( TCL_OK); /** ------- EXIT (SUCCESS) --------> **/
|
|
<a name="line586">586 |</a>
|
|
<a name="line587">587 |</a> unwind1:
|
|
<a name="line588">588 |</a> if( dir && selection)
|
|
<a name="line589">589 |</a> null_free((void *) &selection);
|
|
<a name="line590">590 |</a>
|
|
<a name="line591">591 |</a> unwind0:
|
|
<a name="line592">592 |</a> return( TCL_ERROR); /** ------- EXIT (FAILURE) --------> **/
|
|
<a name="line593">593 |</a>
|
|
<a name="line594">594 |</a> } /** End of 'print_dir' **/
|
|
<a name="line595">595 |</a>
|
|
<a name="line596">596 |</a> /*++++
|
|
<a name="line597">597 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line598">598 |</a> ** **
|
|
<a name="line599">599 |</a> ** Function: check_cache **
|
|
<a name="line600">600 |</a> ** **
|
|
<a name="line601">601 |</a> ** Description: Check whether an avail cache exists and is not out **
|
|
<a name="line602">602 |</a> ** of date **
|
|
<a name="line603">603 |</a> ** **
|
|
<a name="line604">604 |</a> ** First Edition: 1996/01/03 **
|
|
<a name="line605">605 |</a> ** **
|
|
<a name="line606">606 |</a> ** Parameters: char *dir Directory to be checked **
|
|
<a name="line607">607 |</a> ** **
|
|
<a name="line608">608 |</a> ** Result: int 0 Do not use the cache **
|
|
<a name="line609">609 |</a> ** 1 Use the cache **
|
|
<a name="line610">610 |</a> ** **
|
|
<a name="line611">611 |</a> ** Attached Globals: - **
|
|
<a name="line612">612 |</a> ** **
|
|
<a name="line613">613 |</a> ** ************************************************************************ **
|
|
<a name="line614">614 |</a> ++++*/
|
|
<a name="line615">615 |</a>
|
|
<a name="line616">616 |</a> #ifdef CACHE_AVAIL
|
|
<a name="line617">617 |</a>
|
|
<a name="line618">618 |</a> static int check_cache( char *dir)
|
|
<a name="line619">619 |</a> {
|
|
<a name="line620">620 |</a> time_t dir_time=0, cache_time=0, info_time=0;
|
|
<a name="line621">621 |</a> struct stat dir_stats, cache_stats;
|
|
<a name="line622">622 |</a> FILE *cdir;
|
|
<a name="line623">623 |</a>
|
|
<a name="line624">624 |</a> /**
|
|
<a name="line625">625 |</a> ** Check if a cache file exists. And if it does, check if it is
|
|
<a name="line626">626 |</a> ** younger than the related directory.
|
|
<a name="line627">627 |</a> **/
|
|
<a name="line628">628 |</a>
|
|
<a name="line629">629 |</a> if( (char *) NULL == stringer(namebuf, MOD_BUFSIZE,
|
|
<a name="line630">630 |</a> dir, "/.moduleavailcachedir", NULL))
|
|
<a name="line631">631 |</a> return( 0);
|
|
<a name="line632">632 |</a>
|
|
<a name="line633">633 |</a> if( NULL != (cdir = fopen( namebuf, "r"))) {
|
|
<a name="line634">634 |</a> if( stat( dir, &dir_stats) != -1) {
|
|
<a name="line635">635 |</a> if( stat( namebuf, &cache_stats) != -1) {
|
|
<a name="line636">636 |</a> dir_time = dir_stats.st_mtime;
|
|
<a name="line637">637 |</a> cache_time = cache_stats.st_mtime;
|
|
<a name="line638">638 |</a> }
|
|
<a name="line639">639 |</a> if( dir_time > cache_time) {
|
|
<a name="line640">640 |</a> return( 0);
|
|
<a name="line641">641 |</a> }
|
|
<a name="line642">642 |</a> }
|
|
<a name="line643">643 |</a>
|
|
<a name="line644">644 |</a> /**
|
|
<a name="line645">645 |</a> ** Also check if the modification date of the cached files isn't
|
|
<a name="line646">646 |</a> ** younger than the one derivered from the cache
|
|
<a name="line647">647 |</a> **/
|
|
<a name="line648">648 |</a>
|
|
<a name="line649">649 |</a> while( !feof(cdir)) {
|
|
<a name="line650">650 |</a>
|
|
<a name="line651">651 |</a> if( fscanf( cdir, "%s %d\n", buf, (int *)&info_time) != 2)
|
|
<a name="line652">652 |</a> continue;
|
|
<a name="line653">653 |</a>
|
|
<a name="line654">654 |</a> if( stat( buf, &dir_stats) != -1) {
|
|
<a name="line655">655 |</a> if( dir_stats.st_mtime <= info_time)
|
|
<a name="line656">656 |</a> continue;
|
|
<a name="line657">657 |</a> }
|
|
<a name="line658">658 |</a>
|
|
<a name="line659">659 |</a> return( 0);
|
|
<a name="line660">660 |</a> }
|
|
<a name="line661">661 |</a>
|
|
<a name="line662">662 |</a> /**
|
|
<a name="line663">663 |</a> ** Close the cache file
|
|
<a name="line664">664 |</a> **/
|
|
<a name="line665">665 |</a>
|
|
<a name="line666">666 |</a> if( EOF == fclose( cdir))
|
|
<a name="line667">667 |</a> if( OK != ErrorLogger( ERR_CLOSE, LOC, namebuf, NULL))
|
|
<a name="line668">668 |</a> return( 0); /** ------- EXIT (FAILURE) --------> **/
|
|
<a name="line669">669 |</a>
|
|
<a name="line670">670 |</a> return( 1);
|
|
<a name="line671">671 |</a> }
|
|
<a name="line672">672 |</a>
|
|
<a name="line673">673 |</a> return( 0);
|
|
<a name="line674">674 |</a>
|
|
<a name="line675">675 |</a> } /** End of 'check_cache' **/
|
|
<a name="line676">676 |</a>
|
|
<a name="line677">677 |</a> #endif
|
|
<a name="line678">678 |</a>
|
|
<a name="line679">679 |</a>
|
|
<a name="line680">680 |</a> static int test_version_dir( struct dirent *dp)
|
|
<a name="line681">681 |</a> {
|
|
<a name="line682">682 |</a> }
|
|
<a name="line683">683 |</a> /*++++
|
|
<a name="line684">684 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line685">685 |</a> ** **
|
|
<a name="line686">686 |</a> ** Function: get_dir **
|
|
<a name="line687">687 |</a> ** **
|
|
<a name="line688">688 |</a> ** Description: Read in the passed directory and save every interes- **
|
|
<a name="line689">689 |</a> ** ting item in the directory list **
|
|
<a name="line690">690 |</a> ** skipping known version control directories: **
|
|
<a name="line691">691 |</a> ** CVS RCS .svn **
|
|
<a name="line692">692 |</a> ** unless they contain .version files **
|
|
<a name="line693">693 |</a> ** **
|
|
<a name="line694">694 |</a> ** First Edition: 1991/10/23 **
|
|
<a name="line695">695 |</a> ** **
|
|
<a name="line696">696 |</a> ** Parameters: char *dir Directory to be read **
|
|
<a name="line697">697 |</a> ** char *prefix Directory prefix (path) **
|
|
<a name="line698">698 |</a> ** int *listcount Buffer to store the number of**
|
|
<a name="line699">699 |</a> ** elements in the current **
|
|
<a name="line700">700 |</a> ** directory list **
|
|
<a name="line701">701 |</a> ** int *total_count Buffer for the total number **
|
|
<a name="line702">702 |</a> ** of files read **
|
|
<a name="line703">703 |</a> ** **
|
|
<a name="line704">704 |</a> ** Result: fi_ent* NULL Failure **
|
|
<a name="line705">705 |</a> ** else Directory list base pointer **
|
|
<a name="line706">706 |</a> ** *listcount Number of elements in the **
|
|
<a name="line707">707 |</a> ** top level directory list **
|
|
<a name="line708">708 |</a> ** *total_count Total number of files read **
|
|
<a name="line709">709 |</a> ** **
|
|
<a name="line710">710 |</a> ** Attached Globals: - **
|
|
<a name="line711">711 |</a> ** **
|
|
<a name="line712">712 |</a> ** ************************************************************************ **
|
|
<a name="line713">713 |</a> ++++*/
|
|
<a name="line714">714 |</a>
|
|
<a name="line715">715 |</a> fi_ent *get_dir( char *dir,
|
|
<a name="line716">716 |</a> char *prefix,
|
|
<a name="line717">717 |</a> int *listcount,
|
|
<a name="line718">718 |</a> int *total_count)
|
|
<a name="line719">719 |</a> {
|
|
<a name="line720">720 |</a> struct dirent *dp; /** Directory read pointer **/
|
|
<a name="line721">721 |</a> DIR *dirptr; /** Directory handle **/
|
|
<a name="line722">722 |</a> fi_ent *dirlst_head, /** Directory list pointers. Head, **/
|
|
<a name="line723">723 |</a> *dirlst_cur, /** current **/
|
|
<a name="line724">724 |</a> *dirlst_last; /** and last **/
|
|
<a name="line725">725 |</a> char *dirname; /** Expanded directory path name **/
|
|
<a name="line726">726 |</a> char *tmp;
|
|
<a name="line727">727 |</a> int count = 0;
|
|
<a name="line728">728 |</a>
|
|
<a name="line729">729 |</a> #if WITH_DEBUGGING_UTIL_2
|
|
<a name="line730">730 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_get_dir, NULL);
|
|
<a name="line731">731 |</a> #endif
|
|
<a name="line732">732 |</a>
|
|
<a name="line733">733 |</a> /**
|
|
<a name="line734">734 |</a> ** Open the desired directiory
|
|
<a name="line735">735 |</a> **/
|
|
<a name="line736">736 |</a>
|
|
<a name="line737">737 |</a> if( !(dirptr = opendir( dir))) {
|
|
<a name="line738">738 |</a> #if 0
|
|
<a name="line739">739 |</a> /* if you can't open a directory ... is that really an error? */
|
|
<a name="line740">740 |</a> if( OK != ErrorLogger( ERR_OPENDIR, LOC, dir, NULL))
|
|
<a name="line741">741 |</a> #endif
|
|
<a name="line742">742 |</a> return( NULL); /** ----------- EXIT (FAILURE) ------------> **/
|
|
<a name="line743">743 |</a> }
|
|
<a name="line744">744 |</a>
|
|
<a name="line745">745 |</a> /**
|
|
<a name="line746">746 |</a> ** Allocate memory for reading in the directory
|
|
<a name="line747">747 |</a> **/
|
|
<a name="line748">748 |</a>
|
|
<a name="line749">749 |</a> if( NULL == (dirlst_cur = dirlst_head = (fi_ent*) calloc( DIREST,
|
|
<a name="line750">750 |</a> sizeof( fi_ent)))) {
|
|
<a name="line751">751 |</a> if( OK != ErrorLogger( ERR_ALLOC, LOC, NULL)) {
|
|
<a name="line752">752 |</a> if( -1 == closedir( dirptr))
|
|
<a name="line753">753 |</a> ErrorLogger( ERR_CLOSEDIR, LOC, dir, NULL);
|
|
<a name="line754">754 |</a> goto unwind0;
|
|
<a name="line755">755 |</a> }
|
|
<a name="line756">756 |</a> }
|
|
<a name="line757">757 |</a> dirlst_last = dirlst_head + DIREST;
|
|
<a name="line758">758 |</a>
|
|
<a name="line759">759 |</a> /**
|
|
<a name="line760">760 |</a> ** Read in the contents of the directory. Ignore dotfiles
|
|
<a name="line761">761 |</a> ** and version directories.
|
|
<a name="line762">762 |</a> **/
|
|
<a name="line763">763 |</a>
|
|
<a name="line764">764 |</a> for( count = 0, dp = readdir( dirptr); dp != NULL; dp = readdir( dirptr)) {
|
|
<a name="line765">765 |</a> if( *dp->d_name == '.') continue;
|
|
<a name="line766">766 |</a>
|
|
<a name="line767">767 |</a> /**
|
|
<a name="line768">768 |</a> ** Conditionally double up the space allocated for reading the direc-
|
|
<a name="line769">769 |</a> ** tory
|
|
<a name="line770">770 |</a> **/
|
|
<a name="line771">771 |</a>
|
|
<a name="line772">772 |</a> if(dirlst_cur == dirlst_last) {
|
|
<a name="line773">773 |</a> if( NULL == (dirlst_head = (fi_ent*) realloc( (char*) dirlst_head,
|
|
<a name="line774">774 |</a> (count<<1) * sizeof( fi_ent))))
|
|
<a name="line775">775 |</a> if( OK != ErrorLogger( ERR_ALLOC, LOC, NULL))
|
|
<a name="line776">776 |</a> goto unwind0;
|
|
<a name="line777">777 |</a> dirlst_cur = dirlst_head + count;
|
|
<a name="line778">778 |</a> dirlst_last = dirlst_head + (count<<1);
|
|
<a name="line779">779 |</a> }
|
|
<a name="line780">780 |</a>
|
|
<a name="line781">781 |</a> /**
|
|
<a name="line782">782 |</a> ** Build the complete path name and get information about the file
|
|
<a name="line783">783 |</a> **/
|
|
<a name="line784">784 |</a>
|
|
<a name="line785">785 |</a> if( !( dirname = mkdirnm( dir, dp->d_name)))
|
|
<a name="line786">786 |</a> if( OK != ErrorLogger( ERR_DIRNAME, LOC, NULL)) {
|
|
<a name="line787">787 |</a> if( -1 == closedir( dirptr))
|
|
<a name="line788">788 |</a> ErrorLogger( ERR_CLOSEDIR, LOC, dir, NULL);
|
|
<a name="line789">789 |</a> goto unwind1;
|
|
<a name="line790">790 |</a> }
|
|
<a name="line791">791 |</a>
|
|
<a name="line792">792 |</a> if( stat( dirname, &(dirlst_cur->fi_stats)) < 0)
|
|
<a name="line793">793 |</a> if( OK != ErrorLogger( ERR_DIRNOTFOUND, LOC, dirname, NULL)) {
|
|
<a name="line794">794 |</a> if( -1 == closedir( dirptr))
|
|
<a name="line795">795 |</a> ErrorLogger( ERR_CLOSEDIR, LOC, dir, NULL);
|
|
<a name="line796">796 |</a> goto unwind1;
|
|
<a name="line797">797 |</a> }
|
|
<a name="line798">798 |</a>
|
|
<a name="line799">799 |</a> /**
|
|
<a name="line800">800 |</a> ** If it is a directory, recursively delve into it ..
|
|
<a name="line801">801 |</a> **/
|
|
<a name="line802">802 |</a>
|
|
<a name="line803">803 |</a> if(dirlst_cur->fi_stats.st_mode & S_IFDIR) {
|
|
<a name="line804">804 |</a> char* np;
|
|
<a name="line805">805 |</a> char* ndir;
|
|
<a name="line806">806 |</a> int tmpcount = 0;
|
|
<a name="line807">807 |</a>
|
|
<a name="line808">808 |</a> /**
|
|
<a name="line809">809 |</a> ** Build the new base points for the recursion
|
|
<a name="line810">810 |</a> **/
|
|
<a name="line811">811 |</a>
|
|
<a name="line812">812 |</a> if( !( tmp = mkdirnm( prefix, dp->d_name))) {
|
|
<a name="line813">813 |</a> if( OK != ErrorLogger( ERR_DIRNAME, LOC, NULL)) {
|
|
<a name="line814">814 |</a> if( -1 == closedir( dirptr))
|
|
<a name="line815">815 |</a> ErrorLogger( ERR_CLOSEDIR, LOC, dir, NULL);
|
|
<a name="line816">816 |</a> goto unwind1;
|
|
<a name="line817">817 |</a> }
|
|
<a name="line818">818 |</a> } else {
|
|
<a name="line819">819 |</a> if( NULL == (np = strdup( tmp)))
|
|
<a name="line820">820 |</a> if( OK != ErrorLogger( ERR_ALLOC, LOC, NULL))
|
|
<a name="line821">821 |</a> goto unwind1;
|
|
<a name="line822">822 |</a> }
|
|
<a name="line823">823 |</a>
|
|
<a name="line824">824 |</a> if( !( tmp = mkdirnm( dir, dp->d_name))) {
|
|
<a name="line825">825 |</a> if( OK != ErrorLogger( ERR_DIRNAME, LOC, NULL)) {
|
|
<a name="line826">826 |</a> if( -1 == closedir( dirptr))
|
|
<a name="line827">827 |</a> ErrorLogger( ERR_CLOSEDIR, LOC, dir, NULL);
|
|
<a name="line828">828 |</a> goto unwind1;
|
|
<a name="line829">829 |</a> }
|
|
<a name="line830">830 |</a> } else {
|
|
<a name="line831">831 |</a> if( NULL == (ndir = strdup( tmp)))
|
|
<a name="line832">832 |</a> if( OK != ErrorLogger( ERR_ALLOC, LOC, NULL))
|
|
<a name="line833">833 |</a> goto unwind1;
|
|
<a name="line834">834 |</a> }
|
|
<a name="line835">835 |</a>
|
|
<a name="line836">836 |</a> /**
|
|
<a name="line837">837 |</a> ** What if it's a known version control directory
|
|
<a name="line838">838 |</a> ** check if it has a .version file
|
|
<a name="line839">839 |</a> **/
|
|
<a name="line840">840 |</a> if (!strcmp("CVS",dp->d_name)
|
|
<a name="line841">841 |</a> || !strcmp("RCS",dp->d_name)
|
|
<a name="line842">842 |</a> || !strcmp(".svn",dp->d_name)) {
|
|
<a name="line843">843 |</a> FILE *fi;
|
|
<a name="line844">844 |</a> if( (char *) NULL == stringer(buffer, MOD_BUFSIZE,
|
|
<a name="line845">845 |</a> tmp, "/.version", NULL))
|
|
<a name="line846">846 |</a> if( OK != ErrorLogger( ERR_STRING, LOC, NULL))
|
|
<a name="line847">847 |</a> goto unwind1;
|
|
<a name="line848">848 |</a> if( NULL == (fi = fopen( buffer, "r"))) {
|
|
<a name="line849">849 |</a> /* does not have a .version file */
|
|
<a name="line850">850 |</a> continue;
|
|
<a name="line851">851 |</a> } else {
|
|
<a name="line852">852 |</a> /* has a .version file ... assume to be module dir */
|
|
<a name="line853">853 |</a> fclose(fi);
|
|
<a name="line854">854 |</a> }
|
|
<a name="line855">855 |</a> }
|
|
<a name="line856">856 |</a>
|
|
<a name="line857">857 |</a> /**
|
|
<a name="line858">858 |</a> ** The recursion itself ...
|
|
<a name="line859">859 |</a> **/
|
|
<a name="line860">860 |</a>
|
|
<a name="line861">861 |</a> dirlst_cur->fi_subdir = get_dir( ndir,np,&dirlst_cur->fi_listcount,
|
|
<a name="line862">862 |</a> &tmpcount);
|
|
<a name="line863">863 |</a>
|
|
<a name="line864">864 |</a> /**
|
|
<a name="line865">865 |</a> ** Add the number of real modulefiles (i.e. not subdirs and
|
|
<a name="line866">866 |</a> ** not non-modulefiles) to our total number of modulefiles
|
|
<a name="line867">867 |</a> ** contained in the structure.
|
|
<a name="line868">868 |</a> **/
|
|
<a name="line869">869 |</a>
|
|
<a name="line870">870 |</a> *total_count += tmpcount;
|
|
<a name="line871">871 |</a>
|
|
<a name="line872">872 |</a> /**
|
|
<a name="line873">873 |</a> ** This means that it's an empty directory so the prefix is
|
|
<a name="line874">874 |</a> ** never used
|
|
<a name="line875">875 |</a> **/
|
|
<a name="line876">876 |</a>
|
|
<a name="line877">877 |</a> if( !dirlst_cur->fi_listcount)
|
|
<a name="line878">878 |</a> null_free((void *) &np);
|
|
<a name="line879">879 |</a> null_free((void *) &ndir);
|
|
<a name="line880">880 |</a>
|
|
<a name="line881">881 |</a> /**
|
|
<a name="line882">882 |</a> ** if it is not a directory check the magic cookie of the file. Only
|
|
<a name="line883">883 |</a> ** files with the modules magic cookie will be accepted. Also tem-
|
|
<a name="line884">884 |</a> ** porary files are to be ignored.
|
|
<a name="line885">885 |</a> **/
|
|
<a name="line886">886 |</a>
|
|
<a name="line887">887 |</a> } else if( dp->d_name[NLENGTH(dp)-1] == '~' ||
|
|
<a name="line888">888 |</a> !check_magic( dirname, MODULES_MAGIC_COOKIE,
|
|
<a name="line889">889 |</a> MODULES_MAGIC_COOKIE_LENGTH)) {
|
|
<a name="line890">890 |</a> continue;
|
|
<a name="line891">891 |</a> } else {
|
|
<a name="line892">892 |</a> dirlst_cur->fi_subdir = NULL;
|
|
<a name="line893">893 |</a> }
|
|
<a name="line894">894 |</a>
|
|
<a name="line895">895 |</a> /**
|
|
<a name="line896">896 |</a> ** Put the name of the file on the directory list
|
|
<a name="line897">897 |</a> **/
|
|
<a name="line898">898 |</a>
|
|
<a name="line899">899 |</a> dirlst_cur->fi_prefix = prefix;
|
|
<a name="line900">900 |</a> if( NULL == (dirlst_cur->fi_name = strdup( dp->d_name)))
|
|
<a name="line901">901 |</a> if( OK != ErrorLogger( ERR_ALLOC, LOC, NULL))
|
|
<a name="line902">902 |</a> goto unwind1;
|
|
<a name="line903">903 |</a>
|
|
<a name="line904">904 |</a> /**
|
|
<a name="line905">905 |</a> ** Count even the number of elements in the current list as the
|
|
<a name="line906">906 |</a> ** total number of elements read in so far.
|
|
<a name="line907">907 |</a> ** Increment the list index to be prepared for the next entry.
|
|
<a name="line908">908 |</a> **/
|
|
<a name="line909">909 |</a>
|
|
<a name="line910">910 |</a> count++;
|
|
<a name="line911">911 |</a> (*total_count)++;
|
|
<a name="line912">912 |</a> dirlst_cur++;
|
|
<a name="line913">913 |</a>
|
|
<a name="line914">914 |</a> } /** for **/
|
|
<a name="line915">915 |</a>
|
|
<a name="line916">916 |</a> /**
|
|
<a name="line917">917 |</a> ** Now sort alphabetically what has been read
|
|
<a name="line918">918 |</a> **/
|
|
<a name="line919">919 |</a>
|
|
<a name="line920">920 |</a> if( count > 1)
|
|
<a name="line921">921 |</a> qsort( dirlst_head, count, sizeof(fi_ent), fi_ent_cmp);
|
|
<a name="line922">922 |</a>
|
|
<a name="line923">923 |</a> /**
|
|
<a name="line924">924 |</a> ** Close the directory, set up return values
|
|
<a name="line925">925 |</a> **/
|
|
<a name="line926">926 |</a>
|
|
<a name="line927">927 |</a> if( -1 == closedir( dirptr))
|
|
<a name="line928">928 |</a> if( OK != ErrorLogger( ERR_CLOSEDIR, LOC, dir, NULL))
|
|
<a name="line929">929 |</a> goto unwind1;
|
|
<a name="line930">930 |</a>
|
|
<a name="line931">931 |</a> *listcount = count;
|
|
<a name="line932">932 |</a> return( dirlst_head); /** ----------- EXIT (SUCCESS) ------------> **/
|
|
<a name="line933">933 |</a>
|
|
<a name="line934">934 |</a> unwind1:
|
|
<a name="line935">935 |</a> null_free((void *) &dirlst_cur);
|
|
<a name="line936">936 |</a>
|
|
<a name="line937">937 |</a> unwind0:
|
|
<a name="line938">938 |</a> return( NULL); /** ----------- EXIT (FAILURE) ------------> **/
|
|
<a name="line939">939 |</a> } /** End of 'get_dir' **/
|
|
<a name="line940">940 |</a>
|
|
<a name="line941">941 |</a> /*++++
|
|
<a name="line942">942 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line943">943 |</a> ** **
|
|
<a name="line944">944 |</a> ** Function: dirlst_to_list **
|
|
<a name="line945">945 |</a> ** **
|
|
<a name="line946">946 |</a> ** Description: Transform the passed nested directory list into a **
|
|
<a name="line947">947 |</a> ** flat list of strings **
|
|
<a name="line948">948 |</a> ** **
|
|
<a name="line949">949 |</a> ** First Edition: 1991/10/23 **
|
|
<a name="line950">950 |</a> ** **
|
|
<a name="line951">951 |</a> ** Parameters: char **list List to be created **
|
|
<a name="line952">952 |</a> ** fi_ent *dirlst_head Head of the directory list **
|
|
<a name="line953">953 |</a> ** to be transformed **
|
|
<a name="line954">954 |</a> ** int count Number of elements in the **
|
|
<a name="line955">955 |</a> ** directory list **
|
|
<a name="line956">956 |</a> ** int *beginning Index of the element in List **
|
|
<a name="line957">957 |</a> ** to start appending the file- **
|
|
<a name="line958">958 |</a> ** names at. **
|
|
<a name="line959">959 |</a> ** char *path prepend pathname to list **
|
|
<a name="line960">960 |</a> ** char *module A search pattern **
|
|
<a name="line961">961 |</a> ** **
|
|
<a name="line962">962 |</a> ** Result: - **
|
|
<a name="line963">963 |</a> ** **
|
|
<a name="line964">964 |</a> ** Attached Globals: - **
|
|
<a name="line965">965 |</a> ** **
|
|
<a name="line966">966 |</a> ** ************************************************************************ **
|
|
<a name="line967">967 |</a> ++++*/
|
|
<a name="line968">968 |</a>
|
|
<a name="line969">969 |</a> void dirlst_to_list( char **list,
|
|
<a name="line970">970 |</a> fi_ent *dirlst_head,
|
|
<a name="line971">971 |</a> int count,
|
|
<a name="line972">972 |</a> int *beginning,
|
|
<a name="line973">973 |</a> char *path,
|
|
<a name="line974">974 |</a> char *module)
|
|
<a name="line975">975 |</a> {
|
|
<a name="line976">976 |</a> fi_ent *dirlst_cur;
|
|
<a name="line977">977 |</a> int i;
|
|
<a name="line978">978 |</a> char *ptr;
|
|
<a name="line979">979 |</a> int mlen;
|
|
<a name="line980">980 |</a>
|
|
<a name="line981">981 |</a> /**
|
|
<a name="line982">982 |</a> ** If there's any selection given, figure out its length
|
|
<a name="line983">983 |</a> **/
|
|
<a name="line984">984 |</a>
|
|
<a name="line985">985 |</a> if( module)
|
|
<a name="line986">986 |</a> mlen = strlen( module);
|
|
<a name="line987">987 |</a>
|
|
<a name="line988">988 |</a> /**
|
|
<a name="line989">989 |</a> ** Put all files in the directory list at the end of the passed list
|
|
<a name="line990">990 |</a> ** of character arrays
|
|
<a name="line991">991 |</a> **/
|
|
<a name="line992">992 |</a>
|
|
<a name="line993">993 |</a> #if WITH_DEBUGGING_UTIL_2
|
|
<a name="line994">994 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_dirlst_to_list, NULL);
|
|
<a name="line995">995 |</a> #endif
|
|
<a name="line996">996 |</a>
|
|
<a name="line997">997 |</a> for( i=0, dirlst_cur=dirlst_head;
|
|
<a name="line998">998 |</a> i<count && dirlst_cur;
|
|
<a name="line999">999 |</a> i++, dirlst_cur++) {
|
|
<a name="line1000">1000 |</a>
|
|
<a name="line1001">1001 |</a> if( dirlst_cur->fi_prefix) {
|
|
<a name="line1002">1002 |</a>
|
|
<a name="line1003">1003 |</a> if( path) {
|
|
<a name="line1004">1004 |</a> if( (char *) NULL == stringer(buf, MOD_BUFSIZE,
|
|
<a name="line1005">1005 |</a> path,"/", dirlst_cur->fi_prefix,"/", dirlst_cur->fi_name,
|
|
<a name="line1006">1006 |</a> NULL))
|
|
<a name="line1007">1007 |</a> return;
|
|
<a name="line1008">1008 |</a> } else {
|
|
<a name="line1009">1009 |</a> if( (char *) NULL == stringer(buf, MOD_BUFSIZE,
|
|
<a name="line1010">1010 |</a> dirlst_cur->fi_prefix,"/", dirlst_cur->fi_name, NULL))
|
|
<a name="line1011">1011 |</a> return;
|
|
<a name="line1012">1012 |</a> }
|
|
<a name="line1013">1013 |</a>
|
|
<a name="line1014">1014 |</a> ptr = buf;
|
|
<a name="line1015">1015 |</a> } else {
|
|
<a name="line1016">1016 |</a> if( path) {
|
|
<a name="line1017">1017 |</a> if( (char *) NULL == stringer(buf, MOD_BUFSIZE,
|
|
<a name="line1018">1018 |</a> path,"/", dirlst_cur->fi_name, NULL))
|
|
<a name="line1019">1019 |</a> return;
|
|
<a name="line1020">1020 |</a> ptr = buf;
|
|
<a name="line1021">1021 |</a>
|
|
<a name="line1022">1022 |</a> } else
|
|
<a name="line1023">1023 |</a> ptr = dirlst_cur->fi_name;
|
|
<a name="line1024">1024 |</a> }
|
|
<a name="line1025">1025 |</a>
|
|
<a name="line1026">1026 |</a> /**
|
|
<a name="line1027">1027 |</a> ** Check whether this is part of the selected modules ...
|
|
<a name="line1028">1028 |</a> **/
|
|
<a name="line1029">1029 |</a>
|
|
<a name="line1030">1030 |</a> if( !module || !strncmp( module, buf, mlen)) {
|
|
<a name="line1031">1031 |</a>
|
|
<a name="line1032">1032 |</a> /**
|
|
<a name="line1033">1033 |</a> ** Put this guy on the list
|
|
<a name="line1034">1034 |</a> **/
|
|
<a name="line1035">1035 |</a>
|
|
<a name="line1036">1036 |</a> if( NULL == (list[(*beginning)++] = strdup( ptr))) {
|
|
<a name="line1037">1037 |</a> if( OK != ErrorLogger( ERR_ALLOC, LOC, NULL)) {
|
|
<a name="line1038">1038 |</a> while( i--)
|
|
<a name="line1039">1039 |</a> null_free((void *) list + (--(*beginning)));
|
|
<a name="line1040">1040 |</a> return; /** ------- EXIT (FAILURE) --------> **/
|
|
<a name="line1041">1041 |</a> }
|
|
<a name="line1042">1042 |</a> }
|
|
<a name="line1043">1043 |</a> }
|
|
<a name="line1044">1044 |</a>
|
|
<a name="line1045">1045 |</a> /**
|
|
<a name="line1046">1046 |</a> ** recursively descend to subdirectories
|
|
<a name="line1047">1047 |</a> **/
|
|
<a name="line1048">1048 |</a>
|
|
<a name="line1049">1049 |</a> if( dirlst_cur->fi_subdir)
|
|
<a name="line1050">1050 |</a> dirlst_to_list( list, dirlst_cur->fi_subdir,
|
|
<a name="line1051">1051 |</a> dirlst_cur->fi_listcount, beginning, path, module);
|
|
<a name="line1052">1052 |</a> } /** for **/
|
|
<a name="line1053">1053 |</a>
|
|
<a name="line1054">1054 |</a> } /** end of 'dirlst_to_list' **/
|
|
<a name="line1055">1055 |</a>
|
|
<a name="line1056">1056 |</a> /*++++
|
|
<a name="line1057">1057 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line1058">1058 |</a> ** **
|
|
<a name="line1059">1059 |</a> ** Function: delete_dirlst **
|
|
<a name="line1060">1060 |</a> ** **
|
|
<a name="line1061">1061 |</a> ** Description: Delete an entire directory list including all sub- **
|
|
<a name="line1062">1062 |</a> ** directory lists **
|
|
<a name="line1063">1063 |</a> ** **
|
|
<a name="line1064">1064 |</a> ** First Edition: 1991/10/23 **
|
|
<a name="line1065">1065 |</a> ** **
|
|
<a name="line1066">1066 |</a> ** Parameters: fi_ent *dirlst_head Head of the list to be re- **
|
|
<a name="line1067">1067 |</a> ** moved **
|
|
<a name="line1068">1068 |</a> ** **
|
|
<a name="line1069">1069 |</a> ** Result: - **
|
|
<a name="line1070">1070 |</a> ** **
|
|
<a name="line1071">1071 |</a> ** Attached Globals: - **
|
|
<a name="line1072">1072 |</a> ** **
|
|
<a name="line1073">1073 |</a> ** ************************************************************************ **
|
|
<a name="line1074">1074 |</a> ++++*/
|
|
<a name="line1075">1075 |</a>
|
|
<a name="line1076">1076 |</a> void delete_dirlst( fi_ent *dirlst_head,
|
|
<a name="line1077">1077 |</a> int count)
|
|
<a name="line1078">1078 |</a> {
|
|
<a name="line1079">1079 |</a> fi_ent *dirlst_cur;
|
|
<a name="line1080">1080 |</a> int i;
|
|
<a name="line1081">1081 |</a>
|
|
<a name="line1082">1082 |</a> #if WITH_DEBUGGING_UTIL_2
|
|
<a name="line1083">1083 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_delete_dirlst, NULL);
|
|
<a name="line1084">1084 |</a> #endif
|
|
<a name="line1085">1085 |</a>
|
|
<a name="line1086">1086 |</a> if( !dirlst_head)
|
|
<a name="line1087">1087 |</a> return;
|
|
<a name="line1088">1088 |</a>
|
|
<a name="line1089">1089 |</a> /**
|
|
<a name="line1090">1090 |</a> ** Free all filenames stored in the list
|
|
<a name="line1091">1091 |</a> **/
|
|
<a name="line1092">1092 |</a>
|
|
<a name="line1093">1093 |</a> for( i=0, dirlst_cur=dirlst_head;
|
|
<a name="line1094">1094 |</a> i<count && dirlst_cur;
|
|
<a name="line1095">1095 |</a> i++, dirlst_cur++) {
|
|
<a name="line1096">1096 |</a>
|
|
<a name="line1097">1097 |</a> null_free((void *) &(dirlst_cur->fi_name));
|
|
<a name="line1098">1098 |</a>
|
|
<a name="line1099">1099 |</a> /**
|
|
<a name="line1100">1100 |</a> ** Recursivle decend to subdirectories
|
|
<a name="line1101">1101 |</a> **/
|
|
<a name="line1102">1102 |</a>
|
|
<a name="line1103">1103 |</a> if( dirlst_cur->fi_subdir)
|
|
<a name="line1104">1104 |</a> delete_dirlst( dirlst_cur->fi_subdir, dirlst_cur->fi_listcount);
|
|
<a name="line1105">1105 |</a> } /** for **/
|
|
<a name="line1106">1106 |</a>
|
|
<a name="line1107">1107 |</a> /**
|
|
<a name="line1108">1108 |</a> ** Remove the entire list
|
|
<a name="line1109">1109 |</a> **/
|
|
<a name="line1110">1110 |</a>
|
|
<a name="line1111">1111 |</a> if( dirlst_head->fi_prefix)
|
|
<a name="line1112">1112 |</a> null_free((void *) &(dirlst_head->fi_prefix));
|
|
<a name="line1113">1113 |</a> null_free((void *) &dirlst_head);
|
|
<a name="line1114">1114 |</a>
|
|
<a name="line1115">1115 |</a> } /** End of 'delete_dirlst' **/
|
|
<a name="line1116">1116 |</a>
|
|
<a name="line1117">1117 |</a> /*++++
|
|
<a name="line1118">1118 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line1119">1119 |</a> ** **
|
|
<a name="line1120">1120 |</a> ** Function: store_files **
|
|
<a name="line1121">1121 |</a> ** **
|
|
<a name="line1122">1122 |</a> ** Description: Write a cache file using the given directory list **
|
|
<a name="line1123">1123 |</a> ** **
|
|
<a name="line1124">1124 |</a> ** First Edition: 1991/10/23 **
|
|
<a name="line1125">1125 |</a> ** **
|
|
<a name="line1126">1126 |</a> ** Parameters: fi_ent *dirlist_head List of files to be printed **
|
|
<a name="line1127">1127 |</a> ** int count Number of entries in the pas-**
|
|
<a name="line1128">1128 |</a> ** sed 'dirlist' **
|
|
<a name="line1129">1129 |</a> ** int tcount Number of entries to write to**
|
|
<a name="line1130">1130 |</a> ** the cache file. This id the **
|
|
<a name="line1131">1131 |</a> ** total number of files stores **
|
|
<a name="line1132">1132 |</a> ** in the nested directory lists**
|
|
<a name="line1133">1133 |</a> ** char *dir The current directory **
|
|
<a name="line1134">1134 |</a> ** **
|
|
<a name="line1135">1135 |</a> ** Result: - **
|
|
<a name="line1136">1136 |</a> ** **
|
|
<a name="line1137">1137 |</a> ** Attached Globals: - **
|
|
<a name="line1138">1138 |</a> ** **
|
|
<a name="line1139">1139 |</a> ** ************************************************************************ **
|
|
<a name="line1140">1140 |</a> ++++*/
|
|
<a name="line1141">1141 |</a>
|
|
<a name="line1142">1142 |</a> #ifdef CACHE_AVAIL
|
|
<a name="line1143">1143 |</a>
|
|
<a name="line1144">1144 |</a> static void store_files( fi_ent *dirlst_head,
|
|
<a name="line1145">1145 |</a> int count,
|
|
<a name="line1146">1146 |</a> int tcount,
|
|
<a name="line1147">1147 |</a> char *dir)
|
|
<a name="line1148">1148 |</a> {
|
|
<a name="line1149">1149 |</a> FILE *fi, *cdir;
|
|
<a name="line1150">1150 |</a>
|
|
<a name="line1151">1151 |</a> #if WITH_DEBUGGING_UTIL_2
|
|
<a name="line1152">1152 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_store_files, NULL);
|
|
<a name="line1153">1153 |</a> #endif
|
|
<a name="line1154">1154 |</a>
|
|
<a name="line1155">1155 |</a> /**
|
|
<a name="line1156">1156 |</a> ** Open both, the cache info and the cache dir file
|
|
<a name="line1157">1157 |</a> **/
|
|
<a name="line1158">1158 |</a>
|
|
<a name="line1159">1159 |</a> /** CACHEINFO **/
|
|
<a name="line1160">1160 |</a> if( (char *) NULL == stringer(namebuf, MOD_BUFSIZE,
|
|
<a name="line1161">1161 |</a> dir, "/.moduleavailcache", NULL))
|
|
<a name="line1162">1162 |</a> return;
|
|
<a name="line1163">1163 |</a> if( NULL == (fi = fopen( namebuf, "w+")))
|
|
<a name="line1164">1164 |</a> return;
|
|
<a name="line1165">1165 |</a>
|
|
<a name="line1166">1166 |</a> /** CACHEOUTPUT **/
|
|
<a name="line1167">1167 |</a> if( (char *) NULL == stringer(namebuf, MOD_BUFSIZE,
|
|
<a name="line1168">1168 |</a> dir, "/.moduleavailcachedir", NULL))
|
|
<a name="line1169">1169 |</a> return;
|
|
<a name="line1170">1170 |</a> if( NULL == (cdir = fopen( namebuf, "w+"))) {
|
|
<a name="line1171">1171 |</a> if( EOF == fclose( fi))
|
|
<a name="line1172">1172 |</a> ErrorLogger( ERR_CLOSE, LOC, NULL);
|
|
<a name="line1173">1173 |</a> return;
|
|
<a name="line1174">1174 |</a> }
|
|
<a name="line1175">1175 |</a>
|
|
<a name="line1176">1176 |</a> /**
|
|
<a name="line1177">1177 |</a> ** Write the cache id
|
|
<a name="line1178">1178 |</a> ** Write the cache itsself
|
|
<a name="line1179">1179 |</a> **/
|
|
<a name="line1180">1180 |</a>
|
|
<a name="line1181">1181 |</a> fprintf( fi, "%s\n", CACHE_VERSION);
|
|
<a name="line1182">1182 |</a> fprintf( fi, "%d\n", tcount);
|
|
<a name="line1183">1183 |</a> store_dirlst( cdir, fi, dirlst_head, count, dir);
|
|
<a name="line1184">1184 |</a>
|
|
<a name="line1185">1185 |</a> /**
|
|
<a name="line1186">1186 |</a> ** Close the cache files again
|
|
<a name="line1187">1187 |</a> **/
|
|
<a name="line1188">1188 |</a>
|
|
<a name="line1189">1189 |</a> if( EOF == fclose( fi))
|
|
<a name="line1190">1190 |</a> ErrorLogger( ERR_CLOSE, LOC, NULL);
|
|
<a name="line1191">1191 |</a>
|
|
<a name="line1192">1192 |</a> if( EOF == fclose( cdir))
|
|
<a name="line1193">1193 |</a> ErrorLogger( ERR_CLOSE, LOC, namebuf, NULL);
|
|
<a name="line1194">1194 |</a>
|
|
<a name="line1195">1195 |</a> } /** End of 'store_files' **/
|
|
<a name="line1196">1196 |</a>
|
|
<a name="line1197">1197 |</a> /*++++
|
|
<a name="line1198">1198 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line1199">1199 |</a> ** **
|
|
<a name="line1200">1200 |</a> ** Function: store_dirlst **
|
|
<a name="line1201">1201 |</a> ** **
|
|
<a name="line1202">1202 |</a> ** Description: Write the contents of a cache file **
|
|
<a name="line1203">1203 |</a> ** **
|
|
<a name="line1204">1204 |</a> ** First Edition: 1991/10/23 **
|
|
<a name="line1205">1205 |</a> ** **
|
|
<a name="line1206">1206 |</a> ** Parameters: FILE *cacheoutput Output stream to be used **
|
|
<a name="line1207">1207 |</a> ** FILE *cacheinfo Cache log file to be written **
|
|
<a name="line1208">1208 |</a> ** fi_ent *dirlist_head List of files to be printed **
|
|
<a name="line1209">1209 |</a> ** int count Number of entries in the pas-**
|
|
<a name="line1210">1210 |</a> ** sed 'dirlist' **
|
|
<a name="line1211">1211 |</a> ** Result: - **
|
|
<a name="line1212">1212 |</a> ** **
|
|
<a name="line1213">1213 |</a> ** Attached Globals: - **
|
|
<a name="line1214">1214 |</a> ** **
|
|
<a name="line1215">1215 |</a> ** ************************************************************************ **
|
|
<a name="line1216">1216 |</a> ++++*/
|
|
<a name="line1217">1217 |</a>
|
|
<a name="line1218">1218 |</a> static void store_dirlst( FILE *cacheinfo,
|
|
<a name="line1219">1219 |</a> FILE *cacheoutput,
|
|
<a name="line1220">1220 |</a> fi_ent *dirlst_head,
|
|
<a name="line1221">1221 |</a> int count,
|
|
<a name="line1222">1222 |</a> char *dir)
|
|
<a name="line1223">1223 |</a> {
|
|
<a name="line1224">1224 |</a> fi_ent* dirlst_cur;
|
|
<a name="line1225">1225 |</a> int i;
|
|
<a name="line1226">1226 |</a>
|
|
<a name="line1227">1227 |</a> #if WITH_DEBUGGING_UTIL_2
|
|
<a name="line1228">1228 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_store_dirlst, NULL);
|
|
<a name="line1229">1229 |</a> #endif
|
|
<a name="line1230">1230 |</a>
|
|
<a name="line1231">1231 |</a> for( i=0, dirlst_cur=dirlst_head;
|
|
<a name="line1232">1232 |</a> i<count && dirlst_cur;
|
|
<a name="line1233">1233 |</a> i++, dirlst_cur++) {
|
|
<a name="line1234">1234 |</a>
|
|
<a name="line1235">1235 |</a> /**
|
|
<a name="line1236">1236 |</a> ** Flush the filename to the cache if it is a directory
|
|
<a name="line1237">1237 |</a> ** Only directories reside in the cache log ....
|
|
<a name="line1238">1238 |</a> **/
|
|
<a name="line1239">1239 |</a>
|
|
<a name="line1240">1240 |</a> if( dirlst_cur->fi_stats.st_mode & S_IFDIR) {
|
|
<a name="line1241">1241 |</a> if( dirlst_cur->fi_prefix) {
|
|
<a name="line1242">1242 |</a> fprintf( cacheinfo, "%s/%s/%s %d\n", dir, dirlst_cur->fi_prefix,
|
|
<a name="line1243">1243 |</a> dirlst_cur->fi_name, (int)dirlst_cur->fi_stats.st_mtime);
|
|
<a name="line1244">1244 |</a> } else {
|
|
<a name="line1245">1245 |</a> fprintf( cacheinfo, "%s/%s %d\n", dir, dirlst_cur->fi_name,
|
|
<a name="line1246">1246 |</a> (int)dirlst_cur->fi_stats.st_mtime);
|
|
<a name="line1247">1247 |</a> }
|
|
<a name="line1248">1248 |</a> }
|
|
<a name="line1249">1249 |</a>
|
|
<a name="line1250">1250 |</a> /**
|
|
<a name="line1251">1251 |</a> ** Flush out the filename
|
|
<a name="line1252">1252 |</a> **/
|
|
<a name="line1253">1253 |</a>
|
|
<a name="line1254">1254 |</a> store_file( cacheoutput, dir, dirlst_cur);
|
|
<a name="line1255">1255 |</a>
|
|
<a name="line1256">1256 |</a> /**
|
|
<a name="line1257">1257 |</a> ** Recursively descent into directories
|
|
<a name="line1258">1258 |</a> **/
|
|
<a name="line1259">1259 |</a>
|
|
<a name="line1260">1260 |</a> if( dirlst_cur->fi_subdir)
|
|
<a name="line1261">1261 |</a> store_dirlst( cacheinfo, cacheoutput, dirlst_cur->fi_subdir,
|
|
<a name="line1262">1262 |</a> dirlst_cur->fi_listcount, dir);
|
|
<a name="line1263">1263 |</a> } /** for **/
|
|
<a name="line1264">1264 |</a>
|
|
<a name="line1265">1265 |</a> /**
|
|
<a name="line1266">1266 |</a> ** Free up everything that has been allocated for the directory
|
|
<a name="line1267">1267 |</a> ** list
|
|
<a name="line1268">1268 |</a> **/
|
|
<a name="line1269">1269 |</a>
|
|
<a name="line1270">1270 |</a> if( dirlst_head->fi_prefix)
|
|
<a name="line1271">1271 |</a> null_free((void *) &(dirlst_head->fi_prefix));
|
|
<a name="line1272">1272 |</a> null_free((void *) &dirlst_head);
|
|
<a name="line1273">1273 |</a>
|
|
<a name="line1274">1274 |</a> } /** End of 'store_dirlst' **/
|
|
<a name="line1275">1275 |</a>
|
|
<a name="line1276">1276 |</a> /*++++
|
|
<a name="line1277">1277 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line1278">1278 |</a> ** **
|
|
<a name="line1279">1279 |</a> ** Function: store_file **
|
|
<a name="line1280">1280 |</a> ** **
|
|
<a name="line1281">1281 |</a> ** Description: Store the name of the file passed as 'file entry' to **
|
|
<a name="line1282">1282 |</a> ** the specified output stream if it isn't a temp file **
|
|
<a name="line1283">1283 |</a> ** **
|
|
<a name="line1284">1284 |</a> ** First Edition: 1991/10/23 **
|
|
<a name="line1285">1285 |</a> ** **
|
|
<a name="line1286">1286 |</a> ** Parameters: FILE *cacheoutput Output stream to be used **
|
|
<a name="line1287">1287 |</a> ** char *dir The current directory **
|
|
<a name="line1288">1288 |</a> ** fi_ent *file According file **
|
|
<a name="line1289">1289 |</a> ** **
|
|
<a name="line1290">1290 |</a> ** Result: - **
|
|
<a name="line1291">1291 |</a> ** **
|
|
<a name="line1292">1292 |</a> ** Attached Globals: - **
|
|
<a name="line1293">1293 |</a> ** **
|
|
<a name="line1294">1294 |</a> ** ************************************************************************ **
|
|
<a name="line1295">1295 |</a> ++++*/
|
|
<a name="line1296">1296 |</a>
|
|
<a name="line1297">1297 |</a> static void store_file( FILE *cacheoutput,
|
|
<a name="line1298">1298 |</a> char *dir,
|
|
<a name="line1299">1299 |</a> fi_ent *file)
|
|
<a name="line1300">1300 |</a> {
|
|
<a name="line1301">1301 |</a> int filelen; /** Length of the filename **/
|
|
<a name="line1302">1302 |</a>
|
|
<a name="line1303">1303 |</a> #if WITH_DEBUGGING_UTIL_2
|
|
<a name="line1304">1304 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_store_file, NULL);
|
|
<a name="line1305">1305 |</a> #endif
|
|
<a name="line1306">1306 |</a>
|
|
<a name="line1307">1307 |</a> /**
|
|
<a name="line1308">1308 |</a> ** Turn any weird characters into ? marks and calculate the length
|
|
<a name="line1309">1309 |</a> ** of the filename
|
|
<a name="line1310">1310 |</a> **/
|
|
<a name="line1311">1311 |</a>
|
|
<a name="line1312">1312 |</a> chk4spch( file->fi_name);
|
|
<a name="line1313">1313 |</a> filelen = strlen( file->fi_name);
|
|
<a name="line1314">1314 |</a>
|
|
<a name="line1315">1315 |</a> /**
|
|
<a name="line1316">1316 |</a> ** Don't print termporary files which are supposed to end on '~'
|
|
<a name="line1317">1317 |</a> **/
|
|
<a name="line1318">1318 |</a>
|
|
<a name="line1319">1319 |</a> if( file->fi_name[ filelen-1] != '~') {
|
|
<a name="line1320">1320 |</a> fprintf( cacheoutput, "%s/", dir);
|
|
<a name="line1321">1321 |</a> if( file->fi_prefix)
|
|
<a name="line1322">1322 |</a> fprintf( cacheoutput, "%s/", file->fi_prefix);
|
|
<a name="line1323">1323 |</a> fprintf( cacheoutput, "%s\n", file->fi_name);
|
|
<a name="line1324">1324 |</a> }
|
|
<a name="line1325">1325 |</a>
|
|
<a name="line1326">1326 |</a> /**
|
|
<a name="line1327">1327 |</a> ** Finally free up the memory that has been used to store the filename
|
|
<a name="line1328">1328 |</a> **/
|
|
<a name="line1329">1329 |</a>
|
|
<a name="line1330">1330 |</a> null_free((void *) &(file->fi_name));
|
|
<a name="line1331">1331 |</a>
|
|
<a name="line1332">1332 |</a> } /** End of 'store_file' **/
|
|
<a name="line1333">1333 |</a>
|
|
<a name="line1334">1334 |</a>
|
|
<a name="line1335">1335 |</a> /*++++
|
|
<a name="line1336">1336 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line1337">1337 |</a> ** **
|
|
<a name="line1338">1338 |</a> ** Function: create_cache_list **
|
|
<a name="line1339">1339 |</a> ** **
|
|
<a name="line1340">1340 |</a> ** Description: Read the passed cache-file and create a list of file-**
|
|
<a name="line1341">1341 |</a> ** names out of it **
|
|
<a name="line1342">1342 |</a> ** **
|
|
<a name="line1343">1343 |</a> ** First Edition: 1991/10/23 **
|
|
<a name="line1344">1344 |</a> ** **
|
|
<a name="line1345">1345 |</a> ** Parameters: FILE *cacheinput Opened cache file **
|
|
<a name="line1346">1346 |</a> ** int *count Buffer to save the number of **
|
|
<a name="line1347">1347 |</a> ** filename to **
|
|
<a name="line1348">1348 |</a> ** char *module A module pattern ... **
|
|
<a name="line1349">1349 |</a> ** **
|
|
<a name="line1350">1350 |</a> ** Result: char** NULL Abort on failure **
|
|
<a name="line1351">1351 |</a> ** else Pointer to the just created **
|
|
<a name="line1352">1352 |</a> ** list **
|
|
<a name="line1353">1353 |</a> ** *count Number of elements in the **
|
|
<a name="line1354">1354 |</a> ** list **
|
|
<a name="line1355">1355 |</a> ** **
|
|
<a name="line1356">1356 |</a> ** Attached Globals: - **
|
|
<a name="line1357">1357 |</a> ** **
|
|
<a name="line1358">1358 |</a> ** ************************************************************************ **
|
|
<a name="line1359">1359 |</a> ++++*/
|
|
<a name="line1360">1360 |</a>
|
|
<a name="line1361">1361 |</a> static char **create_cache_list( FILE *cacheinput,
|
|
<a name="line1362">1362 |</a> int *count,
|
|
<a name="line1363">1363 |</a> char *module)
|
|
<a name="line1364">1364 |</a> {
|
|
<a name="line1365">1365 |</a> char **list; /** Resulting list **/
|
|
<a name="line1366">1366 |</a> int i; /** Loop counter **/
|
|
<a name="line1367">1367 |</a> int mlen;
|
|
<a name="line1368">1368 |</a>
|
|
<a name="line1369">1369 |</a> #if WITH_DEBUGGING_UTIL_2
|
|
<a name="line1370">1370 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_create_cache_list, NULL);
|
|
<a name="line1371">1371 |</a> #endif
|
|
<a name="line1372">1372 |</a>
|
|
<a name="line1373">1373 |</a> /**
|
|
<a name="line1374">1374 |</a> ** Check the version of the passed cache file at first
|
|
<a name="line1375">1375 |</a> **/
|
|
<a name="line1376">1376 |</a>
|
|
<a name="line1377">1377 |</a> if( 1 != fscanf( cacheinput, "%s", buf))
|
|
<a name="line1378">1378 |</a> if( OK != ErrorLogger( ERR_READ, LOC, "cache", NULL))
|
|
<a name="line1379">1379 |</a> return( NULL); /** ----------- EXIT (I/O error) ----------> **/
|
|
<a name="line1380">1380 |</a>
|
|
<a name="line1381">1381 |</a> if( strcmp( buf, CACHE_VERSION))
|
|
<a name="line1382">1382 |</a> if( OK != ErrorLogger( ERR_CACHE_INVAL, LOC, buf, NULL))
|
|
<a name="line1383">1383 |</a> return( NULL); /** -- EXIT (invalid cache file version) --> **/
|
|
<a name="line1384">1384 |</a>
|
|
<a name="line1385">1385 |</a> /**
|
|
<a name="line1386">1386 |</a> ** Read the number of entries in the cache file and allocate enough
|
|
<a name="line1387">1387 |</a> ** memory for the resulting list.
|
|
<a name="line1388">1388 |</a> **/
|
|
<a name="line1389">1389 |</a>
|
|
<a name="line1390">1390 |</a> if( 1 != fscanf( cacheinput, "%d", count))
|
|
<a name="line1391">1391 |</a> if( OK != ErrorLogger( ERR_READ, LOC, "cache", NULL))
|
|
<a name="line1392">1392 |</a> return( NULL); /** ----------- EXIT (I/O error) ----------> **/
|
|
<a name="line1393">1393 |</a>
|
|
<a name="line1394">1394 |</a> if( NULL == (list = (char**) malloc( *count * sizeof(char**))))
|
|
<a name="line1395">1395 |</a> if( OK != ErrorLogger( ERR_ALLOC, LOC, NULL))
|
|
<a name="line1396">1396 |</a> return( NULL); /** ------------ EXIT (FAILURE) -----------> **/
|
|
<a name="line1397">1397 |</a>
|
|
<a name="line1398">1398 |</a> /**
|
|
<a name="line1399">1399 |</a> ** zero the cache
|
|
<a name="line1400">1400 |</a> **/
|
|
<a name="line1401">1401 |</a> (void) memset((void *) list, 0, *count * sizeof(char**));
|
|
<a name="line1402">1402 |</a>
|
|
<a name="line1403">1403 |</a> /**
|
|
<a name="line1404">1404 |</a> ** Some selection given?
|
|
<a name="line1405">1405 |</a> **/
|
|
<a name="line1406">1406 |</a>
|
|
<a name="line1407">1407 |</a> if( module)
|
|
<a name="line1408">1408 |</a> mlen = strlen( module);
|
|
<a name="line1409">1409 |</a>
|
|
<a name="line1410">1410 |</a> /**
|
|
<a name="line1411">1411 |</a> ** Now read the cache ...
|
|
<a name="line1412">1412 |</a> **/
|
|
<a name="line1413">1413 |</a>
|
|
<a name="line1414">1414 |</a> #if WITH_DEBUGGING_UTIL_2
|
|
<a name="line1415">1415 |</a> ErrorLogger( NO_ERR_DEBUG, LOC, "Read the cache", NULL);
|
|
<a name="line1416">1416 |</a> #endif
|
|
<a name="line1417">1417 |</a>
|
|
<a name="line1418">1418 |</a> for( i=0; i<*count; i++) {
|
|
<a name="line1419">1419 |</a> if( 1 != fscanf( cacheinput, "%s", buf)) {
|
|
<a name="line1420">1420 |</a> if( OK != ErrorLogger( ERR_READ, LOC, "cache", NULL)) {
|
|
<a name="line1421">1421 |</a> while( --i)
|
|
<a name="line1422">1422 |</a> null_free((void *) list + i);
|
|
<a name="line1423">1423 |</a> null_free((void *) &list);
|
|
<a name="line1424">1424 |</a> return( NULL); /** ----------- EXIT (I/O error) ----------> **/
|
|
<a name="line1425">1425 |</a> }
|
|
<a name="line1426">1426 |</a> }
|
|
<a name="line1427">1427 |</a>
|
|
<a name="line1428">1428 |</a> /**
|
|
<a name="line1429">1429 |</a> ** Check whether this is part of the selected modules ...
|
|
<a name="line1430">1430 |</a> **/
|
|
<a name="line1431">1431 |</a>
|
|
<a name="line1432">1432 |</a> if( module && strncmp( module, buf, mlen)) {
|
|
<a name="line1433">1433 |</a> --i; --*count;
|
|
<a name="line1434">1434 |</a> continue;
|
|
<a name="line1435">1435 |</a> }
|
|
<a name="line1436">1436 |</a>
|
|
<a name="line1437">1437 |</a> /**
|
|
<a name="line1438">1438 |</a> ** Save this guy
|
|
<a name="line1439">1439 |</a> **/
|
|
<a name="line1440">1440 |</a>
|
|
<a name="line1441">1441 |</a> if( NULL == (list[ i] = strdup( buf))) {
|
|
<a name="line1442">1442 |</a> if( OK != ErrorLogger( ERR_ALLOC, LOC, NULL)) {
|
|
<a name="line1443">1443 |</a> while( --i)
|
|
<a name="line1444">1444 |</a> null_free((void *) list + i);
|
|
<a name="line1445">1445 |</a> return( NULL); /** ------------ EXIT (FAILURE) -----------> **/
|
|
<a name="line1446">1446 |</a> }
|
|
<a name="line1447">1447 |</a> }
|
|
<a name="line1448">1448 |</a> }
|
|
<a name="line1449">1449 |</a>
|
|
<a name="line1450">1450 |</a> /**
|
|
<a name="line1451">1451 |</a> ** Success. Return the list created before
|
|
<a name="line1452">1452 |</a> **/
|
|
<a name="line1453">1453 |</a>
|
|
<a name="line1454">1454 |</a> return( list);
|
|
<a name="line1455">1455 |</a>
|
|
<a name="line1456">1456 |</a> } /** End of 'create_cache_list' **/
|
|
<a name="line1457">1457 |</a>
|
|
<a name="line1458">1458 |</a> #endif /** CACHE_AVAIL **/
|
|
<a name="line1459">1459 |</a>
|
|
<a name="line1460">1460 |</a> /*++++
|
|
<a name="line1461">1461 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line1462">1462 |</a> ** **
|
|
<a name="line1463">1463 |</a> ** Function: delete_cache_list **
|
|
<a name="line1464">1464 |</a> ** **
|
|
<a name="line1465">1465 |</a> ** Description: Remove an entire list of allocated strings and free **
|
|
<a name="line1466">1466 |</a> ** up the used memory **
|
|
<a name="line1467">1467 |</a> ** **
|
|
<a name="line1468">1468 |</a> ** First Edition: 1991/10/23 **
|
|
<a name="line1469">1469 |</a> ** **
|
|
<a name="line1470">1470 |</a> ** Parameters: char **list List of filenames to be print**
|
|
<a name="line1471">1471 |</a> ** int tcount Size ofd the list in elements**
|
|
<a name="line1472">1472 |</a> ** **
|
|
<a name="line1473">1473 |</a> ** Result: - **
|
|
<a name="line1474">1474 |</a> ** **
|
|
<a name="line1475">1475 |</a> ** Attached Globals: - **
|
|
<a name="line1476">1476 |</a> ** **
|
|
<a name="line1477">1477 |</a> ** ************************************************************************ **
|
|
<a name="line1478">1478 |</a> ++++*/
|
|
<a name="line1479">1479 |</a>
|
|
<a name="line1480">1480 |</a> void delete_cache_list( char **list,
|
|
<a name="line1481">1481 |</a> int tcount)
|
|
<a name="line1482">1482 |</a> {
|
|
<a name="line1483">1483 |</a> int i;
|
|
<a name="line1484">1484 |</a>
|
|
<a name="line1485">1485 |</a> #if WITH_DEBUGGING_UTIL_2
|
|
<a name="line1486">1486 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_delete_cache_list, NULL);
|
|
<a name="line1487">1487 |</a> #endif
|
|
<a name="line1488">1488 |</a>
|
|
<a name="line1489">1489 |</a> for( i=0; i<tcount; i++)
|
|
<a name="line1490">1490 |</a> null_free((void *) (list + i));
|
|
<a name="line1491">1491 |</a>
|
|
<a name="line1492">1492 |</a> null_free((void *)&list);
|
|
<a name="line1493">1493 |</a>
|
|
<a name="line1494">1494 |</a> } /** End of 'delete_cache_list' **/
|
|
<a name="line1495">1495 |</a>
|
|
<a name="line1496">1496 |</a> /*++++
|
|
<a name="line1497">1497 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line1498">1498 |</a> ** **
|
|
<a name="line1499">1499 |</a> ** Function: print_aligned_files **
|
|
<a name="line1500">1500 |</a> ** **
|
|
<a name="line1501">1501 |</a> ** Description: Print out the filenames passed in a sorted array **
|
|
<a name="line1502">1502 |</a> ** column by column taking care of the order being re- **
|
|
<a name="line1503">1503 |</a> ** flected to the single columns **
|
|
<a name="line1504">1504 |</a> ** **
|
|
<a name="line1505">1505 |</a> ** First Edition: 1991/10/23 **
|
|
<a name="line1506">1506 |</a> ** **
|
|
<a name="line1507">1507 |</a> ** Parameters: char **list List of filenames to print **
|
|
<a name="line1508">1508 |</a> ** char *path common path **
|
|
<a name="line1509">1509 |</a> ** char *header List header **
|
|
<a name="line1510">1510 |</a> ** int tcount Size of the list in elements **
|
|
<a name="line1511">1511 |</a> ** int numbered Controls printing of numbers **
|
|
<a name="line1512">1512 |</a> ** set to -1 for none **
|
|
<a name="line1513">1513 |</a> ** **
|
|
<a name="line1514">1514 |</a> ** Result: - **
|
|
<a name="line1515">1515 |</a> ** **
|
|
<a name="line1516">1516 |</a> ** Attached Globals: g_current_module The module which is handled **
|
|
<a name="line1517">1517 |</a> ** by the current command **
|
|
<a name="line1518">1518 |</a> ** **
|
|
<a name="line1519">1519 |</a> ** ************************************************************************ **
|
|
<a name="line1520">1520 |</a> ++++*/
|
|
<a name="line1521">1521 |</a>
|
|
<a name="line1522">1522 |</a> void print_aligned_files( Tcl_Interp *interp,
|
|
<a name="line1523">1523 |</a> char *path,
|
|
<a name="line1524">1524 |</a> char *header,
|
|
<a name="line1525">1525 |</a> char **list,
|
|
<a name="line1526">1526 |</a> int tcount,
|
|
<a name="line1527">1527 |</a> int numbered)
|
|
<a name="line1528">1528 |</a> {
|
|
<a name="line1529">1529 |</a> struct stat stats;
|
|
<a name="line1530">1530 |</a> struct tm *tm;
|
|
<a name="line1531">1531 |</a> char *symbols, *module, *release;
|
|
<a name="line1532">1532 |</a> char buffer[ 20];
|
|
<a name="line1533">1533 |</a> char modulefile[ MOD_BUFSIZE];
|
|
<a name="line1534">1534 |</a> char modulename[ MOD_BUFSIZE];
|
|
<a name="line1535">1535 |</a> char *timestr;
|
|
<a name="line1536">1536 |</a> char *s;
|
|
<a name="line1537">1537 |</a> int t;
|
|
<a name="line1538">1538 |</a> int terminal_width = 80;
|
|
<a name="line1539">1539 |</a> int maxlen = 0;
|
|
<a name="line1540">1540 |</a> char *modpath = NULL;
|
|
<a name="line1541">1541 |</a>
|
|
<a name="line1542">1542 |</a> #if WITH_DEBUGGING_UTIL_1
|
|
<a name="line1543">1543 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_print_aligned_files, NULL);
|
|
<a name="line1544">1544 |</a> #endif
|
|
<a name="line1545">1545 |</a>
|
|
<a name="line1546">1546 |</a> /**
|
|
<a name="line1547">1547 |</a> ** In case of terse, human output we need to obtain the size of
|
|
<a name="line1548">1548 |</a> ** the tty
|
|
<a name="line1549">1549 |</a> **/
|
|
<a name="line1550">1550 |</a>
|
|
<a name="line1551">1551 |</a> if( sw_format & (SW_HUMAN | SW_LONG) ) {
|
|
<a name="line1552">1552 |</a> struct winsize window_size;
|
|
<a name="line1553">1553 |</a> int fd_err = fileno( stderr);
|
|
<a name="line1554">1554 |</a>
|
|
<a name="line1555">1555 |</a> if( isatty( fd_err))
|
|
<a name="line1556">1556 |</a> if( ioctl( fd_err, TIOCGWINSZ, &window_size) != -1)
|
|
<a name="line1557">1557 |</a> terminal_width = (window_size.ws_col == 0) ?
|
|
<a name="line1558">1558 |</a> 80 : window_size.ws_col;
|
|
<a name="line1559">1559 |</a> }
|
|
<a name="line1560">1560 |</a>
|
|
<a name="line1561">1561 |</a> if (! path) {
|
|
<a name="line1562">1562 |</a> modpath = (char *) xgetenv( "MODULEPATH");
|
|
<a name="line1563">1563 |</a> if (! modpath) {
|
|
<a name="line1564">1564 |</a> if( OK != ErrorLogger( ERR_MODULE_PATH, LOC, NULL)) {
|
|
<a name="line1565">1565 |</a> return;
|
|
<a name="line1566">1566 |</a> }
|
|
<a name="line1567">1567 |</a> }
|
|
<a name="line1568">1568 |</a> }
|
|
<a name="line1569">1569 |</a>
|
|
<a name="line1570">1570 |</a> /**
|
|
<a name="line1571">1571 |</a> ** Scan all entries of the passed list
|
|
<a name="line1572">1572 |</a> **/
|
|
<a name="line1573">1573 |</a>
|
|
<a name="line1574">1574 |</a> _init_file_list();
|
|
<a name="line1575">1575 |</a> while( list && tcount-- && *list) {
|
|
<a name="line1576">1576 |</a> /**
|
|
<a name="line1577">1577 |</a> ** find module[/version] in filename
|
|
<a name="line1578">1578 |</a> **/
|
|
<a name="line1579">1579 |</a> if( g_current_module = s = strrchr( *list, '/')) {
|
|
<a name="line1580">1580 |</a> *s = 0;
|
|
<a name="line1581">1581 |</a> g_current_module++;
|
|
<a name="line1582">1582 |</a> if (TCL_ERROR == Locate_ModuleFile(interp, g_current_module,
|
|
<a name="line1583">1583 |</a> modulename, modulefile)) {
|
|
<a name="line1584">1584 |</a> g_current_module = strrchr(*list, '/');
|
|
<a name="line1585">1585 |</a> g_current_module++;
|
|
<a name="line1586">1586 |</a> }
|
|
<a name="line1587">1587 |</a> *s = '/';
|
|
<a name="line1588">1588 |</a> }
|
|
<a name="line1589">1589 |</a> if( !stat( *list, &stats)) {
|
|
<a name="line1590">1590 |</a>
|
|
<a name="line1591">1591 |</a> /**
|
|
<a name="line1592">1592 |</a> ** If the file is a directory, try to source the .modulerc
|
|
<a name="line1593">1593 |</a> ** file and skip to the next file
|
|
<a name="line1594">1594 |</a> **/
|
|
<a name="line1595">1595 |</a>
|
|
<a name="line1596">1596 |</a> if( S_ISDIR( stats.st_mode)) {
|
|
<a name="line1597">1597 |</a> SourceRC( interp, *list, modulerc_file);
|
|
<a name="line1598">1598 |</a> SourceVers( interp, *list, g_current_module);
|
|
<a name="line1599">1599 |</a> g_current_module = (char *) NULL;
|
|
<a name="line1600">1600 |</a> list++;
|
|
<a name="line1601">1601 |</a> continue;
|
|
<a name="line1602">1602 |</a> }
|
|
<a name="line1603">1603 |</a>
|
|
<a name="line1604">1604 |</a> /**
|
|
<a name="line1605">1605 |</a> ** get a copy of the current item to print in order not to
|
|
<a name="line1606">1606 |</a> ** change the function input
|
|
<a name="line1607">1607 |</a> **/
|
|
<a name="line1608">1608 |</a>
|
|
<a name="line1609">1609 |</a> if(path == (char *)NULL) {
|
|
<a name="line1610">1610 |</a> int maxPrefixLength = 0;
|
|
<a name="line1611">1611 |</a>
|
|
<a name="line1612">1612 |</a> if (modpath) {
|
|
<a name="line1613">1613 |</a> /**
|
|
<a name="line1614">1614 |</a> ** try to find the longest prefix from the module path
|
|
<a name="line1615">1615 |</a> ** Huge hack!
|
|
<a name="line1616">1616 |</a> **/
|
|
<a name="line1617">1617 |</a>
|
|
<a name="line1618">1618 |</a> int prefixLength;
|
|
<a name="line1619">1619 |</a> char *colon;
|
|
<a name="line1620">1620 |</a> char *prefix = modpath;
|
|
<a name="line1621">1621 |</a>
|
|
<a name="line1622">1622 |</a> while (prefix != (char *) NULL && *prefix != '\0') {
|
|
<a name="line1623">1623 |</a> colon = strchr(prefix, ':');
|
|
<a name="line1624">1624 |</a> prefixLength = colon == NULL ? strlen(prefix) :
|
|
<a name="line1625">1625 |</a> colon - prefix;
|
|
<a name="line1626">1626 |</a> while (prefix[prefixLength - 1] == '/') {
|
|
<a name="line1627">1627 |</a> prefixLength -= 1;
|
|
<a name="line1628">1628 |</a> }
|
|
<a name="line1629">1629 |</a> if (prefixLength > maxPrefixLength &&
|
|
<a name="line1630">1630 |</a> ! strncmp(*list, prefix, prefixLength) &&
|
|
<a name="line1631">1631 |</a> (*list)[prefixLength] == '/')
|
|
<a name="line1632">1632 |</a> {
|
|
<a name="line1633">1633 |</a> maxPrefixLength = prefixLength;
|
|
<a name="line1634">1634 |</a> }
|
|
<a name="line1635">1635 |</a>
|
|
<a name="line1636">1636 |</a> if (colon != NULL) {
|
|
<a name="line1637">1637 |</a> colon += 1;
|
|
<a name="line1638">1638 |</a> }
|
|
<a name="line1639">1639 |</a> prefix = colon;
|
|
<a name="line1640">1640 |</a> }
|
|
<a name="line1641">1641 |</a>
|
|
<a name="line1642">1642 |</a> /**
|
|
<a name="line1643">1643 |</a> ** Skip over '/'
|
|
<a name="line1644">1644 |</a> **/
|
|
<a name="line1645">1645 |</a> if (maxPrefixLength > 0) {
|
|
<a name="line1646">1646 |</a> maxPrefixLength += 1;
|
|
<a name="line1647">1647 |</a> }
|
|
<a name="line1648">1648 |</a> }
|
|
<a name="line1649">1649 |</a>
|
|
<a name="line1650">1650 |</a> module = strdup(*list + maxPrefixLength);
|
|
<a name="line1651">1651 |</a> } else {
|
|
<a name="line1652">1652 |</a> t = strlen(path);
|
|
<a name="line1653">1653 |</a> if (*(*list + t) == '/') t++;
|
|
<a name="line1654">1654 |</a> module = strdup(*list + t);
|
|
<a name="line1655">1655 |</a> }
|
|
<a name="line1656">1656 |</a> if((char *) NULL == module) {
|
|
<a name="line1657">1657 |</a> if( OK != ErrorLogger( ERR_ALLOC, LOC, NULL))
|
|
<a name="line1658">1658 |</a> break;
|
|
<a name="line1659">1659 |</a> else
|
|
<a name="line1660">1660 |</a> continue;
|
|
<a name="line1661">1661 |</a> }
|
|
<a name="line1662">1662 |</a>
|
|
<a name="line1663">1663 |</a> /**
|
|
<a name="line1664">1664 |</a> ** Expand the symbols and get the version of the module
|
|
<a name="line1665">1665 |</a> **/
|
|
<a name="line1666">1666 |</a>
|
|
<a name="line1667">1667 |</a> if((char *) NULL == (symbols = ExpandVersions( module)))
|
|
<a name="line1668">1668 |</a> symbols = "";
|
|
<a name="line1669">1669 |</a>
|
|
<a name="line1670">1670 |</a> if((sw_format & SW_LONG)
|
|
<a name="line1671">1671 |</a> || (char *) NULL == (release = strchr( module, '/')))
|
|
<a name="line1672">1672 |</a> release = ""; /* no release info */
|
|
<a name="line1673">1673 |</a> else
|
|
<a name="line1674">1674 |</a> *release++ = '\0';
|
|
<a name="line1675">1675 |</a>
|
|
<a name="line1676">1676 |</a> /**
|
|
<a name="line1677">1677 |</a> ** Long or short format
|
|
<a name="line1678">1678 |</a> **/
|
|
<a name="line1679">1679 |</a>
|
|
<a name="line1680">1680 |</a> if(sw_format & (SW_TERSE|SW_PARSE|SW_HUMAN)) {/** short format **/
|
|
<a name="line1681">1681 |</a> int tmp_len;
|
|
<a name="line1682">1682 |</a>
|
|
<a name="line1683">1683 |</a> if( sw_format & SW_PARSE ) {
|
|
<a name="line1684">1684 |</a> sprintf( _file_list_buffer, short_format_full,
|
|
<a name="line1685">1685 |</a> module, release, symbols);
|
|
<a name="line1686">1686 |</a> } else { /* assume a human readable format */
|
|
<a name="line1687">1687 |</a> if (*symbols) {
|
|
<a name="line1688">1688 |</a> sprintf( _file_list_buffer, short_format_full,
|
|
<a name="line1689">1689 |</a> module, release, symbols);
|
|
<a name="line1690">1690 |</a> } else {
|
|
<a name="line1691">1691 |</a> if (*release) {
|
|
<a name="line1692">1692 |</a> sprintf( _file_list_buffer,
|
|
<a name="line1693">1693 |</a> short_format_part,
|
|
<a name="line1694">1694 |</a> module, release);
|
|
<a name="line1695">1695 |</a> } else {
|
|
<a name="line1696">1696 |</a> sprintf( _file_list_buffer,
|
|
<a name="line1697">1697 |</a> short_format, module);
|
|
<a name="line1698">1698 |</a> }
|
|
<a name="line1699">1699 |</a> }
|
|
<a name="line1700">1700 |</a> }
|
|
<a name="line1701">1701 |</a> _add_file_list( _file_list_buffer);
|
|
<a name="line1702">1702 |</a>
|
|
<a name="line1703">1703 |</a> tmp_len = strlen( _file_list_buffer);
|
|
<a name="line1704">1704 |</a> if( tmp_len > maxlen)
|
|
<a name="line1705">1705 |</a> maxlen = tmp_len;
|
|
<a name="line1706">1706 |</a>
|
|
<a name="line1707">1707 |</a> } else if ( sw_format & SW_LONG) { /** long format **/
|
|
<a name="line1708">1708 |</a>
|
|
<a name="line1709">1709 |</a> /**
|
|
<a name="line1710">1710 |</a> ** Get the time of last modification
|
|
<a name="line1711">1711 |</a> **/
|
|
<a name="line1712">1712 |</a>
|
|
<a name="line1713">1713 |</a> if((struct tm *) NULL != (tm = gmtime( &stats.st_mtime))) {
|
|
<a name="line1714">1714 |</a> sprintf( buffer, "%04d/%02d/%02d %2d:%02d:%02d",
|
|
<a name="line1715">1715 |</a> 1900+tm->tm_year, tm->tm_mon + 1, tm->tm_mday,
|
|
<a name="line1716">1716 |</a> tm->tm_hour, tm->tm_min, tm->tm_sec);
|
|
<a name="line1717">1717 |</a> timestr = buffer;
|
|
<a name="line1718">1718 |</a>
|
|
<a name="line1719">1719 |</a> } else
|
|
<a name="line1720">1720 |</a> timestr = "";
|
|
<a name="line1721">1721 |</a>
|
|
<a name="line1722">1722 |</a> /**
|
|
<a name="line1723">1723 |</a> ** Now print and free what we've allocated
|
|
<a name="line1724">1724 |</a> **/
|
|
<a name="line1725">1725 |</a>
|
|
<a name="line1726">1726 |</a> fprintf( stderr, long_format, module, symbols,
|
|
<a name="line1727">1727 |</a> timestr);
|
|
<a name="line1728">1728 |</a>
|
|
<a name="line1729">1729 |</a> }
|
|
<a name="line1730">1730 |</a>
|
|
<a name="line1731">1731 |</a> null_free((void *) &module);
|
|
<a name="line1732">1732 |</a>
|
|
<a name="line1733">1733 |</a> } /** if( !stat) **/
|
|
<a name="line1734">1734 |</a>
|
|
<a name="line1735">1735 |</a> list++;
|
|
<a name="line1736">1736 |</a>
|
|
<a name="line1737">1737 |</a> } /** while **/
|
|
<a name="line1738">1738 |</a>
|
|
<a name="line1739">1739 |</a> /**
|
|
<a name="line1740">1740 |</a> ** In case of terse output we have to flush our buffer
|
|
<a name="line1741">1741 |</a> **/
|
|
<a name="line1742">1742 |</a>
|
|
<a name="line1743">1743 |</a> if( !(sw_format & SW_LONG) ) {
|
|
<a name="line1744">1744 |</a> if( _file_list_wr_ndx > 0)
|
|
<a name="line1745">1745 |</a> print_terse_files( terminal_width, maxlen, header, numbered);
|
|
<a name="line1746">1746 |</a> }
|
|
<a name="line1747">1747 |</a>
|
|
<a name="line1748">1748 |</a> if (! modpath) {
|
|
<a name="line1749">1749 |</a> null_free((void *)&modpath);
|
|
<a name="line1750">1750 |</a> }
|
|
<a name="line1751">1751 |</a>
|
|
<a name="line1752">1752 |</a> #if WITH_DEBUGGING_UTIL_1
|
|
<a name="line1753">1753 |</a> ErrorLogger( NO_ERR_END, LOC, _proc_print_aligned_files, NULL);
|
|
<a name="line1754">1754 |</a> #endif
|
|
<a name="line1755">1755 |</a>
|
|
<a name="line1756">1756 |</a> } /** End of 'print_aligned_files' **/
|
|
<a name="line1757">1757 |</a>
|
|
<a name="line1758">1758 |</a> /*++++
|
|
<a name="line1759">1759 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line1760">1760 |</a> ** **
|
|
<a name="line1761">1761 |</a> ** Function: print_terse_files **
|
|
<a name="line1762">1762 |</a> ** **
|
|
<a name="line1763">1763 |</a> ** Description: Print out the filenames in the _file_list array in **
|
|
<a name="line1764">1764 |</a> ** case of terse output **
|
|
<a name="line1765">1765 |</a> ** **
|
|
<a name="line1766">1766 |</a> ** First Edition: 1991/10/23 **
|
|
<a name="line1767">1767 |</a> ** **
|
|
<a name="line1768">1768 |</a> ** Parameters: int terminal_width Terminal size **
|
|
<a name="line1769">1769 |</a> ** int len max. filename length **
|
|
<a name="line1770">1770 |</a> ** char *header header to print **
|
|
<a name="line1771">1771 |</a> ** int number value to start number**
|
|
<a name="line1772">1772 |</a> ** use -1 for none **
|
|
<a name="line1773">1773 |</a> ** **
|
|
<a name="line1774">1774 |</a> ** Result: - **
|
|
<a name="line1775">1775 |</a> ** **
|
|
<a name="line1776">1776 |</a> ** Attached Globals: - **
|
|
<a name="line1777">1777 |</a> ** **
|
|
<a name="line1778">1778 |</a> ** ************************************************************************ **
|
|
<a name="line1779">1779 |</a> ++++*/
|
|
<a name="line1780">1780 |</a>
|
|
<a name="line1781">1781 |</a> static void print_terse_files( int terminal_width,
|
|
<a name="line1782">1782 |</a> int len,
|
|
<a name="line1783">1783 |</a> char *header,
|
|
<a name="line1784">1784 |</a> int numbered)
|
|
<a name="line1785">1785 |</a> {
|
|
<a name="line1786">1786 |</a> char *module;
|
|
<a name="line1787">1787 |</a> char *moduleright;
|
|
<a name="line1788">1788 |</a>
|
|
<a name="line1789">1789 |</a> /**
|
|
<a name="line1790">1790 |</a> ** Print human readable lists
|
|
<a name="line1791">1791 |</a> **/
|
|
<a name="line1792">1792 |</a>
|
|
<a name="line1793">1793 |</a> len += (numbered != -1 ? 6 : 1);
|
|
<a name="line1794">1794 |</a> if( sw_format & SW_HUMAN ) {
|
|
<a name="line1795">1795 |</a> int columns = (terminal_width - 1) / len;
|
|
<a name="line1796">1796 |</a> int col_ndx, row_ndx;
|
|
<a name="line1797">1797 |</a> int rows;
|
|
<a name="line1798">1798 |</a> int mod_ndx;
|
|
<a name="line1799">1799 |</a>
|
|
<a name="line1800">1800 |</a> /**
|
|
<a name="line1801">1801 |</a> ** Print the header line
|
|
<a name="line1802">1802 |</a> **/
|
|
<a name="line1803">1803 |</a>
|
|
<a name="line1804">1804 |</a> if( header) {
|
|
<a name="line1805">1805 |</a> int lin_len = terminal_width - strlen( header) - 2;
|
|
<a name="line1806">1806 |</a> int i;
|
|
<a name="line1807">1807 |</a>
|
|
<a name="line1808">1808 |</a> fprintf( stderr, "\n");
|
|
<a name="line1809">1809 |</a>
|
|
<a name="line1810">1810 |</a> if( lin_len >= 2)
|
|
<a name="line1811">1811 |</a> for( i = 0; i < lin_len / 2; i++)
|
|
<a name="line1812">1812 |</a> fprintf( stderr, "-");
|
|
<a name="line1813">1813 |</a>
|
|
<a name="line1814">1814 |</a> fprintf( stderr, " %s ", header);
|
|
<a name="line1815">1815 |</a>
|
|
<a name="line1816">1816 |</a> if( lin_len >= 2)
|
|
<a name="line1817">1817 |</a> for( i = 0; i < (lin_len+1) / 2; i++)
|
|
<a name="line1818">1818 |</a> fprintf( stderr, "-");
|
|
<a name="line1819">1819 |</a>
|
|
<a name="line1820">1820 |</a> fprintf( stderr, "\n");
|
|
<a name="line1821">1821 |</a> }
|
|
<a name="line1822">1822 |</a>
|
|
<a name="line1823">1823 |</a> /**
|
|
<a name="line1824">1824 |</a> ** Print the columns
|
|
<a name="line1825">1825 |</a> **/
|
|
<a name="line1826">1826 |</a>
|
|
<a name="line1827">1827 |</a>
|
|
<a name="line1828">1828 |</a> if( !columns)
|
|
<a name="line1829">1829 |</a> columns = 1;
|
|
<a name="line1830">1830 |</a> rows = (_file_list_wr_ndx + columns - 1) / columns;
|
|
<a name="line1831">1831 |</a>
|
|
<a name="line1832">1832 |</a> for( row_ndx = 0; row_ndx < rows; row_ndx++) {
|
|
<a name="line1833">1833 |</a> for( col_ndx = 0; col_ndx < columns; col_ndx++) {
|
|
<a name="line1834">1834 |</a>
|
|
<a name="line1835">1835 |</a> mod_ndx = row_ndx + col_ndx * rows;
|
|
<a name="line1836">1836 |</a>
|
|
<a name="line1837">1837 |</a> if( module = _pick_file_list( mod_ndx)) {
|
|
<a name="line1838">1838 |</a> moduleright = _pick_file_list( row_ndx + (col_ndx+1)* rows);
|
|
<a name="line1839">1839 |</a>
|
|
<a name="line1840">1840 |</a> print_spaced_file( module, len,
|
|
<a name="line1841">1841 |</a> ( (col_ndx == columns - 1)
|
|
<a name="line1842">1842 |</a> || (moduleright == (char *) NULL)
|
|
<a name="line1843">1843 |</a> ? 0 : 1 ),
|
|
<a name="line1844">1844 |</a> ( (numbered == -1) ? numbered : ++mod_ndx) );
|
|
<a name="line1845">1845 |</a> }
|
|
<a name="line1846">1846 |</a> }
|
|
<a name="line1847">1847 |</a> fprintf( stderr, "\n");
|
|
<a name="line1848">1848 |</a> }
|
|
<a name="line1849">1849 |</a> }
|
|
<a name="line1850">1850 |</a>
|
|
<a name="line1851">1851 |</a> /**
|
|
<a name="line1852">1852 |</a> ** Print parseable lists
|
|
<a name="line1853">1853 |</a> **/
|
|
<a name="line1854">1854 |</a>
|
|
<a name="line1855">1855 |</a> else {
|
|
<a name="line1856">1856 |</a> while( module = _get_file_list()) {
|
|
<a name="line1857">1857 |</a> fprintf( stderr, "%s\n", module);
|
|
<a name="line1858">1858 |</a> }
|
|
<a name="line1859">1859 |</a> }
|
|
<a name="line1860">1860 |</a> }
|
|
<a name="line1861">1861 |</a>
|
|
<a name="line1862">1862 |</a> /*++++
|
|
<a name="line1863">1863 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line1864">1864 |</a> ** **
|
|
<a name="line1865">1865 |</a> ** Function: _add_file_list **
|
|
<a name="line1866">1866 |</a> ** _init_file_list **
|
|
<a name="line1867">1867 |</a> ** _get_file_list **
|
|
<a name="line1868">1868 |</a> ** _pick_file_list **
|
|
<a name="line1869">1869 |</a> ** **
|
|
<a name="line1870">1870 |</a> ** Description: File list functions for terse module display mode **
|
|
<a name="line1871">1871 |</a> ** **
|
|
<a name="line1872">1872 |</a> ** First Edition: 1991/10/23 **
|
|
<a name="line1873">1873 |</a> ** **
|
|
<a name="line1874">1874 |</a> ** Parameters: char *name Name to be stored **
|
|
<a name="line1875">1875 |</a> ** **
|
|
<a name="line1876">1876 |</a> ** Result: - **
|
|
<a name="line1877">1877 |</a> ** **
|
|
<a name="line1878">1878 |</a> ** Attached Globals: - **
|
|
<a name="line1879">1879 |</a> ** **
|
|
<a name="line1880">1880 |</a> ** ************************************************************************ **
|
|
<a name="line1881">1881 |</a> ++++*/
|
|
<a name="line1882">1882 |</a>
|
|
<a name="line1883">1883 |</a> static void _init_file_list()
|
|
<a name="line1884">1884 |</a> {
|
|
<a name="line1885">1885 |</a> if( _file_list_ptr && !_file_list_cnt) {
|
|
<a name="line1886">1886 |</a> null_free((void *) &_file_list_ptr);
|
|
<a name="line1887">1887 |</a> _file_list_cnt = 0;
|
|
<a name="line1888">1888 |</a> }
|
|
<a name="line1889">1889 |</a>
|
|
<a name="line1890">1890 |</a> _file_list_wr_ndx = 0;
|
|
<a name="line1891">1891 |</a> _file_list_rd_ndx = 0;
|
|
<a name="line1892">1892 |</a> }
|
|
<a name="line1893">1893 |</a>
|
|
<a name="line1894">1894 |</a> static void _add_file_list( char *name)
|
|
<a name="line1895">1895 |</a> {
|
|
<a name="line1896">1896 |</a> /**
|
|
<a name="line1897">1897 |</a> ** Parameter check
|
|
<a name="line1898">1898 |</a> **/
|
|
<a name="line1899">1899 |</a>
|
|
<a name="line1900">1900 |</a> if( !name || !*name)
|
|
<a name="line1901">1901 |</a> return;
|
|
<a name="line1902">1902 |</a>
|
|
<a name="line1903">1903 |</a> /**
|
|
<a name="line1904">1904 |</a> ** Reallocate if the current array is to small
|
|
<a name="line1905">1905 |</a> **/
|
|
<a name="line1906">1906 |</a>
|
|
<a name="line1907">1907 |</a> if( _file_list_cnt <= _file_list_wr_ndx) {
|
|
<a name="line1908">1908 |</a> _file_list_cnt += FILE_LIST_SEGM_SIZE;
|
|
<a name="line1909">1909 |</a>
|
|
<a name="line1910">1910 |</a> if( !_file_list_ptr)
|
|
<a name="line1911">1911 |</a> _file_list_ptr = (char **) malloc(_file_list_cnt * sizeof(char *));
|
|
<a name="line1912">1912 |</a> else
|
|
<a name="line1913">1913 |</a> _file_list_ptr = (char **) realloc( _file_list_ptr,
|
|
<a name="line1914">1914 |</a> _file_list_cnt * sizeof(char *));
|
|
<a name="line1915">1915 |</a>
|
|
<a name="line1916">1916 |</a> }
|
|
<a name="line1917">1917 |</a>
|
|
<a name="line1918">1918 |</a> /**
|
|
<a name="line1919">1919 |</a> ** Save the passed name, if the allocation succeeded
|
|
<a name="line1920">1920 |</a> **/
|
|
<a name="line1921">1921 |</a>
|
|
<a name="line1922">1922 |</a> if( !_file_list_ptr) {
|
|
<a name="line1923">1923 |</a> ErrorLogger( ERR_ALLOC, LOC, NULL);
|
|
<a name="line1924">1924 |</a> _file_list_cnt = 0;
|
|
<a name="line1925">1925 |</a> _file_list_wr_ndx = 0;
|
|
<a name="line1926">1926 |</a> _file_list_rd_ndx = 0;
|
|
<a name="line1927">1927 |</a>
|
|
<a name="line1928">1928 |</a> } else {
|
|
<a name="line1929">1929 |</a> _file_list_ptr[ _file_list_wr_ndx++] = strdup( name);
|
|
<a name="line1930">1930 |</a> }
|
|
<a name="line1931">1931 |</a> }
|
|
<a name="line1932">1932 |</a>
|
|
<a name="line1933">1933 |</a> static char *_get_file_list()
|
|
<a name="line1934">1934 |</a> {
|
|
<a name="line1935">1935 |</a> return((_file_list_rd_ndx < _file_list_wr_ndx) ?
|
|
<a name="line1936">1936 |</a> _file_list_ptr[ _file_list_rd_ndx++] : (char *) NULL);
|
|
<a name="line1937">1937 |</a> }
|
|
<a name="line1938">1938 |</a>
|
|
<a name="line1939">1939 |</a> static char *_pick_file_list( int ndx)
|
|
<a name="line1940">1940 |</a> {
|
|
<a name="line1941">1941 |</a> return((ndx < _file_list_wr_ndx) ? _file_list_ptr[ ndx] : (char *) NULL);
|
|
<a name="line1942">1942 |</a> }
|
|
<a name="line1943">1943 |</a>
|
|
<a name="line1944">1944 |</a> /*++++
|
|
<a name="line1945">1945 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line1946">1946 |</a> ** **
|
|
<a name="line1947">1947 |</a> ** Function: print_spaced_file **
|
|
<a name="line1948">1948 |</a> ** **
|
|
<a name="line1949">1949 |</a> ** Description: Print out the passed filename and fill the output **
|
|
<a name="line1950">1950 |</a> ** area up to the passed number of characters **
|
|
<a name="line1951">1951 |</a> ** **
|
|
<a name="line1952">1952 |</a> ** First Edition: 1991/10/23 **
|
|
<a name="line1953">1953 |</a> ** **
|
|
<a name="line1954">1954 |</a> ** Parameters: char *name Name to be printed **
|
|
<a name="line1955">1955 |</a> ** int maxwidth With of the output field to **
|
|
<a name="line1956">1956 |</a> ** be filled up **
|
|
<a name="line1957">1957 |</a> ** int space Boolean value controlling if **
|
|
<a name="line1958">1958 |</a> ** the output area should be **
|
|
<a name="line1959">1959 |</a> ** filled up with spaces or not **
|
|
<a name="line1960">1960 |</a> ** int number value to start number list **
|
|
<a name="line1961">1961 |</a> ** use -1 for none **
|
|
<a name="line1962">1962 |</a> ** **
|
|
<a name="line1963">1963 |</a> ** Result: - **
|
|
<a name="line1964">1964 |</a> ** **
|
|
<a name="line1965">1965 |</a> ** Attached Globals: - **
|
|
<a name="line1966">1966 |</a> ** **
|
|
<a name="line1967">1967 |</a> ** ************************************************************************ **
|
|
<a name="line1968">1968 |</a> ++++*/
|
|
<a name="line1969">1969 |</a>
|
|
<a name="line1970">1970 |</a> static void print_spaced_file( char *name,
|
|
<a name="line1971">1971 |</a> int maxwidth,
|
|
<a name="line1972">1972 |</a> int space,
|
|
<a name="line1973">1973 |</a> int number)
|
|
<a name="line1974">1974 |</a> {
|
|
<a name="line1975">1975 |</a> int filelen; /** Length of the filename to print **/
|
|
<a name="line1976">1976 |</a>
|
|
<a name="line1977">1977 |</a> #if WITH_DEBUGGING_UTIL_2
|
|
<a name="line1978">1978 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_print_spaced_file, NULL);
|
|
<a name="line1979">1979 |</a> #endif
|
|
<a name="line1980">1980 |</a>
|
|
<a name="line1981">1981 |</a> chk4spch( name); /** turn any weird characters into ? marks **/
|
|
<a name="line1982">1982 |</a>
|
|
<a name="line1983">1983 |</a> /**
|
|
<a name="line1984">1984 |</a> ** Print the name and calculate its length
|
|
<a name="line1985">1985 |</a> **/
|
|
<a name="line1986">1986 |</a>
|
|
<a name="line1987">1987 |</a> filelen = strlen( name);
|
|
<a name="line1988">1988 |</a> if( -1 != number) {
|
|
<a name="line1989">1989 |</a> fprintf( stderr, "%3d) ", number);
|
|
<a name="line1990">1990 |</a> filelen += 5;
|
|
<a name="line1991">1991 |</a> }
|
|
<a name="line1992">1992 |</a>
|
|
<a name="line1993">1993 |</a> fprintf(stderr, "%s", name);
|
|
<a name="line1994">1994 |</a>
|
|
<a name="line1995">1995 |</a> /**
|
|
<a name="line1996">1996 |</a> ** Conditionally fill the output area with spaces
|
|
<a name="line1997">1997 |</a> **/
|
|
<a name="line1998">1998 |</a>
|
|
<a name="line1999">1999 |</a> if( space) {
|
|
<a name="line2000">2000 |</a> putc(' ', stderr);
|
|
<a name="line2001">2001 |</a> while( ++filelen < maxwidth)
|
|
<a name="line2002">2002 |</a> putc(' ', stderr);
|
|
<a name="line2003">2003 |</a> }
|
|
<a name="line2004">2004 |</a>
|
|
<a name="line2005">2005 |</a> } /** end of 'print_spaced_file' **/
|
|
<a name="line2006">2006 |</a>
|
|
<a name="line2007">2007 |</a> /*++++
|
|
<a name="line2008">2008 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line2009">2009 |</a> ** **
|
|
<a name="line2010">2010 |</a> ** Function: mkdirnm **
|
|
<a name="line2011">2011 |</a> ** **
|
|
<a name="line2012">2012 |</a> ** Description: Build a full pathname out of the passed directory **
|
|
<a name="line2013">2013 |</a> ** and file **
|
|
<a name="line2014">2014 |</a> ** **
|
|
<a name="line2015">2015 |</a> ** First Edition: 1991/10/23 **
|
|
<a name="line2016">2016 |</a> ** **
|
|
<a name="line2017">2017 |</a> ** Parameters: char *dir The directory to be used **
|
|
<a name="line2018">2018 |</a> ** char *file The filename w/o path **
|
|
<a name="line2019">2019 |</a> ** **
|
|
<a name="line2020">2020 |</a> ** Result: char* NULL Compound filename to long **
|
|
<a name="line2021">2021 |</a> ** else Pointer to the full path **
|
|
<a name="line2022">2022 |</a> ** **
|
|
<a name="line2023">2023 |</a> ** Attached Globals: - **
|
|
<a name="line2024">2024 |</a> ** **
|
|
<a name="line2025">2025 |</a> ** ************************************************************************ **
|
|
<a name="line2026">2026 |</a> ++++*/
|
|
<a name="line2027">2027 |</a>
|
|
<a name="line2028">2028 |</a> static char *mkdirnm( char *dir,
|
|
<a name="line2029">2029 |</a> char *file)
|
|
<a name="line2030">2030 |</a> {
|
|
<a name="line2031">2031 |</a> static char dirbuf[ MOD_BUFSIZE]; /** Buffer for path creation **/
|
|
<a name="line2032">2032 |</a>
|
|
<a name="line2033">2033 |</a> #if WITH_DEBUGGING_UTIL_2
|
|
<a name="line2034">2034 |</a> ErrorLogger( NO_ERR_START, LOC, _proc_mkdirnm, ", dir='", dir, ", file='",
|
|
<a name="line2035">2035 |</a> file, "'", NULL);
|
|
<a name="line2036">2036 |</a> #endif
|
|
<a name="line2037">2037 |</a>
|
|
<a name="line2038">2038 |</a> /**
|
|
<a name="line2039">2039 |</a> ** If only a file is given, or the file is in the current directory
|
|
<a name="line2040">2040 |</a> ** return just the file.
|
|
<a name="line2041">2041 |</a> **/
|
|
<a name="line2042">2042 |</a>
|
|
<a name="line2043">2043 |</a> if( dir == NULL || *dir == '\0' || !strcmp(dir,"."))
|
|
<a name="line2044">2044 |</a> return( strcpy( dirbuf, file));
|
|
<a name="line2045">2045 |</a>
|
|
<a name="line2046">2046 |</a> /**
|
|
<a name="line2047">2047 |</a> ** Check whether the full path fits into the buffer
|
|
<a name="line2048">2048 |</a> **/
|
|
<a name="line2049">2049 |</a>
|
|
<a name="line2050">2050 |</a> if( (int) ( strlen( dir) + 1 + strlen( file) + 1 ) > MOD_BUFSIZE) {
|
|
<a name="line2051">2051 |</a> if( OK != ErrorLogger( ERR_NAMETOLONG, LOC, dir, file, NULL))
|
|
<a name="line2052">2052 |</a> return( NULL);
|
|
<a name="line2053">2053 |</a> }
|
|
<a name="line2054">2054 |</a>
|
|
<a name="line2055">2055 |</a> /**
|
|
<a name="line2056">2056 |</a> ** Copy directory and file into the buffer taking care that there will
|
|
<a name="line2057">2057 |</a> ** be no double slash ...
|
|
<a name="line2058">2058 |</a> **/
|
|
<a name="line2059">2059 |</a>
|
|
<a name="line2060">2060 |</a> strcpy( dirbuf, dir);
|
|
<a name="line2061">2061 |</a> if( dir[ strlen( dir) - 1] != '/' && file[0] != '/')
|
|
<a name="line2062">2062 |</a> strcat( dirbuf, "/");
|
|
<a name="line2063">2063 |</a> return( strcat( dirbuf, file));
|
|
<a name="line2064">2064 |</a>
|
|
<a name="line2065">2065 |</a> } /** End of 'mkdirnm' **/
|
|
<a name="line2066">2066 |</a>
|
|
<a name="line2067">2067 |</a> /*++++
|
|
<a name="line2068">2068 |</a> ** ** Function-Header ***************************************************** **
|
|
<a name="line2069">2069 |</a> ** **
|
|
<a name="line2070">2070 |</a> ** Function: fi_ent_cmp **
|
|
<a name="line2071">2071 |</a> ** **
|
|
<a name="line2072">2072 |</a> ** Description: compares two file entry structures **
|
|
<a name="line2073">2073 |</a> ** Different cmdline arguments (i.e. -u, -c, -t, -z) **
|
|
<a name="line2074">2074 |</a> ** will change what value is compared. As a default, **
|
|
<a name="line2075">2075 |</a> ** the name is used. **
|
|
<a name="line2076">2076 |</a> ** **
|
|
<a name="line2077">2077 |</a> ** Notes: This procedure is used as comparison function for **
|
|
<a name="line2078">2078 |</a> ** qsort() **
|
|
<a name="line2079">2079 |</a> ** **
|
|
<a name="line2080">2080 |</a> ** First Edition: 1991/10/23 **
|
|
<a name="line2081">2081 |</a> ** **
|
|
<a name="line2082">2082 |</a> ** Parameters: const void *fi1 First file entry **
|
|
<a name="line2083">2083 |</a> ** const void *fi2 Second one to compare **
|
|
<a name="line2084">2084 |</a> ** **
|
|
<a name="line2085">2085 |</a> ** Result: int 1 fi2 > fi1 **
|
|
<a name="line2086">2086 |</a> ** -1 fi2 < fi1 **
|
|
<a name="line2087">2087 |</a> ** 0 fi2 == fi1 **
|
|
<a name="line2088">2088 |</a> ** **
|
|
<a name="line2089">2089 |</a> ** Attached Globals: **
|
|
<a name="line2090">2090 |</a> ** **
|
|
<a name="line2091">2091 |</a> ** ************************************************************************ **
|
|
<a name="line2092">2092 |</a> ++++*/
|
|
<a name="line2093">2093 |</a>
|
|
<a name="line2094">2094 |</a> static int fi_ent_cmp( const void *fi1,
|
|
<a name="line2095">2095 |</a> const void *fi2)
|
|
<a name="line2096">2096 |</a> {
|
|
<a name="line2097">2097 |</a>
|
|
<a name="line2098">2098 |</a> #ifdef DEF_COLLATE_BY_NUMBER
|
|
<a name="line2099">2099 |</a> return colcomp( ((fi_ent*)fi1)->fi_name, ((fi_ent*)fi2)->fi_name);
|
|
<a name="line2100">2100 |</a> #else
|
|
<a name="line2101">2101 |</a> return strcmp( ((fi_ent*)fi1)->fi_name, ((fi_ent*)fi2)->fi_name);
|
|
<a name="line2102">2102 |</a> #endif
|
|
<a name="line2103">2103 |</a> }
|
|
</pre>
|
|
|
|
</BODY>
|
|
</HTML>
|