home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume38 / lude / part05 < prev    next >
Text File  |  1993-07-12  |  67KB  |  2,389 lines

  1. Newsgroups: comp.sources.misc
  2. From: laplante@crim.ca (Pierre Laplante)
  3. Subject: v38i037:  lude - A Distributed Software Library, Part05/12
  4. Message-ID: <1993Jul11.224608.16487@sparky.imd.sterling.com>
  5. X-Md4-Signature: b91825914cb7b50e42010010fc5b6915
  6. Sender: kent@sparky.imd.sterling.com (Kent Landfield)
  7. Organization: Sterling Software
  8. Date: Sun, 11 Jul 1993 22:46:08 GMT
  9. Approved: kent@sparky.sterling.com
  10.  
  11. Submitted-by: laplante@crim.ca (Pierre Laplante)
  12. Posting-number: Volume 38, Issue 37
  13. Archive-name: lude/part05
  14. Environment: UNIX
  15.  
  16. #! /bin/sh
  17. # This is a shell archive.  Remove anything before this line, then feed it
  18. # into a shell via "sh file" or similar.  To overwrite existing files,
  19. # type "sh file -c".
  20. # Contents:  lude-1.1/run/crim/sun4.1_sparc/bin/lude
  21. #   lude-1.1/run/crim/sun4.1_sparc/lib/lude/lang/ludelist
  22. #   lude-1.1/src/orig/src/lude
  23. # Wrapped by kent@sparky on Sun Jul 11 15:49:14 1993
  24. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
  25. echo If this archive is complete, you will see the following message:
  26. echo '          "shar: End of archive 5 (of 12)."'
  27. if test -f 'lude-1.1/run/crim/sun4.1_sparc/bin/lude' -a "${1}" != "-c" ; then 
  28.   echo shar: Will not clobber existing file \"'lude-1.1/run/crim/sun4.1_sparc/bin/lude'\"
  29. else
  30.   echo shar: Extracting \"'lude-1.1/run/crim/sun4.1_sparc/bin/lude'\" \(28996 characters\)
  31.   sed "s/^X//" >'lude-1.1/run/crim/sun4.1_sparc/bin/lude' <<'END_OF_FILE'
  32. X#!/usr/local/bin/perl
  33. X
  34. X# Lude - Lude Project.
  35. X# Copyright (C) 1991, 1992  Pierre Laplante
  36. X# Copyright (C) 1992 Stephane Boucher.
  37. X#
  38. X# This program is free software; you can redistribute it and/or modify
  39. X# it under the terms of the GNU General Public License as published by
  40. X# the Free Software Foundation; either version 1, or (at your option)
  41. X# any later version.
  42. X#
  43. X# This program is distributed in the hope that it will be useful,
  44. X# but WITHOUT ANY WARRANTY; without even the implied warranty of
  45. X# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  46. X# GNU General Public License for more details.
  47. X#
  48. X# You should have received a copy of the GNU General Public License
  49. X# along with this program; if not, write to the Free Software
  50. X# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  51. X
  52. X$FULL_VERSION=
  53. X    "-- lude --\n" .
  54. X    "This is part of LUDE (Logitheque Universitaire Distribuee et Extensible)\n\n";
  55. X
  56. X$FULL_VERSION.='$Id: lude,v 1.7 1993/06/01 16:57:00 dagenais Exp $' . "\n";
  57. X
  58. X$VERSION='1.1';
  59. X#-----------------------------------------------------------------------
  60. X#    Globals definitions
  61. X#
  62. X$PL_INCDIR="/usr/local/soft/lude-1.1/run/crim/sun4.1_sparc/include/lude:../include";
  63. X$LANG_PATH="/usr/local/soft/lude-1.1/run/crim/sun4.1_sparc/lib/lude/lang:../lib/lude/lang:../lang";
  64. X$MAPPING="mapping";
  65. X$BEFORELINK="beforelink";
  66. X$AFTERLINK="afterlink";
  67. X$BEFORERMLINK="beforermlink";
  68. X$AFTERRMLINK="afterrmlink";
  69. X$INSTALL="install";
  70. X$RENAME="rename";
  71. X$EXCLUDE="exclude";
  72. X
  73. X#-----------------------------------------------------------------------
  74. X# Main program
  75. X#
  76. X# Description :
  77. X#      The execution of the script goes through three phases:
  78. X#      1. Verification of the system:
  79. X#            Check to see if the OS has the necessary 
  80. X#            functionnality to support lude.
  81. X#            Check the availability of the various commands
  82. X#            that will be use by Lude.
  83. X#      2. Initialisation
  84. X#            Initialise various global variables.
  85. X#            Parse, the command line arguments, and validate
  86. X#            them.
  87. X#      3. execution of the commands
  88. X#            According to the command line arguments, perform
  89. X#            the appropriate actions.
  90. X#
  91. Xmain: {
  92. X    local($exitval)=0;        # Success by default
  93. X    local(@OLDARGV)=@ARGV;
  94. X    local($cmdsToDo);
  95. X
  96. X    unshift(@INC,split(/:/, "$PL_INCDIR"));
  97. X
  98. X    require('config.pl');
  99. X
  100. X    # Load and initialise the language support immediatly so
  101. X    # that the messages are available the soonest possible.
  102. X    # If an error occure in this phase, the execution is 
  103. X    # immediatly aborted.
  104. X    require('ludelang.pl');
  105. X    &InitLang($CONF_LANG_DEFAULT, $LANG_PATH, 'ludemisc', @ARGV);
  106. X    &InitLang($CONF_LANG_DEFAULT, $LANG_PATH, 'lude', @ARGV);
  107. X    &InitLang($CONF_LANG_DEFAULT, $LANG_PATH, 'ludedatafiles', @ARGV);
  108. X
  109. X    # Include other perl files required for this script.
  110. X    require("ludemisc");    # subroutines and variables
  111. X                # common to all Lude scripts.
  112. X    require("ludeinc");        # subroutines and variables
  113. X                # required by the script lude.
  114. X    require("fileutil.pl");
  115. X    require("BldRegexpMinRqr.pl");
  116. X
  117. X    # Execution of phase 1: Verification of the system.
  118. X    if (! &VerifySystem) {
  119. X        # An error occured.
  120. X        $exitval=1;
  121. X    }
  122. X    # Execution of phase 2: Initialisation and arguments parsing.
  123. X    elsif (($cmdsToDo=&Initialisation) < 0) {
  124. X        # An error occured
  125. X        $exitval=2;
  126. X    }
  127. X    elsif ( -x "$SERVER_DIR/$Server/$Software/install/$Modification/$Class/$INSTALL") {
  128. X      # A replacement script was found. Execute that
  129. X        # script rather than using the present script.
  130. X      &RunCmd("$SERVER_DIR/$Server/$Software/install/$Modification/$Class/$INSTALL @OLDARGV");
  131. X    }
  132. X    # If any command(s) left to be executed
  133. X    elsif ($cmdsToDo > 0) {
  134. X        # No error occured so far
  135. X        if (! &ExecCommands) {
  136. X        $exitval=3;
  137. X        }
  138. X    }
  139. X
  140. X    exit $exitval;
  141. X}
  142. X
  143. X
  144. X#-----------------------------------------------------------------------
  145. X# Description : Read the mapping file and put the result in
  146. X#              2 global arrays:
  147. X#                       $Rename{"from_rep"}="to_rep"
  148. X#                       @Exclude
  149. X#
  150. X# Parameters  : $mapping - mapping file name
  151. X#
  152. X# Returns     : 1 on success
  153. X#               0 if any errors
  154. X#
  155. Xsub ReadMapping {
  156. X    # Make sure that the number of parameters is correct
  157. X    if(scalar(@_)!=1){&Error($ERR_INTERNAL,sprintf("(%d), %s:%d",scalar(@_),__FILE__,__LINE__));}
  158. X    local($mapping)=@_;
  159. X    local($retval)=1;        # Success by default
  160. X
  161. X    local($origline, @fields, *fmap);
  162. X
  163. X    if (! open(fmap, $mapping)) {
  164. X    &NFError($ERR_OPEN, $mapping);
  165. X    $retval=0;
  166. X    }
  167. X    else {
  168. X    while (<fmap>) {
  169. X        # Save a copy of the original line before manipulation 
  170. X        $origline=$_;
  171. X
  172. X        # Remove spaces at the beginning of the line,
  173. X        # and the comment if any.
  174. X        $_ =~ s/^\s*([^#]*)(#.*)?$/$1/o;
  175. X         # If the line is empty go to next line
  176. X        next if (/^\s*$/o);
  177. X            # Remove the spaces at the end of the line, if any.
  178. X            $_ =~ s/^(.*[^\s])\s*$/$1/o;
  179. X
  180. X            (@fields)=split(/\s+/);
  181. X
  182. X            # Rename command
  183. X        if ($fields[0] =~ m/^$RENAME$/oi && scalar(@fields)==3) {
  184. X             $Rename{$fields[1]}=$fields[2];
  185. X          } 
  186. X            # Exclude command
  187. X        elsif ($fields[0] =~ m/^$EXCLUDE$/oi && scalar(@fields)==2) {
  188. X             push(@Exclude, $fields[1]);
  189. X          } 
  190. X            # Unrecognized command
  191. X            else {
  192. X            &NFError($ERR_INVCMD, "$origline");
  193. X              $retval=0;
  194. X          }
  195. X        }
  196. X        close(fmap);
  197. X
  198. X    }
  199. X    return($retval);
  200. X}
  201. X
  202. X
  203. X#-----------------------------------------------------------------------
  204. X# Description  : Copies the given server/soft/mod/class
  205. X#                to the given target server.
  206. X# 
  207. X# Parameters   : $target - server location where a copy is to be
  208. X#                          placed.
  209. X#                          if eq '', then $SOFT_DIR is used.
  210. X#                $server - server location where the software to
  211. X#                          copy is located.
  212. X#                          if eq '/', then $SOFT_DIR is used.
  213. X#                $soft   - software on which to perform the action.
  214. X#                $mod    - modification  ...
  215. X#                $class  - class (some class or '')
  216. X#                $copy   - parts to copy (run,src,install,none)
  217. X#
  218. X# Returns      : 1 on success
  219. X#                0 if any errors
  220. X#
  221. Xsub Copy {
  222. X    if(scalar(@_)!=6){&Error($ERR_INTERNAL,sprintf("(%d), %s:%d", scalar(@_),__FILE__,__LINE__));}
  223. X    local($target, $server, $soft, $mod, $class, $copy)=@_;
  224. X    local($space, $total)=(0,0);
  225. X    local($tmp, $subtotal);
  226. X    local($todir);        # Destination directory of the copy
  227. X    local($fromdir);
  228. X    local($retval)=1;        # Success by default
  229. X
  230. X    if ($target eq $server) {    # Error: can't copy on itself
  231. X      &NFError($ERR_CANNOT_CP_SOFT_ON_ITSELF);
  232. X      $retval=0;
  233. X    }
  234. X    else {
  235. X      # Set the destination directory for the copy
  236. X      $todir  =($target ne '/') ? "$SERVER_DIR/$target" : "$SOFT_DIR";
  237. X      # Set the directory of the original files for the copy
  238. X      $fromdir=($server ne '/') ? "$SERVER_DIR/$server" : "$SOFT_DIR";
  239. X
  240. X      # Change to the destination directory
  241. X      if (! &ChDir($todir)) {
  242. X    &NFError($ERR_DIR, "$todir");
  243. X    $retval=0;
  244. X      }
  245. X    }
  246. X
  247. X    if ($retval) { #if still no error
  248. X      # Make the software directory, even though the tar command would
  249. X      # create it because a symlink might be performed before the tar
  250. X      # command, and we might have to first append.
  251. X      if (! -d "$todir/$soft") {
  252. X    if (&VerboseRetShow($WARN_CMD, "mkdir $todir/$soft")) {
  253. X      # Show is on, so do nothing
  254. X    }
  255. X    elsif (! mkdir("$todir/$soft", 0755)) {
  256. X      &NFError($ERR_MKDIR, "$todir/$soft");
  257. X      $retval=0;
  258. X    }
  259. X    else {
  260. X      &ChDir("$todir/$soft");
  261. X    }
  262. X      }
  263. X    }
  264. X
  265. X    if ($retval) {        # if still no error
  266. X    local($lstfiles)='';
  267. X    # For all sections of a software
  268. X    for $i ('src', 'install', 'run') {
  269. X        # Here, we check to see if $i is somewhere in $copy.
  270. X        # We can do this because $copy is certain to be without error,
  271. X        # since it is validate in the function &Initialisation.
  272. X        # Also, install is ALWAYS copied.
  273. X        if ($i eq 'install' || $copy =~ /$i/) {
  274. X        # If theres a symlink between $todir/$soft/$i and
  275. X        # something else we attempt to remove it. It will
  276. X        # latter be replaced by either a symlink or an
  277. X        # entire tree of files.
  278. X        if (-l "$todir/$soft/$i") {
  279. X            if (! unlink("$todir/$soft/$i")) {
  280. X            &NFError($ERR_RMSYMLINK, "$todir/$soft/$i");
  281. X            $retval=0;
  282. X            }
  283. X        }
  284. X        
  285. X        if ($retval) { # If still no error
  286. X            # For each classes or only the class of the 
  287. X            # machine in case of directories run or install.
  288. X            local(@lst);
  289. X
  290. X            if ($i eq 'run') {
  291. X            @lst=("share", "$mod/share", "$mod/$class");
  292. X            }
  293. X            elsif ($i eq 'install') {
  294. X            @lst=("share", "$mod/share", "$mod/$class",
  295. X                  $IAFA_FILE, "$mod/$LUDE_FILE");
  296. X            }
  297. X            elsif ($i eq 'src') {
  298. X            # For the sections run, the name
  299. X            # of the mod ($mod) and orig are enough.
  300. X            # In the case of the section log, both files
  301. X            # are log files, and in the case of src
  302. X            # both files are directories.
  303. X            # The distinction is not important for tar.
  304. X            @lst=("orig", "$mod");
  305. X             }
  306. X
  307. X            # For all the files that are to be copied...
  308. X            for $f (@lst) {
  309. X            # Push it in the list of files that will
  310. X            # actually be tared, if the file does exist
  311. X            # in the original copy.
  312. X            if (-e "$fromdir/$soft/$i/$f") {
  313. X                push(@lstfiles, "$i/$f");
  314. X            }
  315. X              }
  316. X        }
  317. X        }
  318. X        else {
  319. X        # Make a symlink
  320. X
  321. X        # Do the symlink except if there's already a directory.
  322. X        if (! -d "$todir/$soft/$i") {
  323. X            if (! symlink("$fromdir/$soft/$i", 
  324. X                  "$todir/$soft/$i")) {
  325. X            # Symlink failed
  326. X            &NFError($ERR_SYMLINK,
  327. X                 "$fromdir/$soft/$i", 
  328. X                 "$todir/$soft/$i", "nil");
  329. X            $retval=0;
  330. X            }
  331. X        }
  332. X        }
  333. X    }
  334. X    
  335. X    if ($retval) {        # if still no error
  336. X        # Copy the files using tar, if there's any file to copy
  337. X        if (scalar(@lstfiles) != 0) {
  338. X        local($joined_files)=join(' ', @lstfiles);
  339. X        &RunCmd("cd $fromdir/$soft; $PROG_TAR -cf - $joined_files | (cd $todir/$soft; $PROG_TAR -xf -)");
  340. X        }
  341. X        # Append the history file if one exist in $fromdir...
  342. X        if (-e "$fromdir/$soft/history") {
  343. X        if (!&CopyFile("$fromdir/$soft/history", "$todir/$soft/history", 'a')) {
  344. X                # Error while appending
  345. X             $retval=0;
  346. X        }
  347. X        }
  348. X
  349. X        # Backward compatibility stuff based on version of lude
  350. X        # used to install the software ...
  351. X        if ($LudeVersionUsedForSoft{'major'} == 0 &&
  352. X        $LudeVersionUsedForSoft{'minor'} <= 13) {
  353. X          &Link("$todir/$soft", "$LOCAL_DIR/$soft");
  354. X        }
  355. X    }
  356. X    }
  357. X
  358. X    return($retval);
  359. X}
  360. X
  361. X
  362. X#-----------------------------------------------------------------------
  363. X# Description : Delete the specified soft/mod/class
  364. X#
  365. X# Parameters   : $target - server location where the software to
  366. X#                          remove is placed.
  367. X#                          if eq '', then $SOFT_DIR is used.
  368. X#                $soft   - software to remove
  369. X#                $mod    - modification to remove
  370. X#                $class  - class to remove
  371. X#
  372. X# Returns     : 1 on success
  373. X#               0 on error
  374. X#
  375. Xsub RmCopy {
  376. X    # Make sure that the number of parameters is correct
  377. X    if(scalar(@_)!=4){&Error($ERR_INTERNAL,sprintf("(%d), %s:%d",scalar(@_),__FILE__,__LINE__));}
  378. X    local($target, $soft, $mod, $class)=@_;
  379. X    local($dir);        # Directory where the soft to delete
  380. X                # resides.
  381. X    local($retval)=1;        # Success by default
  382. X    local($saveCWD);
  383. X
  384. X    $saveCWD=&GetCwd();
  385. X
  386. X#???BUG???
  387. X    $dir=($target ne '/') ? "$SERVER_DIR/$target":$SOFT_DIR;
  388. X
  389. X    stat("$dir/$soft");
  390. X    if (-e _) {
  391. X      if (-d _) {
  392. X    local(@dirs)=();
  393. X
  394. X    &ChDir("$dir/$soft");
  395. X
  396. X    #
  397. X    # Make the list of dirs to remove
  398. X    #
  399. X    foreach $d ("run/$mod/$class", "install/$mod/$class") {
  400. X      $d =~ m|^([^/]*)|o;
  401. X      if (-e $d && ! -l $1) {
  402. X        push(@dirs, $d);
  403. X      }
  404. X    }
  405. X
  406. X    #
  407. X    # Recursively removing the list of directories just made
  408. X    #
  409. X    if (&VerboseRetShow($WARN_CMD, 
  410. X                sprintf("Recursively Removing %s.",
  411. X                    join(' ', @dirs)))) {
  412. X      # Show is on, so do nothing
  413. X    }
  414. X    else {
  415. X      if (&RmFiles('r', @dirs)!=scalar(@dirs)) {
  416. X        # Error: could not remove all the files
  417. X        &NFError($ERR_UNLINK, "@dirs");
  418. X        $retval=0;
  419. X      }
  420. X    }
  421. X
  422. X    if ($retval) {    # If still no error
  423. X      #
  424. X      # Check to see if share should be removed
  425. X      #
  426. X
  427. X      local(@files);
  428. X                   
  429. X      # Clean up the run and install sections
  430. X      foreach $section ("run/$mod", 'run',
  431. X                "install/$mod", 'install') {
  432. X        $section =~ m|^([^/]*)|o;
  433. X        stat($section);    # lstat was not required
  434. X        if (-d _ && ! -l $1) {
  435. X          local(*dir);
  436. X          opendir(dir, $section);
  437. X          @files=readdir(dir);
  438. X          closedir(dir);
  439. X
  440. X          if ((scalar(@files) -
  441. X           scalar(grep(/^$IAFA_FILE$/o, @files)) -
  442. X           scalar(grep(/^$LUDE_FILE$/o, @files)) -
  443. X           scalar(grep(/^share$/o, @files))) == 2) {
  444. X        # Directory is empty, except for
  445. X        # a share directory and/or the $IAFA_FILE. So, that
  446. X        # directory is not required anymore.
  447. X
  448. X        # Remove the share directory and the $IAFA_FILE.
  449. X        if (&VerboseRetShow($WARN_CMD, 
  450. X                    sprintf("Recursively Removing %s.",
  451. X                        $section))) {
  452. X          # Show is on, so do nothing
  453. X        }
  454. X        else {
  455. X          if (&RmFiles('r', $section) == 0) {
  456. X            &NFError($ERR_UNLINK, "$section");
  457. X            $retval=0;
  458. X          }
  459. X        }
  460. X          }
  461. X          else {
  462. X        # Directory has some other thing besides
  463. X        # share, so skip it.
  464. X          }
  465. X        }
  466. X      }
  467. X
  468. X      # If there's no install left for a modification, we then 
  469. X      # remove the mod in src.
  470. X      if (! -e "install/$mod") {
  471. X        local(@dirs)=();    # List of other dirs to remove
  472. X
  473. X        for $d ("src/$mod") {
  474. X          $d=~m|^([^/]*)|o;
  475. X          if (! -l $1) {
  476. X        push(@dirs, $d);
  477. X          }
  478. X        }
  479. X          
  480. X        if (&VerboseRetShow($WARN_CMD, 
  481. X                sprintf("Recursively Removing %s.",
  482. X                    join(' ', @dirs)))) {
  483. X          # Show is on, so do nothing
  484. X        }
  485. X        else {
  486. X          if (&RmFiles('r', @dirs)!=scalar(@dirs)) {
  487. X        # Error: could not remove all the files
  488. X        &NFError($ERR_UNLINK, "@dirs");
  489. X        $retval=0;
  490. X          }
  491. X        }
  492. X      }
  493. X
  494. X      # If the directory install does not exist anymore, then
  495. X      # the rest of the software can be removed
  496. X      if (! -e 'install') {
  497. X        if (&VerboseRetShow($WARN_CMD, 
  498. X                sprintf("Recursively Removing %s.",
  499. X                    join(' ', @dirs)))) {
  500. X          # Show is on, so do nothing
  501. X        }
  502. X        else {
  503. X          if (&RmFiles('r', "$dir/$soft")!=1) {
  504. X        # Error: could not remove all the files
  505. X        &NFError($ERR_UNLINK, "$dir/$soft");
  506. X        $retval=0;
  507. X          }
  508. X          else { # removal was successful
  509. X        # Backward compatibility stuff based on version
  510. X        # of lude that was used to install the soft ...
  511. X        if ($LudeVersionUsedForSoft{'major'} == 0 &&
  512. X            $LudeVersionUsedForSoft{'minor'} <= 13) {
  513. X          &UnLink("$dir/$soft", "$LOCAL_DIR/$soft");
  514. X        }
  515. X          }
  516. X        }
  517. X      }
  518. X    }
  519. X      }
  520. X      else {
  521. X    # $dir/$soft is not a directory, so
  522. X    # don't bother
  523. X      }
  524. X    }
  525. X    else {
  526. X    # $dir/$soft does not exist, so don't bother.
  527. X    }
  528. X
  529. X    &ChDir($saveCWD);
  530. X    return $retval;
  531. X}
  532. X
  533. X
  534. X#------------------------------------------------------------------
  535. X# Description: Recursively makes the symbolic links for between the
  536. X#              trees $fromdir and $todir.
  537. X#
  538. X# Parameters : $fromdir - Directory where the actual files are located
  539. X#              $todir   - Directory where symlinks and/or dir are added
  540. X#              $suffix  - File name relative to $fromdir
  541. X#
  542. X# Returns    : 1 on success
  543. X#              0 if any errors 
  544. X#
  545. Xsub MkLinks {
  546. X    if(scalar(@_)!=3){&Error(ERR_INTERNAL,sprintf("(%d), %s:%d",scalar(@_),__FILE__,__LINE__));}
  547. X    local($fromdir, $todir, $suffix)=@_;
  548. X    local($retval)=1;        # By default success
  549. X
  550. X    local($fromfile, $tofile, $newsuffix, $lnkval);
  551. X
  552. X    # Read all the file names in $fromdir. In the special
  553. X    # case where $suffix eq '', we do not append it to $fromdir.
  554. X    # Sort the filenames, and remove the file names 
  555. X    # '.' and '..'
  556. X    local(*dir);
  557. X    opendir(dir, ($suffix eq "") ? "$fromdir":"$fromdir/$suffix");
  558. X    local(@files)=sort grep(!/^\.{1,2}$/, readdir(dir));
  559. X    closedir(dir);
  560. X
  561. X    # For each files in $fromdir/$suffix ...
  562. X    for $file (@files) {
  563. X    if ($suffix eq "") {
  564. X        $newsuffix="$file";
  565. X    }
  566. X    else {
  567. X        $newsuffix="$suffix/$file";
  568. X    }
  569. X        
  570. X    $fromfile="$fromdir/$newsuffix";
  571. X
  572. X    # skip to the next file, if the current file was asked
  573. X    # to be excluded
  574. X    next if (grep(/^$newsuffix$/, @Exclude));
  575. X
  576. X    $tofile=&GetLongestRename($todir, $newsuffix);
  577. X
  578. X    if (-l $tofile) { 
  579. X        $lnkval=readlink($tofile); 
  580. X    } 
  581. X    else {
  582. X        # Set $lnkval to a value that is impossible for a file name
  583. X        $lnkval='///';
  584. X    }
  585. X
  586. X    if ($lnkval eq $fromfile) {
  587. X        # The link is already existant
  588. X        &Warning($WARN_LINK_THERE_AND_CORRECT, $fromfile, $tofile);
  589. X    }
  590. X    elsif (-d $fromfile) {
  591. X        # $tofile is not taken as a symbolic link if $suffix is ''
  592. X        # because people could do a link between some other
  593. X        # partition and /usr/local/bin, for example. This let
  594. X        # them have bin, lib, man, etc. on different partition
  595. X        # and use symlinks rather than mounts.
  596. X        if ( -l $tofile && $suffix ne "") {
  597. X        # Test to see if it is a link that was generated
  598. X        # for the specified Software       
  599. X        if ($lnkval =~ m|^$SOFT_DIR/[^/]+/run/|) {
  600. X            local($dirname);
  601. X            
  602. X            $dirname=&DirName($fromfile);
  603. X            
  604. X            # Check for write permission on the dir where $todir
  605. X            # is located
  606. X            if ( -w $dirname ) {
  607. X            # There's a link to some other software (because
  608. X            # $tofile is a link pointing to some other soft
  609. X            # tree), so we first explode the directory to
  610. X            # allow to make symlinks for the current
  611. X            # software.
  612. X            if (! &Explode($tofile)) {
  613. X                $retval=0; # Error
  614. X            }
  615. X            elsif (! &VerboseRetShow()) {
  616. X                # Recurse only if the work is really
  617. X                # performed. i.e. if not only showing the
  618. X                # commands that will be performed.
  619. X                if (! &MkLinks($fromdir, $todir, $newsuffix)) {
  620. X                $retval=0; # Error
  621. X                }
  622. X            }
  623. X            }
  624. X            else {
  625. X            # write permission on $dirname is required
  626. X            # not set. So this resulted in the impossibility
  627. X            # to make the explosion.
  628. X            &NFError($ERR_NO_W_PERM, $dir);
  629. X            $retval=0;
  630. X            }
  631. X        }
  632. X        else {
  633. X            # Error, since an explosion is required
  634. X            # and cannot be performed due to an 
  635. X            # apperent incorrect symlink
  636. X            &NFError($ERR_EXPLODE, $tofile, $lnkval);
  637. X            $retval=0;    # Error
  638. X        }
  639. X        }
  640. X        elsif (-d $tofile) {
  641. X        # Can't make a symlink because of the existence
  642. X        # of a directory, so go deeper to make the symlinks
  643. X        # by recursing.
  644. X        if (! &MkLinks($fromdir, $todir, $newsuffix)) {
  645. X            $retval=0;    # Error
  646. X        }
  647. X        }
  648. X        else {
  649. X        # Test to see if $newsuffix happens to be the start of
  650. X        # a key in the rename assoc array, without being a 
  651. X        # whole key.
  652. X        # If this is the case, then we can't simply make a
  653. X        # symlink to $fromfile since there is a possibility of a
  654. X        # rename of a file name that is deeper that the current
  655. X        # directory.
  656. X        # Example:
  657. X        #    rename lib-inc lib/aux
  658. X        #    rename lib-inc/a /etc/b 
  659. X        # So if we stop at lib-inc (because it matches $newsuffix)
  660. X        # we miss lib-inc/a which should be in a totaly different
  661. X        # place.
  662. X        local($canlink, $key);
  663. X        $canlink=1;    # By default -> can link
  664. X        for $key (keys %Rename) {
  665. X            if (index($key,$newsuffix)==$[ &&
  666. X            length($key)>length($newsuffix)) {
  667. X                        # Found that the link can't be done. Will
  668. X            # have to mkdir and recurse.
  669. X            $canlink=0; 
  670. X            last;
  671. X            }
  672. X        }
  673. X        if ($canlink) {    # Can make the symlink
  674. X            if (! &Link($fromfile, $tofile)) {
  675. X            $retval=0;
  676. X            }
  677. X        }
  678. X        else {        # Cannot make the symlink
  679. X            # Can't link because we could miss some files
  680. X            # so, instead, the directory is created
  681. X            if (&VerboseRetShow($WARN_CMD, "MkDir $tofile")) {
  682. X            # Show is on, so do nothing
  683. X            &VerboseRetShow($WARN_MSG, "Recursing ... (not shown)");
  684. X            }
  685. X            else {
  686. X            if ( ! mkdir($dst,0755) ) {
  687. X                &NFError($ERR_MKDIR, $tofile, $!);
  688. X                $retval=0; # Error
  689. X            }
  690. X            else {
  691. X                # So far so good!
  692. X                if (! &MkLinks($fromdir, $todir, $newsuffix)) {
  693. X                $retval=0;
  694. X                }
  695. X            }
  696. X            }
  697. X        }
  698. X        }
  699. X    }
  700. X    elsif ( -l $fromfile || -f $fromfile ) {
  701. X        if (! &Link($fromfile, $tofile)) {
  702. X        $retval=0;
  703. X        }
  704. X    }
  705. X    else {
  706. X        &NFError(ERR_WRONG_FILE_TYPE, $fromfile);
  707. X        $retval=0;
  708. X    }
  709. X    }
  710. X    return $retval;
  711. X}
  712. X
  713. X
  714. X#--------------------------------------------------------------------
  715. X#
  716. X# Remove the Links
  717. X#
  718. X# Parameters : srcrep   : Directory where the actual files are located
  719. X#              dstrep   : Directory where symlinks and/or dir are added
  720. X#              f        : File name relative to ...Rep
  721. X#
  722. X# Returns    : nothing
  723. X
  724. Xsub RmLinks {
  725. X    if (scalar(@_)!=3) {
  726. X    &Error(ERR_INTERNAL, 
  727. X           sprintf("(%d), %s:%d", scalar(@_), __FILE__, __LINE__));
  728. X    }
  729. X    local($srcrep, $dstrep, $f)=@_;
  730. X    local($src, $dst, $newfile);
  731. X    local($retval)=1;        # Success by default
  732. X
  733. X    if ( -l $dst && (readlink($dst) eq $src) ) {
  734. X    # The link is already existant
  735. X    &Warning($WARN_LINK_THERE_AND_CORRECT, $src, $dst);
  736. X    }
  737. X    elsif ( -d $srcrep ) {
  738. X#    &Warning($WARN_CMD, "RmLinks: $srcrep/$f") if ( $Show );
  739. X
  740. X    opendir(DIR, (($f eq "") ? "$srcrep":"$srcrep/$f"));
  741. X    local(@files)=sort grep(!/^\.{1,2}$/, readdir(DIR));
  742. X    closedir(DIR);
  743. X
  744. X    for $file (@files) {
  745. X        if ($f eq "") {
  746. X        $newfile="$file";
  747. X        }
  748. X        else {
  749. X        $newfile="$f/$file";
  750. X        }
  751. X        
  752. X        $src = "$srcrep/$newfile";
  753. X    
  754. X        # skip to the next file, if the current file was asked
  755. X        # to be excluded
  756. X        next if (grep(/^$newfile$/, @Exclude));
  757. X        
  758. X        $dst=&GetLongestRename($dstrep, $newfile);
  759. X
  760. X        if  (-l $dst) {
  761. X        if (! &UnLink($src, $dst)) {
  762. X            $retval=0;
  763. X        }
  764. X        }
  765. X        elsif (-d $dst) {
  766. X        if (! &RmLinks($srcrep, $dstrep, $newfile)) {
  767. X            $retval=0;
  768. X        }
  769. X        }
  770. X        else {
  771. X        # Not a link, so do not care
  772. X        }
  773. X    }
  774. X    }
  775. X    return $retval;
  776. X}
  777. X
  778. X
  779. X#------------------------------------------------------------------
  780. X#
  781. X#
  782. X#
  783. Xsub GetLongestRename {
  784. X    if (scalar(@_)!=2) {
  785. X    &Error(ERR_INTERNAL, 
  786. X           sprintf("(%d), %s:%d", scalar(@_), __FILE__, __LINE__));
  787. X    }
  788. X    local($dstrep, $newfile)=@_;
  789. X    local($matchlen, $newname)=0;
  790. X
  791. X    $newname="$dstrep/$newfile";
  792. X
  793. X    # Check to see if a rename was specified for the 
  794. X    # current file.
  795. X    # The longest match found will be the one kept.
  796. X    for (keys %Rename) {
  797. X    if ($newfile =~ m|^$_((/[^/]+)*)$|) {
  798. X        if (length($_) > $matchlen) {
  799. X        $matchlen=length($_);
  800. X        if (substr($Rename{$_}, 0, 1) eq "/") {
  801. X            $newname="$Rename{$_}$1";
  802. X        }
  803. X        else {
  804. X            $newname="$dstrep/$Rename{$_}$1";
  805. X        }
  806. X        }
  807. X    }
  808. X    }
  809. X
  810. X    return ($newname);
  811. X}
  812. X
  813. X
  814. X#------------------------------------------------------------------
  815. X#
  816. X# Perform a single link
  817. X#
  818. X# Return  : 1 on success
  819. X#           0 if any errors
  820. X#
  821. Xsub Link {
  822. X    if (scalar(@_)!=2) {&Error(ERR_INTERNAL,sprintf("(%d), %s:%d", scalar(@_), __FILE__, __LINE__));}
  823. X    local($src, $dst)=@_;
  824. X    local($retval)=1;        # Success by default
  825. X    local($dir);
  826. X    local($lnkval);
  827. X
  828. X    ($dir = $dst) =~ s|(.*)/[^/]+|$1|o;
  829. X
  830. X    if (-l $dst && (readlink($dst) eq $src)) {
  831. X    # The link is already existant
  832. X    &Warning($WARN_LINK_THERE_AND_CORRECT, $src, $dst);
  833. X    }
  834. X    elsif (-w $dir) {
  835. X    # The -e test alone is not sufficient because it will
  836. X    # fail if there is a link to a non-existant file.
  837. X    # Therefore, the test -l must be added to take care
  838. X    # of the special condition.
  839. X    if (-e $dst || -l $dst) {
  840. X        if ($Preserve ne "") {
  841. X        # Preserve old file
  842. X        if (&VerboseRetShow($WARN_CMD, 
  843. X                    "rename $dst (will remove $dst$Preserve if it exist)")) {
  844. X            # Show is on, so do nothing
  845. X        }
  846. X        else {
  847. X            if (!rename("$dst", "$dst$Preserve")) {
  848. X            &NFError($ERR_REN, $dst, $!);
  849. X            $retval=0;
  850. X            }
  851. X        }
  852. X        }
  853. X        elsif ($Force) {
  854. X        # Delete old file
  855. X        if (&VerboseRetShow($WARN_CMD, "unlink $dst")) { 
  856. X            # Show is on, so do nothing
  857. X        }
  858. X        else {
  859. X            if (unlink($dst) == 0 ) { # 0 means unlink succeeded
  860. X            &NFError($ERR_RMSYMLINK, $dst);
  861. X            $retval=0;
  862. X            }
  863. X        }
  864. X        }
  865. X        else {
  866. X        # Error
  867. X        &NFError($ERR_SYMLINK, $src, $dst, 'nil'); 
  868. X        $retval=0;
  869. X        }
  870. X    }
  871. X
  872. X    if ($retval) {        # If still no error
  873. X        # Perform the link
  874. X        if (&VerboseRetShow($WARN_CMD, "Link $src <- $dst.")) {
  875. X        # Show is on, so do nothing
  876. X        }
  877. X        elsif (! symlink($src, $dst) ) {
  878. X        &NFError($ERR_SYMLINK, $src, $dst, 'nil');
  879. X        $retval=0;
  880. X        }
  881. X    }
  882. X    }
  883. X    else {
  884. X    # Do not have permission to make the link
  885. X    &NFError($ERR_SYMLINK, $src, $dst, 'nil'); 
  886. X    $retval=0;
  887. X    }
  888. X
  889. X    return($retval);
  890. X}
  891. X
  892. X
  893. X#------------------------------------------------------------------
  894. X#
  895. X# Perform an Unlink by taking into account various parameters
  896. X# such as show
  897. X#
  898. X# Return  : 1 on success
  899. X#           0 if any errors
  900. X#
  901. Xsub UnLink {
  902. X    if (scalar(@_)!=2) {
  903. X    &Error(ERR_INTERNAL, 
  904. X           sprintf("(%d), %s:%d", scalar(@_), __FILE__, __LINE__));
  905. X    }
  906. X    local($src, $dst)=@_;
  907. X    local($lnkval);
  908. X    local($retval)=1;        # Success by default
  909. X
  910. X    $lnkval=readlink($dst);
  911. X    
  912. X    # Test to see if the link is really between
  913. X    # src <- dst.
  914. X    if ( $lnkval eq $src) {
  915. X    if (&VerboseRetShow($WARN_CMD, "UnLink $dst")) {
  916. X        # Show is on, so do nothing
  917. X    }
  918. X    else {
  919. X        if (! unlink($dst)) {
  920. X        &NFError($ERR_RMSYMLINK, $dst);
  921. X        $retval=0;
  922. X        }
  923. X    }
  924. X    }
  925. X    else {
  926. X    # Not a symlink we made. Ignore it.
  927. X    }
  928. X
  929. X    return $retval;
  930. X}
  931. X
  932. X
  933. X#------------------------------------------------------------------
  934. X#
  935. X# srcrep   :   Directory where the actual files are located
  936. X# dstrep   :   Directory where symlinks and/or dir are added
  937. X#
  938. X# Return  : 1 on success
  939. X#           0 if any errors
  940. X#
  941. Xsub Explode {
  942. X    if (scalar(@_)!=1) {
  943. X    &Error(ERR_INTERNAL, 
  944. X           sprintf("(%d), %s:%d", scalar(@_), __FILE__, __LINE__));
  945. X    }
  946. X    local($dst)=@_;
  947. X    local($src, $dstrep,$srcrep,$newfile,$dir);
  948. X    local($retval)=1;        # Success by default
  949. X    
  950. X    $src=readlink($dst);
  951. X    ($dstrep=$dst) =~ s|^(.*)/[^/]+$|$1|o;
  952. X
  953. X    &VerboseRetShow($WARN_OUT, "Exploding $dst ...");
  954. X
  955. X    if (&VerboseRetShow($WARN_CMD, "UnLink $dst")) {
  956. X    # Show is on, so do nothing
  957. X    &VerboseRetShow($WARN_CMD, "MkDir $dst");   
  958. X    &VerboseRetShow($WARN_MSG, 
  959. X            "when showing, the recursion is not performed in Explode");
  960. X    }
  961. X    else {
  962. X    if (unlink($dst) == 0) { # 0 unlink succeeded
  963. X        &NFError($ERR_RMSYMLINK, $dst);
  964. X        $retval=0;
  965. X    }
  966. X    elsif (! mkdir($dst,0755)) {
  967. X        &NFError($ERR_MKDIR, $dst, $!);
  968. X        $retval=0;
  969. X    }
  970. X    else {
  971. X        # So far so good!
  972. X        ($srcrep = $src) =~ s|(.*)/[^/]+$|$1|o;
  973. X        ($newfile = $src) =~ s|.*/([^/]+)$|$1|o;
  974. X
  975. X        # When exploding, the symlink that is changed to a dir 
  976. X        # belong to another software. Therefore, the mapping
  977. X        # file for that software must be read. After the 
  978. X        # explosion, the previous mapping information
  979. X        # must be restored.
  980. X
  981. X        local(%saverename,@saveexclude,$mappingfiledir);
  982. X        %saverename=%Rename;
  983. X        undef %Rename;
  984. X        @saveexclude=@Exclude;
  985. X        undef @Exclude;
  986. X
  987. X        # Read Mapping file
  988. X        ($mappingfiledir=$srcrep) =~ 
  989. X        s|^(.*)/run(/[^/]+/[^/]+).*$|$1/install$2|o;
  990. X
  991. X        if (-r "$mappingfiledir/$MAPPING") {
  992. X        if (! &ReadMapping("$mappingfiledir/$MAPPING")) {
  993. X            $retval=0;
  994. X        }
  995. X        }
  996. X    
  997. X        if ($retval) {    # If still no error
  998. X        if (! &MkLinks($srcrep, $dstrep, $newfile)) {
  999. X            $retval=0;
  1000. X        }
  1001. X        }
  1002. X
  1003. X        # The restore has to be made even if an error occured
  1004. X
  1005. X        # Restore Exclude
  1006. X        @Exclude=@saveexclude;
  1007. X        # Restore Rename
  1008. X        %Rename=%saverename;
  1009. X    }
  1010. X    }
  1011. X    
  1012. X    &VerboseRetShow($WARN_EXPLODE_DONE, $dst);
  1013. X    
  1014. X    return $retval;
  1015. X}
  1016. X
  1017. X
  1018. X#-----------------------------------------------------------------------
  1019. X#
  1020. X#
  1021. Xsub LinkDoc {
  1022. X    local($soft,$mod)=@_;
  1023. X
  1024. X    local($docdir)="$LOCAL_DIR/doc";        # Location of doc files.
  1025. X
  1026. X    # Create the $docdir directory
  1027. X    if (! -e $docdir) {
  1028. X    mkdir($docdir, 0755) || &Error($ERR_MKDIR, $docdir, $!);
  1029. X    }
  1030. X
  1031. X    # creates, in the directory $docdir,
  1032. X    # a subdirectory with the same name as the software
  1033. X    # package to install.
  1034. X    if (! -e "$docdir/$soft") {
  1035. X    mkdir("$docdir/$soft", 0755) || &Error($ERR_MKDIR, "$docdir/$soft", $!);
  1036. X    }
  1037. X
  1038. X    # In $docdir/$soft, create two symbolic links that point
  1039. X    # to the files install/$IAFA_FILE and install/$mod/$LUDE_FILE
  1040. X    if (-e "$SOFT_DIR/$soft/log/$orig") {
  1041. X    &Link("$SOFT_DIR/$soft/install/$IAFA_FILE",
  1042. X          "$docdir/$soft/$IAFA_FILE");
  1043. X    }
  1044. X    if (-e "$SOFT_DIR/$soft/log/$mod") {
  1045. X    &Link("$SOFT_DIR/$soft/install/$mod/$LUDE_FILE",
  1046. X          "$docdir/$soft/${LUDE_FILE}-$mod");
  1047. X    }
  1048. X}
  1049. X
  1050. X#-----------------------------------------------------------------------
  1051. X#
  1052. X#
  1053. Xsub RmLinkDoc {
  1054. X    local($soft, $mod)=@_;
  1055. X    local($retval)=1;        # Success by default
  1056. X
  1057. X    local($docdir)="$LOCAL_DIR/doc";        # Location of doc files.
  1058. X
  1059. X    lstat("$docdir/$soft/$IAFA_FILE");
  1060. X    if (-e _ && -l _) {
  1061. X    &UnLink("$SOFT_DIR/$soft/install/$IAFA_FILE",
  1062. X        "$docdir/$soft/$IAFA_FILE");
  1063. X    }
  1064. X    lstat("$docdir/$soft/${LUDE_FILE}-$mod");
  1065. X    if (-e _ && -l _) {
  1066. X    &UnLink("$SOFT_DIR/$soft/install/$mod/$LUDE_FILE",
  1067. X        "$docdir/$soft/${LUDE_FILE}-$mod");
  1068. X    }
  1069. X    if (&VerboseRetShow($WARN_CMD, "rmdir $docdir/$soft")) {
  1070. X    # Show is on, so do nothing
  1071. X    }
  1072. X    else {
  1073. X    if (! rmdir("$docdir/$soft")) {
  1074. X        &NFError($ERR_RMDIR, "$docdir/$soft", $!);
  1075. X        $retval=0;
  1076. X    }
  1077. X    }
  1078. X    return $retval;
  1079. X}
  1080. X
  1081. X
  1082. X#     ;;; Local Variables: ***
  1083. X#     ;;; mode:perl ***
  1084. X#     ;;; End: ***
  1085. END_OF_FILE
  1086.   if test 28996 -ne `wc -c <'lude-1.1/run/crim/sun4.1_sparc/bin/lude'`; then
  1087.     echo shar: \"'lude-1.1/run/crim/sun4.1_sparc/bin/lude'\" unpacked with wrong size!
  1088.   fi
  1089.   chmod +x 'lude-1.1/run/crim/sun4.1_sparc/bin/lude'
  1090.   # end of 'lude-1.1/run/crim/sun4.1_sparc/bin/lude'
  1091. fi
  1092. if test -f 'lude-1.1/run/crim/sun4.1_sparc/lib/lude/lang/ludelist' -a "${1}" != "-c" ; then 
  1093.   echo shar: Will not clobber existing file \"'lude-1.1/run/crim/sun4.1_sparc/lib/lude/lang/ludelist'\"
  1094. else
  1095.   echo shar: Extracting \"'lude-1.1/run/crim/sun4.1_sparc/lib/lude/lang/ludelist'\" \(3468 characters\)
  1096.   sed "s/^X//" >'lude-1.1/run/crim/sun4.1_sparc/lib/lude/lang/ludelist' <<'END_OF_FILE'
  1097. Xfrancais english
  1098. X#
  1099. X# Keywords as found in the folg files
  1100. X#
  1101. Xassoc Logkw
  1102. XPACKAGE-NAME
  1103. X 0 package-name
  1104. X 1 package-name
  1105. XTITLE
  1106. X 0 title
  1107. X 1 title
  1108. XVERSION
  1109. X 0 version
  1110. X 1 version
  1111. XDESCRIPTION
  1112. X 0 documentation
  1113. X 1 description
  1114. XABSTRACT
  1115. X 0 resume
  1116. X 1 abstract
  1117. XAUTHOR
  1118. X 0 author
  1119. X 1 author
  1120. XAUTHOR-TELEPHONE
  1121. X 0 author-telephone
  1122. X 1 author-telephone
  1123. XAUTHOR-FAX
  1124. X 0 author-fax
  1125. X 1 author-fax
  1126. XAUTHOR-POSTAL
  1127. X 0 author-postal
  1128. X 1 author-postal
  1129. XAUTHOR-EMAIL
  1130. X 0 author-email
  1131. X 1 author-email
  1132. XMAINTAINED-BY
  1133. X 0 maintained-by
  1134. X 1 maintained-by
  1135. XPOSTAL-ADDRESS
  1136. X 0 postal-address
  1137. X 1 postal-address
  1138. XTELEPHONE
  1139. X 0 telephone
  1140. X 1 telephone
  1141. XFAX
  1142. X 0 fax
  1143. X 1 fax
  1144. XELECTRONIC-ADDRESS
  1145. X 0 electronic-address
  1146. X 1 electronic-address
  1147. XMAINTAINED-AT
  1148. X 0 maintained-at
  1149. X 1 maintained-at
  1150. XDISTRIBUTION-TYPE
  1151. X 0 distribution-type
  1152. X 1 distribution-type
  1153. XRESTRICTIONS
  1154. X 0 restrictions
  1155. X 1 restrictions
  1156. XDISCUSSION-GROUPS
  1157. X 0 discussion-groups
  1158. X 1 discussion-groups
  1159. XCOPYING-POLICY
  1160. X 0 copying-policy
  1161. X 1 copying-policy
  1162. XMODIFIED-BY
  1163. X 0 modified-by
  1164. X 1 modified-by
  1165. XKEYWORDS
  1166. X 0 keywords
  1167. X 1 keywords
  1168. XURI
  1169. X 0 uri
  1170. X 1 uri
  1171. XINSTALL
  1172. X 0 installation
  1173. X 1 install
  1174. XUSAGE
  1175. X 0 utilisation
  1176. X 1 usage
  1177. XADAPTED-BY
  1178. X 0 adapted-by
  1179. X 1 adapted-by
  1180. XDATE-ADAPTED
  1181. X 0 date-adapted
  1182. X 1 date-adapted
  1183. XLUDE-VERSION
  1184. X 0 lude-version
  1185. X 1 lude-version
  1186. X#
  1187. X# Keywords as printed for the user
  1188. X#
  1189. Xassoc Prkw
  1190. XSERVER
  1191. X 0 Serveur
  1192. X 1 Server
  1193. XMODIFICATION
  1194. X 0 Modification
  1195. X 1 Modification
  1196. XCLASS
  1197. X 0 Classe
  1198. X 1 Class
  1199. XPACKAGE-NAME
  1200. X 0 Logiciel
  1201. X 1 Package name
  1202. XTITLE
  1203. X 0 Titre
  1204. X 1 Title
  1205. XVERSION
  1206. X 0 Version
  1207. X 1 Version
  1208. XDESCRIPTION
  1209. X 0 Documentation
  1210. X 1 Description
  1211. XABSTRACT
  1212. X 0 Resume
  1213. X 1 Abstract
  1214. XAUTHOR
  1215. X 0 Auteur
  1216. X 1 Author
  1217. XAUTHOR-TELEPHONE
  1218. X 0 Numero de telephone de l'auteur
  1219. X 1 Author's phone number
  1220. XAUTHOR-FAX
  1221. X 0 Numero de telecopieur de l'auteur
  1222. X 1 author's fax number
  1223. XAUTHOR-POSTAL
  1224. X 0 Adresse postal de l'auteur
  1225. X 1 author's postal address
  1226. XAUTHOR-EMAIL
  1227. X 0 Adresse electronique de l'auteur
  1228. X 1 author's email address
  1229. XMAINTAINED-BY
  1230. X 0 Maintenu par
  1231. X 1 Maintained by
  1232. XPOSTAL-ADDRESS
  1233. X 0 Adresse postal
  1234. X 1 Postal address
  1235. XTELEPHONE
  1236. X 0 Numero de telephone
  1237. X 1 phone number
  1238. XFAX
  1239. X 0 Numero de telecopieur
  1240. X 1 Fax number
  1241. XELECTRONIC-ADDRESS
  1242. X 0 Adresse electronique
  1243. X 1 Electronic address
  1244. XMAINTAINED-AT
  1245. X 0 Maintenu a
  1246. X 1 Maintained at
  1247. XDISTRIBUTION-TYPE
  1248. X 0 Type de distribution
  1249. X 1 Distribution type
  1250. XRESTRICTIONS
  1251. X 0 Restrictions
  1252. X 1 Restrictions
  1253. XDISCUSSION-GROUPS
  1254. X 0 Groupes de discussion
  1255. X 1 Discussion groups
  1256. XCOPYING-POLICY
  1257. X 0 Copying policy
  1258. X 1 Copying policy
  1259. XMODIFIED-BY
  1260. X 0 Modifie par
  1261. X 1 Modified by
  1262. XKEYWORDS
  1263. X 0 Mots cles
  1264. X 1 Keywords
  1265. XURI
  1266. X 0 uri
  1267. X 1 uri
  1268. XINSTALL
  1269. X 0 Installation
  1270. X 1 Install
  1271. XUSAGE
  1272. X 0 Utilisation
  1273. X 1 Usage
  1274. XADAPTED-BY
  1275. X 0 Adapte par
  1276. X 1 Adapted by
  1277. XDATE-ADAPTED
  1278. X 0 Date d'adaptation
  1279. X 1 Date adapted
  1280. XLUDE-VERSION
  1281. X 0 Version de lude utilisee pour l'installation
  1282. X 1 Lude version used for the installation
  1283. Xarray MSGS
  1284. XUSAGE
  1285. X 0 UTILISATION: $0
  1286. X c  [-software logiciel]         {Specifie le logiciel}
  1287. X c  [-modification modification] {Specifie la modification}
  1288. X c  [-language (francais|english)]
  1289. X c  [-server serveur]            {Specifie le serveur}
  1290. X c  [-class classe]              {Specifie la classe}
  1291. X c  [-raw|-short|-long]          {Type de listage}
  1292. X c  [-version|-full-version]
  1293. X 1 USAGE: $0
  1294. X c  [-software software]         {Specify the software}
  1295. X c  [-modification modification] {Specify the modification}
  1296. X c  [-language (francais|english)]
  1297. X c  [-server server]             {Specify the server}
  1298. X c  [-class class]               {Specify the class}
  1299. X c  [-raw|-short|-long]          {Type of listing}
  1300. X c  [-version|-full-version]
  1301. END_OF_FILE
  1302.   if test 3468 -ne `wc -c <'lude-1.1/run/crim/sun4.1_sparc/lib/lude/lang/ludelist'`; then
  1303.     echo shar: \"'lude-1.1/run/crim/sun4.1_sparc/lib/lude/lang/ludelist'\" unpacked with wrong size!
  1304.   fi
  1305.   # end of 'lude-1.1/run/crim/sun4.1_sparc/lib/lude/lang/ludelist'
  1306. fi
  1307. if test -f 'lude-1.1/src/orig/src/lude' -a "${1}" != "-c" ; then 
  1308.   echo shar: Will not clobber existing file \"'lude-1.1/src/orig/src/lude'\"
  1309. else
  1310.   echo shar: Extracting \"'lude-1.1/src/orig/src/lude'\" \(28905 characters\)
  1311.   sed "s/^X//" >'lude-1.1/src/orig/src/lude' <<'END_OF_FILE'
  1312. X#!/usr/local/bin/perl
  1313. X
  1314. X# Lude - Lude Project.
  1315. X# Copyright (C) 1991, 1992  Pierre Laplante
  1316. X# Copyright (C) 1992 Stephane Boucher.
  1317. X#
  1318. X# This program is free software; you can redistribute it and/or modify
  1319. X# it under the terms of the GNU General Public License as published by
  1320. X# the Free Software Foundation; either version 1, or (at your option)
  1321. X# any later version.
  1322. X#
  1323. X# This program is distributed in the hope that it will be useful,
  1324. X# but WITHOUT ANY WARRANTY; without even the implied warranty of
  1325. X# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1326. X# GNU General Public License for more details.
  1327. X#
  1328. X# You should have received a copy of the GNU General Public License
  1329. X# along with this program; if not, write to the Free Software
  1330. X# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1331. X
  1332. X$FULL_VERSION=
  1333. X    "-- lude --\n" .
  1334. X    "This is part of LUDE (Logitheque Universitaire Distribuee et Extensible)\n\n";
  1335. X
  1336. X$FULL_VERSION.='$Id: lude,v 1.7 1993/06/01 16:57:00 dagenais Exp $' . "\n";
  1337. X
  1338. X$VERSION='%VERSION%';
  1339. X#-----------------------------------------------------------------------
  1340. X#    Globals definitions
  1341. X#
  1342. X$PL_INCDIR="%PL_INCDIR%:../include";
  1343. X$LANG_PATH="%LANG_PATH%:../lib/lude/lang:../lang";
  1344. X$MAPPING="mapping";
  1345. X$BEFORELINK="beforelink";
  1346. X$AFTERLINK="afterlink";
  1347. X$BEFORERMLINK="beforermlink";
  1348. X$AFTERRMLINK="afterrmlink";
  1349. X$INSTALL="install";
  1350. X$RENAME="rename";
  1351. X$EXCLUDE="exclude";
  1352. X
  1353. X#-----------------------------------------------------------------------
  1354. X# Main program
  1355. X#
  1356. X# Description :
  1357. X#      The execution of the script goes through three phases:
  1358. X#      1. Verification of the system:
  1359. X#            Check to see if the OS has the necessary 
  1360. X#            functionnality to support lude.
  1361. X#            Check the availability of the various commands
  1362. X#            that will be use by Lude.
  1363. X#      2. Initialisation
  1364. X#            Initialise various global variables.
  1365. X#            Parse, the command line arguments, and validate
  1366. X#            them.
  1367. X#      3. execution of the commands
  1368. X#            According to the command line arguments, perform
  1369. X#            the appropriate actions.
  1370. X#
  1371. Xmain: {
  1372. X    local($exitval)=0;        # Success by default
  1373. X    local(@OLDARGV)=@ARGV;
  1374. X    local($cmdsToDo);
  1375. X
  1376. X    unshift(@INC,split(/:/, "$PL_INCDIR"));
  1377. X
  1378. X    require('config.pl');
  1379. X
  1380. X    # Load and initialise the language support immediatly so
  1381. X    # that the messages are available the soonest possible.
  1382. X    # If an error occure in this phase, the execution is 
  1383. X    # immediatly aborted.
  1384. X    require('ludelang.pl');
  1385. X    &InitLang($CONF_LANG_DEFAULT, $LANG_PATH, 'ludemisc', @ARGV);
  1386. X    &InitLang($CONF_LANG_DEFAULT, $LANG_PATH, 'lude', @ARGV);
  1387. X    &InitLang($CONF_LANG_DEFAULT, $LANG_PATH, 'ludedatafiles', @ARGV);
  1388. X
  1389. X    # Include other perl files required for this script.
  1390. X    require("ludemisc");    # subroutines and variables
  1391. X                # common to all Lude scripts.
  1392. X    require("ludeinc");        # subroutines and variables
  1393. X                # required by the script lude.
  1394. X    require("fileutil.pl");
  1395. X    require("BldRegexpMinRqr.pl");
  1396. X
  1397. X    # Execution of phase 1: Verification of the system.
  1398. X    if (! &VerifySystem) {
  1399. X        # An error occured.
  1400. X        $exitval=1;
  1401. X    }
  1402. X    # Execution of phase 2: Initialisation and arguments parsing.
  1403. X    elsif (($cmdsToDo=&Initialisation) < 0) {
  1404. X        # An error occured
  1405. X        $exitval=2;
  1406. X    }
  1407. X    elsif ( -x "$SERVER_DIR/$Server/$Software/install/$Modification/$Class/$INSTALL") {
  1408. X      # A replacement script was found. Execute that
  1409. X        # script rather than using the present script.
  1410. X      &RunCmd("$SERVER_DIR/$Server/$Software/install/$Modification/$Class/$INSTALL @OLDARGV");
  1411. X    }
  1412. X    # If any command(s) left to be executed
  1413. X    elsif ($cmdsToDo > 0) {
  1414. X        # No error occured so far
  1415. X        if (! &ExecCommands) {
  1416. X        $exitval=3;
  1417. X        }
  1418. X    }
  1419. X
  1420. X    exit $exitval;
  1421. X}
  1422. X
  1423. X
  1424. X#-----------------------------------------------------------------------
  1425. X# Description : Read the mapping file and put the result in
  1426. X#              2 global arrays:
  1427. X#                       $Rename{"from_rep"}="to_rep"
  1428. X#                       @Exclude
  1429. X#
  1430. X# Parameters  : $mapping - mapping file name
  1431. X#
  1432. X# Returns     : 1 on success
  1433. X#               0 if any errors
  1434. X#
  1435. Xsub ReadMapping {
  1436. X    # Make sure that the number of parameters is correct
  1437. X    if(scalar(@_)!=1){&Error($ERR_INTERNAL,sprintf("(%d), %s:%d",scalar(@_),__FILE__,__LINE__));}
  1438. X    local($mapping)=@_;
  1439. X    local($retval)=1;        # Success by default
  1440. X
  1441. X    local($origline, @fields, *fmap);
  1442. X
  1443. X    if (! open(fmap, $mapping)) {
  1444. X    &NFError($ERR_OPEN, $mapping);
  1445. X    $retval=0;
  1446. X    }
  1447. X    else {
  1448. X    while (<fmap>) {
  1449. X        # Save a copy of the original line before manipulation 
  1450. X        $origline=$_;
  1451. X
  1452. X        # Remove spaces at the beginning of the line,
  1453. X        # and the comment if any.
  1454. X        $_ =~ s/^\s*([^#]*)(#.*)?$/$1/o;
  1455. X         # If the line is empty go to next line
  1456. X        next if (/^\s*$/o);
  1457. X            # Remove the spaces at the end of the line, if any.
  1458. X            $_ =~ s/^(.*[^\s])\s*$/$1/o;
  1459. X
  1460. X            (@fields)=split(/\s+/);
  1461. X
  1462. X            # Rename command
  1463. X        if ($fields[0] =~ m/^$RENAME$/oi && scalar(@fields)==3) {
  1464. X             $Rename{$fields[1]}=$fields[2];
  1465. X          } 
  1466. X            # Exclude command
  1467. X        elsif ($fields[0] =~ m/^$EXCLUDE$/oi && scalar(@fields)==2) {
  1468. X             push(@Exclude, $fields[1]);
  1469. X          } 
  1470. X            # Unrecognized command
  1471. X            else {
  1472. X            &NFError($ERR_INVCMD, "$origline");
  1473. X              $retval=0;
  1474. X          }
  1475. X        }
  1476. X        close(fmap);
  1477. X
  1478. X    }
  1479. X    return($retval);
  1480. X}
  1481. X
  1482. X
  1483. X#-----------------------------------------------------------------------
  1484. X# Description  : Copies the given server/soft/mod/class
  1485. X#                to the given target server.
  1486. X# 
  1487. X# Parameters   : $target - server location where a copy is to be
  1488. X#                          placed.
  1489. X#                          if eq '', then $SOFT_DIR is used.
  1490. X#                $server - server location where the software to
  1491. X#                          copy is located.
  1492. X#                          if eq '/', then $SOFT_DIR is used.
  1493. X#                $soft   - software on which to perform the action.
  1494. X#                $mod    - modification  ...
  1495. X#                $class  - class (some class or '')
  1496. X#                $copy   - parts to copy (run,src,install,none)
  1497. X#
  1498. X# Returns      : 1 on success
  1499. X#                0 if any errors
  1500. X#
  1501. Xsub Copy {
  1502. X    if(scalar(@_)!=6){&Error($ERR_INTERNAL,sprintf("(%d), %s:%d", scalar(@_),__FILE__,__LINE__));}
  1503. X    local($target, $server, $soft, $mod, $class, $copy)=@_;
  1504. X    local($space, $total)=(0,0);
  1505. X    local($tmp, $subtotal);
  1506. X    local($todir);        # Destination directory of the copy
  1507. X    local($fromdir);
  1508. X    local($retval)=1;        # Success by default
  1509. X
  1510. X    if ($target eq $server) {    # Error: can't copy on itself
  1511. X      &NFError($ERR_CANNOT_CP_SOFT_ON_ITSELF);
  1512. X      $retval=0;
  1513. X    }
  1514. X    else {
  1515. X      # Set the destination directory for the copy
  1516. X      $todir  =($target ne '/') ? "$SERVER_DIR/$target" : "$SOFT_DIR";
  1517. X      # Set the directory of the original files for the copy
  1518. X      $fromdir=($server ne '/') ? "$SERVER_DIR/$server" : "$SOFT_DIR";
  1519. X
  1520. X      # Change to the destination directory
  1521. X      if (! &ChDir($todir)) {
  1522. X    &NFError($ERR_DIR, "$todir");
  1523. X    $retval=0;
  1524. X      }
  1525. X    }
  1526. X
  1527. X    if ($retval) { #if still no error
  1528. X      # Make the software directory, even though the tar command would
  1529. X      # create it because a symlink might be performed before the tar
  1530. X      # command, and we might have to first append.
  1531. X      if (! -d "$todir/$soft") {
  1532. X    if (&VerboseRetShow($WARN_CMD, "mkdir $todir/$soft")) {
  1533. X      # Show is on, so do nothing
  1534. X    }
  1535. X    elsif (! mkdir("$todir/$soft", 0755)) {
  1536. X      &NFError($ERR_MKDIR, "$todir/$soft");
  1537. X      $retval=0;
  1538. X    }
  1539. X    else {
  1540. X      &ChDir("$todir/$soft");
  1541. X    }
  1542. X      }
  1543. X    }
  1544. X
  1545. X    if ($retval) {        # if still no error
  1546. X    local($lstfiles)='';
  1547. X    # For all sections of a software
  1548. X    for $i ('src', 'install', 'run') {
  1549. X        # Here, we check to see if $i is somewhere in $copy.
  1550. X        # We can do this because $copy is certain to be without error,
  1551. X        # since it is validate in the function &Initialisation.
  1552. X        # Also, install is ALWAYS copied.
  1553. X        if ($i eq 'install' || $copy =~ /$i/) {
  1554. X        # If theres a symlink between $todir/$soft/$i and
  1555. X        # something else we attempt to remove it. It will
  1556. X        # latter be replaced by either a symlink or an
  1557. X        # entire tree of files.
  1558. X        if (-l "$todir/$soft/$i") {
  1559. X            if (! unlink("$todir/$soft/$i")) {
  1560. X            &NFError($ERR_RMSYMLINK, "$todir/$soft/$i");
  1561. X            $retval=0;
  1562. X            }
  1563. X        }
  1564. X        
  1565. X        if ($retval) { # If still no error
  1566. X            # For each classes or only the class of the 
  1567. X            # machine in case of directories run or install.
  1568. X            local(@lst);
  1569. X
  1570. X            if ($i eq 'run') {
  1571. X            @lst=("share", "$mod/share", "$mod/$class");
  1572. X            }
  1573. X            elsif ($i eq 'install') {
  1574. X            @lst=("share", "$mod/share", "$mod/$class",
  1575. X                  $IAFA_FILE, "$mod/$LUDE_FILE");
  1576. X            }
  1577. X            elsif ($i eq 'src') {
  1578. X            # For the sections run, the name
  1579. X            # of the mod ($mod) and orig are enough.
  1580. X            # In the case of the section log, both files
  1581. X            # are log files, and in the case of src
  1582. X            # both files are directories.
  1583. X            # The distinction is not important for tar.
  1584. X            @lst=("orig", "$mod");
  1585. X             }
  1586. X
  1587. X            # For all the files that are to be copied...
  1588. X            for $f (@lst) {
  1589. X            # Push it in the list of files that will
  1590. X            # actually be tared, if the file does exist
  1591. X            # in the original copy.
  1592. X            if (-e "$fromdir/$soft/$i/$f") {
  1593. X                push(@lstfiles, "$i/$f");
  1594. X            }
  1595. X              }
  1596. X        }
  1597. X        }
  1598. X        else {
  1599. X        # Make a symlink
  1600. X
  1601. X        # Do the symlink except if there's already a directory.
  1602. X        if (! -d "$todir/$soft/$i") {
  1603. X            if (! symlink("$fromdir/$soft/$i", 
  1604. X                  "$todir/$soft/$i")) {
  1605. X            # Symlink failed
  1606. X            &NFError($ERR_SYMLINK,
  1607. X                 "$fromdir/$soft/$i", 
  1608. X                 "$todir/$soft/$i", "nil");
  1609. X            $retval=0;
  1610. X            }
  1611. X        }
  1612. X        }
  1613. X    }
  1614. X    
  1615. X    if ($retval) {        # if still no error
  1616. X        # Copy the files using tar, if there's any file to copy
  1617. X        if (scalar(@lstfiles) != 0) {
  1618. X        local($joined_files)=join(' ', @lstfiles);
  1619. X        &RunCmd("cd $fromdir/$soft; $PROG_TAR -cf - $joined_files | (cd $todir/$soft; $PROG_TAR -xf -)");
  1620. X        }
  1621. X        # Append the history file if one exist in $fromdir...
  1622. X        if (-e "$fromdir/$soft/history") {
  1623. X        if (!&CopyFile("$fromdir/$soft/history", "$todir/$soft/history", 'a')) {
  1624. X                # Error while appending
  1625. X             $retval=0;
  1626. X        }
  1627. X        }
  1628. X
  1629. X        # Backward compatibility stuff based on version of lude
  1630. X        # used to install the software ...
  1631. X        if ($LudeVersionUsedForSoft{'major'} == 0 &&
  1632. X        $LudeVersionUsedForSoft{'minor'} <= 13) {
  1633. X          &Link("$todir/$soft", "$LOCAL_DIR/$soft");
  1634. X        }
  1635. X    }
  1636. X    }
  1637. X
  1638. X    return($retval);
  1639. X}
  1640. X
  1641. X
  1642. X#-----------------------------------------------------------------------
  1643. X# Description : Delete the specified soft/mod/class
  1644. X#
  1645. X# Parameters   : $target - server location where the software to
  1646. X#                          remove is placed.
  1647. X#                          if eq '', then $SOFT_DIR is used.
  1648. X#                $soft   - software to remove
  1649. X#                $mod    - modification to remove
  1650. X#                $class  - class to remove
  1651. X#
  1652. X# Returns     : 1 on success
  1653. X#               0 on error
  1654. X#
  1655. Xsub RmCopy {
  1656. X    # Make sure that the number of parameters is correct
  1657. X    if(scalar(@_)!=4){&Error($ERR_INTERNAL,sprintf("(%d), %s:%d",scalar(@_),__FILE__,__LINE__));}
  1658. X    local($target, $soft, $mod, $class)=@_;
  1659. X    local($dir);        # Directory where the soft to delete
  1660. X                # resides.
  1661. X    local($retval)=1;        # Success by default
  1662. X    local($saveCWD);
  1663. X
  1664. X    $saveCWD=&GetCwd();
  1665. X
  1666. X#???BUG???
  1667. X    $dir=($target ne '/') ? "$SERVER_DIR/$target":$SOFT_DIR;
  1668. X
  1669. X    stat("$dir/$soft");
  1670. X    if (-e _) {
  1671. X      if (-d _) {
  1672. X    local(@dirs)=();
  1673. X
  1674. X    &ChDir("$dir/$soft");
  1675. X
  1676. X    #
  1677. X    # Make the list of dirs to remove
  1678. X    #
  1679. X    foreach $d ("run/$mod/$class", "install/$mod/$class") {
  1680. X      $d =~ m|^([^/]*)|o;
  1681. X      if (-e $d && ! -l $1) {
  1682. X        push(@dirs, $d);
  1683. X      }
  1684. X    }
  1685. X
  1686. X    #
  1687. X    # Recursively removing the list of directories just made
  1688. X    #
  1689. X    if (&VerboseRetShow($WARN_CMD, 
  1690. X                sprintf("Recursively Removing %s.",
  1691. X                    join(' ', @dirs)))) {
  1692. X      # Show is on, so do nothing
  1693. X    }
  1694. X    else {
  1695. X      if (&RmFiles('r', @dirs)!=scalar(@dirs)) {
  1696. X        # Error: could not remove all the files
  1697. X        &NFError($ERR_UNLINK, "@dirs");
  1698. X        $retval=0;
  1699. X      }
  1700. X    }
  1701. X
  1702. X    if ($retval) {    # If still no error
  1703. X      #
  1704. X      # Check to see if share should be removed
  1705. X      #
  1706. X
  1707. X      local(@files);
  1708. X                   
  1709. X      # Clean up the run and install sections
  1710. X      foreach $section ("run/$mod", 'run',
  1711. X                "install/$mod", 'install') {
  1712. X        $section =~ m|^([^/]*)|o;
  1713. X        stat($section);    # lstat was not required
  1714. X        if (-d _ && ! -l $1) {
  1715. X          local(*dir);
  1716. X          opendir(dir, $section);
  1717. X          @files=readdir(dir);
  1718. X          closedir(dir);
  1719. X
  1720. X          if ((scalar(@files) -
  1721. X           scalar(grep(/^$IAFA_FILE$/o, @files)) -
  1722. X           scalar(grep(/^$LUDE_FILE$/o, @files)) -
  1723. X           scalar(grep(/^share$/o, @files))) == 2) {
  1724. X        # Directory is empty, except for
  1725. X        # a share directory and/or the $IAFA_FILE. So, that
  1726. X        # directory is not required anymore.
  1727. X
  1728. X        # Remove the share directory and the $IAFA_FILE.
  1729. X        if (&VerboseRetShow($WARN_CMD, 
  1730. X                    sprintf("Recursively Removing %s.",
  1731. X                        $section))) {
  1732. X          # Show is on, so do nothing
  1733. X        }
  1734. X        else {
  1735. X          if (&RmFiles('r', $section) == 0) {
  1736. X            &NFError($ERR_UNLINK, "$section");
  1737. X            $retval=0;
  1738. X          }
  1739. X        }
  1740. X          }
  1741. X          else {
  1742. X        # Directory has some other thing besides
  1743. X        # share, so skip it.
  1744. X          }
  1745. X        }
  1746. X      }
  1747. X
  1748. X      # If there's no install left for a modification, we then 
  1749. X      # remove the mod in src.
  1750. X      if (! -e "install/$mod") {
  1751. X        local(@dirs)=();    # List of other dirs to remove
  1752. X
  1753. X        for $d ("src/$mod") {
  1754. X          $d=~m|^([^/]*)|o;
  1755. X          if (! -l $1) {
  1756. X        push(@dirs, $d);
  1757. X          }
  1758. X        }
  1759. X          
  1760. X        if (&VerboseRetShow($WARN_CMD, 
  1761. X                sprintf("Recursively Removing %s.",
  1762. X                    join(' ', @dirs)))) {
  1763. X          # Show is on, so do nothing
  1764. X        }
  1765. X        else {
  1766. X          if (&RmFiles('r', @dirs)!=scalar(@dirs)) {
  1767. X        # Error: could not remove all the files
  1768. X        &NFError($ERR_UNLINK, "@dirs");
  1769. X        $retval=0;
  1770. X          }
  1771. X        }
  1772. X      }
  1773. X
  1774. X      # If the directory install does not exist anymore, then
  1775. X      # the rest of the software can be removed
  1776. X      if (! -e 'install') {
  1777. X        if (&VerboseRetShow($WARN_CMD, 
  1778. X                sprintf("Recursively Removing %s.",
  1779. X                    join(' ', @dirs)))) {
  1780. X          # Show is on, so do nothing
  1781. X        }
  1782. X        else {
  1783. X          if (&RmFiles('r', "$dir/$soft")!=1) {
  1784. X        # Error: could not remove all the files
  1785. X        &NFError($ERR_UNLINK, "$dir/$soft");
  1786. X        $retval=0;
  1787. X          }
  1788. X          else { # removal was successful
  1789. X        # Backward compatibility stuff based on version
  1790. X        # of lude that was used to install the soft ...
  1791. X        if ($LudeVersionUsedForSoft{'major'} == 0 &&
  1792. X            $LudeVersionUsedForSoft{'minor'} <= 13) {
  1793. X          &UnLink("$dir/$soft", "$LOCAL_DIR/$soft");
  1794. X        }
  1795. X          }
  1796. X        }
  1797. X      }
  1798. X    }
  1799. X      }
  1800. X      else {
  1801. X    # $dir/$soft is not a directory, so
  1802. X    # don't bother
  1803. X      }
  1804. X    }
  1805. X    else {
  1806. X    # $dir/$soft does not exist, so don't bother.
  1807. X    }
  1808. X
  1809. X    &ChDir($saveCWD);
  1810. X    return $retval;
  1811. X}
  1812. X
  1813. X
  1814. X#------------------------------------------------------------------
  1815. X# Description: Recursively makes the symbolic links for between the
  1816. X#              trees $fromdir and $todir.
  1817. X#
  1818. X# Parameters : $fromdir - Directory where the actual files are located
  1819. X#              $todir   - Directory where symlinks and/or dir are added
  1820. X#              $suffix  - File name relative to $fromdir
  1821. X#
  1822. X# Returns    : 1 on success
  1823. X#              0 if any errors 
  1824. X#
  1825. Xsub MkLinks {
  1826. X    if(scalar(@_)!=3){&Error(ERR_INTERNAL,sprintf("(%d), %s:%d",scalar(@_),__FILE__,__LINE__));}
  1827. X    local($fromdir, $todir, $suffix)=@_;
  1828. X    local($retval)=1;        # By default success
  1829. X
  1830. X    local($fromfile, $tofile, $newsuffix, $lnkval);
  1831. X
  1832. X    # Read all the file names in $fromdir. In the special
  1833. X    # case where $suffix eq '', we do not append it to $fromdir.
  1834. X    # Sort the filenames, and remove the file names 
  1835. X    # '.' and '..'
  1836. X    local(*dir);
  1837. X    opendir(dir, ($suffix eq "") ? "$fromdir":"$fromdir/$suffix");
  1838. X    local(@files)=sort grep(!/^\.{1,2}$/, readdir(dir));
  1839. X    closedir(dir);
  1840. X
  1841. X    # For each files in $fromdir/$suffix ...
  1842. X    for $file (@files) {
  1843. X    if ($suffix eq "") {
  1844. X        $newsuffix="$file";
  1845. X    }
  1846. X    else {
  1847. X        $newsuffix="$suffix/$file";
  1848. X    }
  1849. X        
  1850. X    $fromfile="$fromdir/$newsuffix";
  1851. X
  1852. X    # skip to the next file, if the current file was asked
  1853. X    # to be excluded
  1854. X    next if (grep(/^$newsuffix$/, @Exclude));
  1855. X
  1856. X    $tofile=&GetLongestRename($todir, $newsuffix);
  1857. X
  1858. X    if (-l $tofile) { 
  1859. X        $lnkval=readlink($tofile); 
  1860. X    } 
  1861. X    else {
  1862. X        # Set $lnkval to a value that is impossible for a file name
  1863. X        $lnkval='///';
  1864. X    }
  1865. X
  1866. X    if ($lnkval eq $fromfile) {
  1867. X        # The link is already existant
  1868. X        &Warning($WARN_LINK_THERE_AND_CORRECT, $fromfile, $tofile);
  1869. X    }
  1870. X    elsif (-d $fromfile) {
  1871. X        # $tofile is not taken as a symbolic link if $suffix is ''
  1872. X        # because people could do a link between some other
  1873. X        # partition and /usr/local/bin, for example. This let
  1874. X        # them have bin, lib, man, etc. on different partition
  1875. X        # and use symlinks rather than mounts.
  1876. X        if ( -l $tofile && $suffix ne "") {
  1877. X        # Test to see if it is a link that was generated
  1878. X        # for the specified Software       
  1879. X        if ($lnkval =~ m|^$SOFT_DIR/[^/]+/run/|) {
  1880. X            local($dirname);
  1881. X            
  1882. X            $dirname=&DirName($fromfile);
  1883. X            
  1884. X            # Check for write permission on the dir where $todir
  1885. X            # is located
  1886. X            if ( -w $dirname ) {
  1887. X            # There's a link to some other software (because
  1888. X            # $tofile is a link pointing to some other soft
  1889. X            # tree), so we first explode the directory to
  1890. X            # allow to make symlinks for the current
  1891. X            # software.
  1892. X            if (! &Explode($tofile)) {
  1893. X                $retval=0; # Error
  1894. X            }
  1895. X            elsif (! &VerboseRetShow()) {
  1896. X                # Recurse only if the work is really
  1897. X                # performed. i.e. if not only showing the
  1898. X                # commands that will be performed.
  1899. X                if (! &MkLinks($fromdir, $todir, $newsuffix)) {
  1900. X                $retval=0; # Error
  1901. X                }
  1902. X            }
  1903. X            }
  1904. X            else {
  1905. X            # write permission on $dirname is required
  1906. X            # not set. So this resulted in the impossibility
  1907. X            # to make the explosion.
  1908. X            &NFError($ERR_NO_W_PERM, $dir);
  1909. X            $retval=0;
  1910. X            }
  1911. X        }
  1912. X        else {
  1913. X            # Error, since an explosion is required
  1914. X            # and cannot be performed due to an 
  1915. X            # apperent incorrect symlink
  1916. X            &NFError($ERR_EXPLODE, $tofile, $lnkval);
  1917. X            $retval=0;    # Error
  1918. X        }
  1919. X        }
  1920. X        elsif (-d $tofile) {
  1921. X        # Can't make a symlink because of the existence
  1922. X        # of a directory, so go deeper to make the symlinks
  1923. X        # by recursing.
  1924. X        if (! &MkLinks($fromdir, $todir, $newsuffix)) {
  1925. X            $retval=0;    # Error
  1926. X        }
  1927. X        }
  1928. X        else {
  1929. X        # Test to see if $newsuffix happens to be the start of
  1930. X        # a key in the rename assoc array, without being a 
  1931. X        # whole key.
  1932. X        # If this is the case, then we can't simply make a
  1933. X        # symlink to $fromfile since there is a possibility of a
  1934. X        # rename of a file name that is deeper that the current
  1935. X        # directory.
  1936. X        # Example:
  1937. X        #    rename lib-inc lib/aux
  1938. X        #    rename lib-inc/a /etc/b 
  1939. X        # So if we stop at lib-inc (because it matches $newsuffix)
  1940. X        # we miss lib-inc/a which should be in a totaly different
  1941. X        # place.
  1942. X        local($canlink, $key);
  1943. X        $canlink=1;    # By default -> can link
  1944. X        for $key (keys %Rename) {
  1945. X            if (index($key,$newsuffix)==$[ &&
  1946. X            length($key)>length($newsuffix)) {
  1947. X                        # Found that the link can't be done. Will
  1948. X            # have to mkdir and recurse.
  1949. X            $canlink=0; 
  1950. X            last;
  1951. X            }
  1952. X        }
  1953. X        if ($canlink) {    # Can make the symlink
  1954. X            if (! &Link($fromfile, $tofile)) {
  1955. X            $retval=0;
  1956. X            }
  1957. X        }
  1958. X        else {        # Cannot make the symlink
  1959. X            # Can't link because we could miss some files
  1960. X            # so, instead, the directory is created
  1961. X            if (&VerboseRetShow($WARN_CMD, "MkDir $tofile")) {
  1962. X            # Show is on, so do nothing
  1963. X            &VerboseRetShow($WARN_MSG, "Recursing ... (not shown)");
  1964. X            }
  1965. X            else {
  1966. X            if ( ! mkdir($dst,0755) ) {
  1967. X                &NFError($ERR_MKDIR, $tofile, $!);
  1968. X                $retval=0; # Error
  1969. X            }
  1970. X            else {
  1971. X                # So far so good!
  1972. X                if (! &MkLinks($fromdir, $todir, $newsuffix)) {
  1973. X                $retval=0;
  1974. X                }
  1975. X            }
  1976. X            }
  1977. X        }
  1978. X        }
  1979. X    }
  1980. X    elsif ( -l $fromfile || -f $fromfile ) {
  1981. X        if (! &Link($fromfile, $tofile)) {
  1982. X        $retval=0;
  1983. X        }
  1984. X    }
  1985. X    else {
  1986. X        &NFError(ERR_WRONG_FILE_TYPE, $fromfile);
  1987. X        $retval=0;
  1988. X    }
  1989. X    }
  1990. X    return $retval;
  1991. X}
  1992. X
  1993. X
  1994. X#--------------------------------------------------------------------
  1995. X#
  1996. X# Remove the Links
  1997. X#
  1998. X# Parameters : srcrep   : Directory where the actual files are located
  1999. X#              dstrep   : Directory where symlinks and/or dir are added
  2000. X#              f        : File name relative to ...Rep
  2001. X#
  2002. X# Returns    : nothing
  2003. X
  2004. Xsub RmLinks {
  2005. X    if (scalar(@_)!=3) {
  2006. X    &Error(ERR_INTERNAL, 
  2007. X           sprintf("(%d), %s:%d", scalar(@_), __FILE__, __LINE__));
  2008. X    }
  2009. X    local($srcrep, $dstrep, $f)=@_;
  2010. X    local($src, $dst, $newfile);
  2011. X    local($retval)=1;        # Success by default
  2012. X
  2013. X    if ( -l $dst && (readlink($dst) eq $src) ) {
  2014. X    # The link is already existant
  2015. X    &Warning($WARN_LINK_THERE_AND_CORRECT, $src, $dst);
  2016. X    }
  2017. X    elsif ( -d $srcrep ) {
  2018. X#    &Warning($WARN_CMD, "RmLinks: $srcrep/$f") if ( $Show );
  2019. X
  2020. X    opendir(DIR, (($f eq "") ? "$srcrep":"$srcrep/$f"));
  2021. X    local(@files)=sort grep(!/^\.{1,2}$/, readdir(DIR));
  2022. X    closedir(DIR);
  2023. X
  2024. X    for $file (@files) {
  2025. X        if ($f eq "") {
  2026. X        $newfile="$file";
  2027. X        }
  2028. X        else {
  2029. X        $newfile="$f/$file";
  2030. X        }
  2031. X        
  2032. X        $src = "$srcrep/$newfile";
  2033. X    
  2034. X        # skip to the next file, if the current file was asked
  2035. X        # to be excluded
  2036. X        next if (grep(/^$newfile$/, @Exclude));
  2037. X        
  2038. X        $dst=&GetLongestRename($dstrep, $newfile);
  2039. X
  2040. X        if  (-l $dst) {
  2041. X        if (! &UnLink($src, $dst)) {
  2042. X            $retval=0;
  2043. X        }
  2044. X        }
  2045. X        elsif (-d $dst) {
  2046. X        if (! &RmLinks($srcrep, $dstrep, $newfile)) {
  2047. X            $retval=0;
  2048. X        }
  2049. X        }
  2050. X        else {
  2051. X        # Not a link, so do not care
  2052. X        }
  2053. X    }
  2054. X    }
  2055. X    return $retval;
  2056. X}
  2057. X
  2058. X
  2059. X#------------------------------------------------------------------
  2060. X#
  2061. X#
  2062. X#
  2063. Xsub GetLongestRename {
  2064. X    if (scalar(@_)!=2) {
  2065. X    &Error(ERR_INTERNAL, 
  2066. X           sprintf("(%d), %s:%d", scalar(@_), __FILE__, __LINE__));
  2067. X    }
  2068. X    local($dstrep, $newfile)=@_;
  2069. X    local($matchlen, $newname)=0;
  2070. X
  2071. X    $newname="$dstrep/$newfile";
  2072. X
  2073. X    # Check to see if a rename was specified for the 
  2074. X    # current file.
  2075. X    # The longest match found will be the one kept.
  2076. X    for (keys %Rename) {
  2077. X    if ($newfile =~ m|^$_((/[^/]+)*)$|) {
  2078. X        if (length($_) > $matchlen) {
  2079. X        $matchlen=length($_);
  2080. X        if (substr($Rename{$_}, 0, 1) eq "/") {
  2081. X            $newname="$Rename{$_}$1";
  2082. X        }
  2083. X        else {
  2084. X            $newname="$dstrep/$Rename{$_}$1";
  2085. X        }
  2086. X        }
  2087. X    }
  2088. X    }
  2089. X
  2090. X    return ($newname);
  2091. X}
  2092. X
  2093. X
  2094. X#------------------------------------------------------------------
  2095. X#
  2096. X# Perform a single link
  2097. X#
  2098. X# Return  : 1 on success
  2099. X#           0 if any errors
  2100. X#
  2101. Xsub Link {
  2102. X    if (scalar(@_)!=2) {&Error(ERR_INTERNAL,sprintf("(%d), %s:%d", scalar(@_), __FILE__, __LINE__));}
  2103. X    local($src, $dst)=@_;
  2104. X    local($retval)=1;        # Success by default
  2105. X    local($dir);
  2106. X    local($lnkval);
  2107. X
  2108. X    ($dir = $dst) =~ s|(.*)/[^/]+|$1|o;
  2109. X
  2110. X    if (-l $dst && (readlink($dst) eq $src)) {
  2111. X    # The link is already existant
  2112. X    &Warning($WARN_LINK_THERE_AND_CORRECT, $src, $dst);
  2113. X    }
  2114. X    elsif (-w $dir) {
  2115. X    # The -e test alone is not sufficient because it will
  2116. X    # fail if there is a link to a non-existant file.
  2117. X    # Therefore, the test -l must be added to take care
  2118. X    # of the special condition.
  2119. X    if (-e $dst || -l $dst) {
  2120. X        if ($Preserve ne "") {
  2121. X        # Preserve old file
  2122. X        if (&VerboseRetShow($WARN_CMD, 
  2123. X                    "rename $dst (will remove $dst$Preserve if it exist)")) {
  2124. X            # Show is on, so do nothing
  2125. X        }
  2126. X        else {
  2127. X            if (!rename("$dst", "$dst$Preserve")) {
  2128. X            &NFError($ERR_REN, $dst, $!);
  2129. X            $retval=0;
  2130. X            }
  2131. X        }
  2132. X        }
  2133. X        elsif ($Force) {
  2134. X        # Delete old file
  2135. X        if (&VerboseRetShow($WARN_CMD, "unlink $dst")) { 
  2136. X            # Show is on, so do nothing
  2137. X        }
  2138. X        else {
  2139. X            if (unlink($dst) == 0 ) { # 0 means unlink succeeded
  2140. X            &NFError($ERR_RMSYMLINK, $dst);
  2141. X            $retval=0;
  2142. X            }
  2143. X        }
  2144. X        }
  2145. X        else {
  2146. X        # Error
  2147. X        &NFError($ERR_SYMLINK, $src, $dst, 'nil'); 
  2148. X        $retval=0;
  2149. X        }
  2150. X    }
  2151. X
  2152. X    if ($retval) {        # If still no error
  2153. X        # Perform the link
  2154. X        if (&VerboseRetShow($WARN_CMD, "Link $src <- $dst.")) {
  2155. X        # Show is on, so do nothing
  2156. X        }
  2157. X        elsif (! symlink($src, $dst) ) {
  2158. X        &NFError($ERR_SYMLINK, $src, $dst, 'nil');
  2159. X        $retval=0;
  2160. X        }
  2161. X    }
  2162. X    }
  2163. X    else {
  2164. X    # Do not have permission to make the link
  2165. X    &NFError($ERR_SYMLINK, $src, $dst, 'nil'); 
  2166. X    $retval=0;
  2167. X    }
  2168. X
  2169. X    return($retval);
  2170. X}
  2171. X
  2172. X
  2173. X#------------------------------------------------------------------
  2174. X#
  2175. X# Perform an Unlink by taking into account various parameters
  2176. X# such as show
  2177. X#
  2178. X# Return  : 1 on success
  2179. X#           0 if any errors
  2180. X#
  2181. Xsub UnLink {
  2182. X    if (scalar(@_)!=2) {
  2183. X    &Error(ERR_INTERNAL, 
  2184. X           sprintf("(%d), %s:%d", scalar(@_), __FILE__, __LINE__));
  2185. X    }
  2186. X    local($src, $dst)=@_;
  2187. X    local($lnkval);
  2188. X    local($retval)=1;        # Success by default
  2189. X
  2190. X    $lnkval=readlink($dst);
  2191. X    
  2192. X    # Test to see if the link is really between
  2193. X    # src <- dst.
  2194. X    if ( $lnkval eq $src) {
  2195. X    if (&VerboseRetShow($WARN_CMD, "UnLink $dst")) {
  2196. X        # Show is on, so do nothing
  2197. X    }
  2198. X    else {
  2199. X        if (! unlink($dst)) {
  2200. X        &NFError($ERR_RMSYMLINK, $dst);
  2201. X        $retval=0;
  2202. X        }
  2203. X    }
  2204. X    }
  2205. X    else {
  2206. X    # Not a symlink we made. Ignore it.
  2207. X    }
  2208. X
  2209. X    return $retval;
  2210. X}
  2211. X
  2212. X
  2213. X#------------------------------------------------------------------
  2214. X#
  2215. X# srcrep   :   Directory where the actual files are located
  2216. X# dstrep   :   Directory where symlinks and/or dir are added
  2217. X#
  2218. X# Return  : 1 on success
  2219. X#           0 if any errors
  2220. X#
  2221. Xsub Explode {
  2222. X    if (scalar(@_)!=1) {
  2223. X    &Error(ERR_INTERNAL, 
  2224. X           sprintf("(%d), %s:%d", scalar(@_), __FILE__, __LINE__));
  2225. X    }
  2226. X    local($dst)=@_;
  2227. X    local($src, $dstrep,$srcrep,$newfile,$dir);
  2228. X    local($retval)=1;        # Success by default
  2229. X    
  2230. X    $src=readlink($dst);
  2231. X    ($dstrep=$dst) =~ s|^(.*)/[^/]+$|$1|o;
  2232. X
  2233. X    &VerboseRetShow($WARN_OUT, "Exploding $dst ...");
  2234. X
  2235. X    if (&VerboseRetShow($WARN_CMD, "UnLink $dst")) {
  2236. X    # Show is on, so do nothing
  2237. X    &VerboseRetShow($WARN_CMD, "MkDir $dst");   
  2238. X    &VerboseRetShow($WARN_MSG, 
  2239. X            "when showing, the recursion is not performed in Explode");
  2240. X    }
  2241. X    else {
  2242. X    if (unlink($dst) == 0) { # 0 unlink succeeded
  2243. X        &NFError($ERR_RMSYMLINK, $dst);
  2244. X        $retval=0;
  2245. X    }
  2246. X    elsif (! mkdir($dst,0755)) {
  2247. X        &NFError($ERR_MKDIR, $dst, $!);
  2248. X        $retval=0;
  2249. X    }
  2250. X    else {
  2251. X        # So far so good!
  2252. X        ($srcrep = $src) =~ s|(.*)/[^/]+$|$1|o;
  2253. X        ($newfile = $src) =~ s|.*/([^/]+)$|$1|o;
  2254. X
  2255. X        # When exploding, the symlink that is changed to a dir 
  2256. X        # belong to another software. Therefore, the mapping
  2257. X        # file for that software must be read. After the 
  2258. X        # explosion, the previous mapping information
  2259. X        # must be restored.
  2260. X
  2261. X        local(%saverename,@saveexclude,$mappingfiledir);
  2262. X        %saverename=%Rename;
  2263. X        undef %Rename;
  2264. X        @saveexclude=@Exclude;
  2265. X        undef @Exclude;
  2266. X
  2267. X        # Read Mapping file
  2268. X        ($mappingfiledir=$srcrep) =~ 
  2269. X        s|^(.*)/run(/[^/]+/[^/]+).*$|$1/install$2|o;
  2270. X
  2271. X        if (-r "$mappingfiledir/$MAPPING") {
  2272. X        if (! &ReadMapping("$mappingfiledir/$MAPPING")) {
  2273. X            $retval=0;
  2274. X        }
  2275. X        }
  2276. X    
  2277. X        if ($retval) {    # If still no error
  2278. X        if (! &MkLinks($srcrep, $dstrep, $newfile)) {
  2279. X            $retval=0;
  2280. X        }
  2281. X        }
  2282. X
  2283. X        # The restore has to be made even if an error occured
  2284. X
  2285. X        # Restore Exclude
  2286. X        @Exclude=@saveexclude;
  2287. X        # Restore Rename
  2288. X        %Rename=%saverename;
  2289. X    }
  2290. X    }
  2291. X    
  2292. X    &VerboseRetShow($WARN_EXPLODE_DONE, $dst);
  2293. X    
  2294. X    return $retval;
  2295. X}
  2296. X
  2297. X
  2298. X#-----------------------------------------------------------------------
  2299. X#
  2300. X#
  2301. Xsub LinkDoc {
  2302. X    local($soft,$mod)=@_;
  2303. X
  2304. X    local($docdir)="$LOCAL_DIR/doc";        # Location of doc files.
  2305. X
  2306. X    # Create the $docdir directory
  2307. X    if (! -e $docdir) {
  2308. X    mkdir($docdir, 0755) || &Error($ERR_MKDIR, $docdir, $!);
  2309. X    }
  2310. X
  2311. X    # creates, in the directory $docdir,
  2312. X    # a subdirectory with the same name as the software
  2313. X    # package to install.
  2314. X    if (! -e "$docdir/$soft") {
  2315. X    mkdir("$docdir/$soft", 0755) || &Error($ERR_MKDIR, "$docdir/$soft", $!);
  2316. X    }
  2317. X
  2318. X    # In $docdir/$soft, create two symbolic links that point
  2319. X    # to the files install/$IAFA_FILE and install/$mod/$LUDE_FILE
  2320. X    if (-e "$SOFT_DIR/$soft/log/$orig") {
  2321. X    &Link("$SOFT_DIR/$soft/install/$IAFA_FILE",
  2322. X          "$docdir/$soft/$IAFA_FILE");
  2323. X    }
  2324. X    if (-e "$SOFT_DIR/$soft/log/$mod") {
  2325. X    &Link("$SOFT_DIR/$soft/install/$mod/$LUDE_FILE",
  2326. X          "$docdir/$soft/${LUDE_FILE}-$mod");
  2327. X    }
  2328. X}
  2329. X
  2330. X#-----------------------------------------------------------------------
  2331. X#
  2332. X#
  2333. Xsub RmLinkDoc {
  2334. X    local($soft, $mod)=@_;
  2335. X    local($retval)=1;        # Success by default
  2336. X
  2337. X    local($docdir)="$LOCAL_DIR/doc";        # Location of doc files.
  2338. X
  2339. X    lstat("$docdir/$soft/$IAFA_FILE");
  2340. X    if (-e _ && -l _) {
  2341. X    &UnLink("$SOFT_DIR/$soft/install/$IAFA_FILE",
  2342. X        "$docdir/$soft/$IAFA_FILE");
  2343. X    }
  2344. X    lstat("$docdir/$soft/${LUDE_FILE}-$mod");
  2345. X    if (-e _ && -l _) {
  2346. X    &UnLink("$SOFT_DIR/$soft/install/$mod/$LUDE_FILE",
  2347. X        "$docdir/$soft/${LUDE_FILE}-$mod");
  2348. X    }
  2349. X    if (&VerboseRetShow($WARN_CMD, "rmdir $docdir/$soft")) {
  2350. X    # Show is on, so do nothing
  2351. X    }
  2352. X    else {
  2353. X    if (! rmdir("$docdir/$soft")) {
  2354. X        &NFError($ERR_RMDIR, "$docdir/$soft", $!);
  2355. X        $retval=0;
  2356. X    }
  2357. X    }
  2358. X    return $retval;
  2359. X}
  2360. X
  2361. X
  2362. X#     ;;; Local Variables: ***
  2363. X#     ;;; mode:perl ***
  2364. X#     ;;; End: ***
  2365. END_OF_FILE
  2366.   if test 28905 -ne `wc -c <'lude-1.1/src/orig/src/lude'`; then
  2367.     echo shar: \"'lude-1.1/src/orig/src/lude'\" unpacked with wrong size!
  2368.   fi
  2369.   chmod +x 'lude-1.1/src/orig/src/lude'
  2370.   # end of 'lude-1.1/src/orig/src/lude'
  2371. fi
  2372. echo shar: End of archive 5 \(of 12\).
  2373. cp /dev/null ark5isdone
  2374. MISSING=""
  2375. for I in 1 2 3 4 5 6 7 8 9 10 11 12 ; do
  2376.     if test ! -f ark${I}isdone ; then
  2377.     MISSING="${MISSING} ${I}"
  2378.     fi
  2379. done
  2380. if test "${MISSING}" = "" ; then
  2381.     echo You have unpacked all 12 archives.
  2382.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2383. else
  2384.     echo You still must unpack the following archives:
  2385.     echo "        " ${MISSING}
  2386. fi
  2387. exit 0
  2388. exit 0 # Just in case...
  2389.