1#!/usr/bin/perl
2#
3# Copyright (C) 2009, 2010, 2012  Internet Systems Consortium, Inc. ("ISC")
4#
5# Permission to use, copy, modify, and/or distribute this software for any
6# purpose with or without fee is hereby granted, provided that the above
7# copyright notice and this permission notice appear in all copies.
8#
9# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11# AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15# PERFORMANCE OF THIS SOFTWARE.
16
17# Id
18
19# updatelibxml2.pl
20# This script locates the latest version of libxml2 in the grandparent
21# directory and updates the build scripts to use that version.
22# Copied from updateopenssl.pl.
23#
24# Path and directory
25$path = "..\\..\\";
26
27# List of files that need to be updated with the actual version of the
28# libxml2 directory
29@filelist = ("SetupLibs.bat",
30             "../lib/dns/win32/libdns.mak",
31             "../lib/dns/win32/libdns.dsp",
32             "../bin/check/win32/checktool.dsp",
33             "../bin/check/win32/namedcheckconf.dsp",
34             "../bin/check/win32/namedcheckconf.mak",
35             "../bin/check/win32/namedcheckzone.dsp",
36             "../bin/check/win32/namedcheckzone.mak",
37             "../bin/confgen/win32/confgentool.dsp",
38             "../bin/confgen/win32/ddnsconfgen.dsp",
39             "../bin/confgen/win32/ddnsconfgen.mak",
40             "../bin/confgen/win32/rndcconfgen.dsp",
41             "../bin/confgen/win32/rndcconfgen.mak",
42             "../bin/dig/win32/dig.dsp",
43             "../bin/dig/win32/dig.mak",
44             "../bin/dig/win32/dighost.dsp",
45             "../bin/dig/win32/host.dsp",
46             "../bin/dig/win32/host.mak",
47             "../bin/dig/win32/nslookup.dsp",
48             "../bin/dig/win32/nslookup.mak",
49             "../bin/dnssec/win32/dnssectool.dsp",
50             "../bin/dnssec/win32/dsfromkey.dsp",
51             "../bin/dnssec/win32/dsfromkey.mak",
52             "../bin/dnssec/win32/keyfromlabel.dsp",
53             "../bin/dnssec/win32/keyfromlabel.mak",
54             "../bin/dnssec/win32/keygen.dsp",
55             "../bin/dnssec/win32/keygen.mak",
56             "../bin/dnssec/win32/revoke.dsp",
57             "../bin/dnssec/win32/revoke.mak",
58             "../bin/dnssec/win32/settime.dsp",
59             "../bin/dnssec/win32/settime.mak",
60             "../bin/dnssec/win32/signzone.dsp",
61             "../bin/dnssec/win32/signzone.mak",
62             "../bin/named/win32/named.dsp",
63             "../bin/named/win32/named.mak",
64             "../bin/nsupdate/win32/nsupdate.dsp",
65             "../bin/nsupdate/win32/nsupdate.mak",
66             "../bin/rndc/win32/rndc.dsp",
67             "../bin/rndc/win32/rndc.mak",
68             "../bin/tools/win32/journalprint.dsp",
69             "../bin/tools/win32/journalprint.mak",
70             "../lib/bind9/win32/libbind9.dsp",
71             "../lib/bind9/win32/libbind9.mak",
72             "../lib/dns/win32/libdns.dsp",
73             "../lib/dns/win32/libdns.mak",
74             "../lib/isc/win32/libisc.dsp",
75             "../lib/isc/win32/libisc.mak",
76	     "../lib/isc/win32/libisc.def",
77             "../lib/isccc/win32/libisccc.dsp",
78             "../lib/isccc/win32/libisccc.mak",
79             "../lib/isccfg/win32/libisccfg.dsp",
80             "../lib/isccfg/win32/libisccfg.mak");
81
82# Locate the libxml2 directory
83$substr = getdirectory();
84if ($substr eq 0) {
85     print "No directory found\n";
86}
87else {
88     print "Found $substr directory\n";
89}
90
91if ($substr ne 0) {
92   #Update the list of files
93   $ind = 0;
94   updateconfig(1);
95   foreach $file (@filelist) {
96      print "Updating file $file\n";
97      updatefile($file, $substr, 1);
98      $ind++;
99   }
100}
101else {
102   #Update the configuration to reflect libxml2 being absent
103   $ind = 0;
104   updateconfig(0);
105   foreach $file (@filelist) {
106      print "Updating file $file\n";
107      updatefile($file, $substr, 0);
108      $ind++;
109   }
110}
111
112# Function to find the libxml2 directory
113sub getdirectory {
114    my(@namelist);
115    my($file, $name);
116    my($cnt);
117    opendir(DIR,$path) || return (0);
118    @namelist = grep (/^libxml2-[0-9]+\.[0-9]+\.[0-9]+[a-z]*$/i, readdir(DIR));
119    closedir(DIR);
120
121    # Make sure we have something
122    if (scalar(@namelist) == 0) {
123        return (0);
124    }
125    # Now see if we have a directory or just a file.
126    # Make sure we are case insensitive
127    foreach $file (sort {uc($a) cmp uc($b)} @namelist) {
128        if (-d $path.$file) {
129           $name = $file;
130        }
131    }
132
133    # If we have one use it otherwise report the error
134    # Note that we are only interested in the last one
135    # since the sort should have taken care of getting
136    # the latest
137    if (defined($name)) {
138        return ($name);
139    }
140    else {
141        return (0);
142    }
143}
144
145# function to replace the libxml2 directory name with the latest one
146sub updatefile {
147        my($filename, $substr, $line);
148        my(@Lines);
149
150        $filename = $_[0];
151        $substr   = $_[1];
152        $havexml  = $_[2];
153
154        open (RFILE, $filename) || die "Can't open file $filename: $!";
155        @Lines = <RFILE>;
156        close (RFILE);
157
158        # Replace the string
159        foreach $line (@Lines) {
160           if ($havexml) {
161              $line =~ s/libxml2-[0-9]+\.[0-9]+\.[0-9]+[a-z]*/$substr/gi;
162	      if ($filename =~ /\.mak$/) {
163		 $line =~ s/^# (LIBXML=.*\/libxml2\.lib.*)$/\1/;
164	      } elsif ($filename =~ /\.dsp$/ ) {
165                 $line =~ s/^!MESSAGE (LIBXML=.*\/libxml2\.lib.*)$/\1/;
166                 $line =~ s/^!MESSAGE (# ADD LINK32 .*\/libxml2\.lib.*)$/\1/;
167	      }
168	      $line =~ s/^; (isc_socketmgr_renderxml)$/\1/;
169	      $line =~ s/^; (isc_mem_renderxml)$/\1/;
170	      $line =~ s/^; (isc_taskmgr_renderxml)$/\1/;
171           } else {
172	      if ($filename =~ /\.mak$/) {
173		 $line =~ s/^(LIBXML=.*\/libxml2.lib.*)$/# \1/i;
174	      } elsif ($filename =~ /\.dsp$/ ) {
175                 $line =~ s/^(# ADD LINK32 .*\/libxml2.lib.*)$/!MESSAGE \1/i;
176                 $line =~ s/^(LIBXML=.*\/libxml2.lib.*)$/!MESSAGE \1/i;
177	      }
178	      $line =~ s/^(isc_socketmgr_renderxml)$/; \1/;
179	      $line =~ s/^(isc_mem_renderxml)$/; \1/;
180	      $line =~ s/^(isc_taskmgr_renderxml)$/; \1/;
181           }
182        }
183
184        #update the file
185        open (RFILE, ">$filename") || die "Can't open file $filename: $!";
186        foreach $line (@Lines) {
187           print RFILE $line;
188        }
189        close(RFILE);
190}
191
192# update config.h to define or undefine HAVE_LIBXML2
193sub updateconfig {
194   my($havexml, $substr, $line);
195   my(@Lines);
196
197   $havexml = $_[0];
198
199   open (RFILE, "../config.h") || die "Can't open config.h";
200   @Lines = <RFILE>;
201   close (RFILE);
202
203   foreach $line (@Lines) {
204      if ($havexml) {
205         $line =~ s/^.*#undef HAVE_LIBXML2.*$/define HAVE_LIBXML2 1/;
206      } else {
207         $line =~ s/^#define HAVE_LIBXML2 .*$/\/\* #undef HAVE_LIBXML2 \*\//;
208      }
209   }
210
211   open (RFILE, ">../config.h") || die "Can't open config.h";
212   print "Updating file ../config.h\n";
213   foreach $line (@Lines) {
214      print RFILE $line;
215   }
216   close(RFILE);
217}
218