You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by nd...@apache.org on 2003/02/22 18:06:21 UTC

cvs commit: apache-1.3/src/support apxs.pl

nd          2003/02/22 09:06:20

  Modified:    src      CHANGES
               src/support apxs.pl
  Log:
  insert LoadModule/AddModule directives only outside of sections.
  
  PR: 8712, 9012
  
  Revision  Changes    Path
  1.1881    +3 -0      apache-1.3/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/CHANGES,v
  retrieving revision 1.1880
  retrieving revision 1.1881
  diff -u -r1.1880 -r1.1881
  --- CHANGES	22 Feb 2003 15:25:43 -0000	1.1880
  +++ CHANGES	22 Feb 2003 17:06:16 -0000	1.1881
  @@ -1,5 +1,8 @@
   Changes with Apache 1.3.28
   
  +  *) Fix apxs to insert LoadModule/AddModule directives only outside of
  +     sections. PR 8712, 9012.  [Andr� Malo]
  +
     *) Fix suexec compile error under SUNOS4, where strerror() doesn't
        exist. PR 5913, 9977.
        [Jonathan W Miner <Jo...@lmco.com>]
  
  
  
  1.42      +89 -4     apache-1.3/src/support/apxs.pl
  
  Index: apxs.pl
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/support/apxs.pl,v
  retrieving revision 1.41
  retrieving revision 1.42
  diff -u -r1.41 -r1.42
  --- apxs.pl	3 Feb 2003 17:13:36 -0000	1.41
  +++ apxs.pl	22 Feb 2003 17:06:20 -0000	1.42
  @@ -543,9 +543,69 @@
           foreach $lmd (@lmd) {
               my $what = $opt_A ? "preparing" : "activating";
               if ($content !~ m|\n#?\s*$lmd|) {
  -                 $content =~ s|^(.*\n#?\s*LoadModule\s+[^\n]+\n)|$1$c$lmd\n|sg;
  +                # check for open <containers>, so that the new LoadModule
  +                # directive always appears *outside* of an <container>.
  +
  +                my $before = ($content =~ m|^(.*\n)#?\s*LoadModule\s+[^\n]+\n|s)[0];
  +
  +                # the '()=' trick forces list context and the scalar
  +                # assignment counts the number of list members (aka number
  +                # of matches) then
  +                my $cntopen = () = ($before =~ m|^\s*<[^/].*$|mg);
  +                my $cntclose = () = ($before =~ m|^\s*</.*$|mg);
  +
  +                if ($cntopen == $cntclose) {
  +                    # fine. Last LoadModule is contextless.
  +                    $content =~ s|^(.*\n#?\s*LoadModule\s+[^\n]+\n)|$1$c$lmd\n|s;
  +                }
  +                elsif ($cntopen < $cntclose) {
  +                    print STDERR 'Configuration file is not valid. There are '
  +                                 . "sections closed before opened.\n";
  +                    exit(1);
  +                }
  +                else {
  +                    # put our cmd after the section containing the last
  +                    # LoadModule.
  +                    my $found =
  +                    $content =~ s!\A (               # string and capture start
  +                                  (?:(?:
  +                                    ^\s*             # start of conf line with a
  +                                    (?:[^<]|<[^/])   # directive which does not
  +                                                     # start with '</'
  +
  +                                    .*(?:$)\n        # rest of the line.
  +                                                     # the '$' is in parentheses
  +                                                     # to avoid misinterpreting
  +                                                     # the string "$\" as
  +                                                     # perl variable.
  +
  +                                    )*               # catch as much as possible
  +                                                     # of such lines. (including
  +                                                     # zero)
  +
  +                                    ^\s*</.*(?:$)\n? # after the above, we
  +                                                     # expect a config line with
  +                                                     # a closing container (</)
  +
  +                                  ) {$cntopen}       # the whole pattern (bunch
  +                                                     # of lines that end up with
  +                                                     # a closing directive) must
  +                                                     # be repeated $cntopen
  +                                                     # times. That's it.
  +                                                     # Simple, eh? ;-)
  +
  +                                  )                  # capture end
  +                                 !$1$c$lmd\n!mx;
  +
  +                    unless ($found) {
  +                        print STDERR 'Configuration file is not valid. There '
  +                                     . "are sections opened and not closed.\n";
  +                        exit(1);
  +                    }
  +                }
               } else {
  -                 $content =~ s|^(.*\n)#?\s*$lmd[^\n]*\n|$1$c$lmd\n|sg;
  +                # replace already existing LoadModule line
  +                $content =~ s|^(.*\n)#?\s*$lmd[^\n]*\n|$1$c$lmd\n|s;
               }
               $lmd =~ m|LoadModule\s+(.+?)_module.*|;
               print STDERR "[$what module `$1' in $cfgbase.conf]\n";
  @@ -553,9 +613,34 @@
           my $amd;
           foreach $amd (@amd) {
               if ($content !~ m|\n#?\s*$amd|) {
  -                 $content =~ s|^(.*\n#?\s*AddModule\s+[^\n]+\n)|$1$c$amd\n|sg;
  +                # check for open <containers> etc. see above for explanations.
  +
  +                my $before = ($content =~ m|^(.*\n)#?\s*AddModule\s+[^\n]+\n|s)[0];
  +                my $cntopen = () = ($before =~ m|^\s*<[^/].*$|mg);
  +                my $cntclose = () = ($before =~ m|^\s*</.*$|mg);
  +
  +                if ($cntopen == $cntclose) {
  +                    $content =~ s|^(.*\n#?\s*AddModule\s+[^\n]+\n)|$1$c$amd\n|s;
  +                }
  +                elsif ($cntopen < $cntclose) {
  +                    # cannot happen here, but who knows ...
  +                    print STDERR 'Configuration file is not valid. There are '
  +                                 . "sections closed before opened.\n";
  +                    exit(1);
  +                }
  +                else {
  +                    unless ($content =~ s!\A((?:(?:^\s*(?:[^<]|<[^/]).*(?:$)\n)*
  +                                          ^\s*</.*(?:$)\n?){$cntopen})
  +                                         !$1$c$amd\n!mx) {
  +                        # cannot happen here, anyway.
  +                        print STDERR 'Configuration file is not valid. There '
  +                                     . "are sections opened and not closed.\n";
  +                        exit(1);
  +                    }
  +                }
               } else {
  -                 $content =~ s|^(.*\n)#?\s*$amd[^\n]*\n|$1$c$amd\n|sg;
  +                # replace already existing AddModule line
  +                $content =~ s|^(.*\n)#?\s*$amd[^\n]*\n|$1$c$amd\n|s;
               }
           }
           if (@lmd or @amd) {