- some more xen workarounds, we badly need a config option...
authorMichael Schröder <mls@suse.de>
Sun, 18 Feb 2007 19:09:17 +0000 (19:09 +0000)
committerMichael Schröder <mls@suse.de>
Sun, 18 Feb 2007 19:09:17 +0000 (19:09 +0000)
- add hostname to /etc/hosts
- fix debian extraction
- push ambiguous stuff back in expansion
- make rpmq more like BSRPMQ
- work around perl bug in fh glob passing
- add new querybinary function

Build.pm
build
extractbuild
init_buildsystem

index b51f809..2c7ee54 100644 (file)
--- a/Build.pm
+++ b/Build.pm
@@ -4,6 +4,7 @@ package Build;
 our $expand_dbg;
 
 use strict;
+use Digest::MD5;
 
 my $std_macros = q{
 %define ix86 i386 i486 i586 i686 athlon
@@ -315,14 +316,14 @@ sub expand {
 
   my %aconflicts;
   for my $p (keys %p) {
+    next unless exists $conflicts->{$p};
     $aconflicts{$_} = 1 for @{$conflicts->{$p} || []};
   }
 
+  my @pamb = ();
+  my $doamb = 0;
   while (@p) {
-    my $didsomething = 0;
     my @error = ();
-    my @uerror = ();
-    my @usolve = ();
     my @rerror = ();
     for my $p (splice @p) {
       for my $r (@{$requires->{$p} || [$p]}) {
@@ -341,18 +342,9 @@ sub expand {
          }
          next;
        }
-       if (@q > 1 && grep {$conflicts->{$_}} @q) {
-         # delay this one as some conflict later on might
-         # clear things up
-         push @p, $p unless @p && $p[-1] eq $p;
+       if (@q > 1 && !$doamb) {
+         push @pamb, $p unless @pamb && $pamb[-1] eq $p;
          print "undecided about $p:$r: @q\n" if $expand_dbg;
-         if ($r ne $p) {
-           push @uerror, "have choice for $r needed by $p: @q";
-         } else {
-           push @uerror, "have choice for $r: @q";
-         }
-         push @usolve, @q;
-         push @usolve, map {"$p:$_"} @q;
          next;
        }
        if (@q > 1) {
@@ -383,41 +375,29 @@ sub expand {
           } else {
            push @error, "have choice for $r: @q";
           }
-         push @p, $p unless @p && $p[-1] eq $p;
+         push @pamb, $p unless @pamb && $pamb[-1] eq $p;
          next;
        }
        push @p, $q[0];
        print "added $q[0] because of $p:$r\n" if $expand_dbg;
        $p{$q[0]} = 1;
        $aconflicts{$_} = 1 for @{$conflicts->{$q[0]} || []};
-       $didsomething = 1;
        @error = ();
+       $doamb = 0;
       }
     }
-    if (@rerror) {
-      return undef, @rerror;
-    }
-    if (!$didsomething && @error) {
-      return undef, @error;
-    }
-    if (!$didsomething && @usolve) {
-      # only conflicts left
-      print "looking at conflicts: @usolve\n" if $expand_dbg;
-      @usolve = grep {$prefer->{$_}} @usolve;
-      if (@usolve > 1) {
-        my %usolve = map {$_ => 1} @usolve;
-        @usolve  = (grep {$usolve{$_}} @{$config->{'prefer'}})[0];
-      }
-      if (@usolve) {
-       $usolve[0] =~ s/:.*//;
-        push @p, $usolve[0];
-        print "added $usolve[0]\n" if $expand_dbg;
-        $p{$usolve[0]} = 1;
-        $aconflicts{$_} = 1 for @{$conflicts->{$usolve[0]} || []};
-       next;
-      }
-      return undef, @uerror;
+    return undef, @rerror if @rerror;
+    next if @p;                # still work to do
+
+    # only ambig stuff left
+    if (@pamb && !$doamb) {
+      @p = @pamb;
+      @pamb = ();
+      $doamb = 1;
+      print "now doing undecided dependencies\n" if $expand_dbg;
+      next;
     }
+    return undef, @error if @error;
   }
   return 1, (sort keys %p);
 }
@@ -883,76 +863,136 @@ sub read_dsc {
 
 ###########################################################################
 
+my %rpmstag = (
+  "SIGTAG_SIZE"    => 1000,     # /*!< internal Header+Payload size in bytes. */
+  "SIGTAG_MD5"     => 1004,     # /*!< internal MD5 signature. */
+  "NAME"           => 1000,
+  "VERSION"        => 1001,
+  "RELEASE"        => 1002,
+  "EPOCH"          => 1003,
+  "ARCH"           => 1022,
+  "OLDFILENAMES"   => 1027,
+  "SOURCERPM"      => 1044,
+  "PROVIDENAME"    => 1047,
+  "REQUIREFLAGS"   => 1048,
+  "REQUIRENAME"    => 1049,
+  "REQUIREVERSION" => 1050,
+  "NOSOURCE"       => 1051,
+  "NOPATCH"        => 1052,
+  "PROVIDEFLAGS"   => 1112,
+  "PROVIDEVERSION" => 1113,
+  "DIRINDEXES"     => 1116,
+  "BASENAMES"      => 1117,
+  "DIRNAMES"       => 1118,
+);
+
 sub rpmq {
-  my $rpm = shift;
-  my @stags = @_;
-  my %stags = map {0+$_ => $_} @stags; 
+  my ($rpm, @stags) = @_;
+
+  my @sigtags = grep {/^SIGTAG_/} @stags;
+  @stags = grep {!/^SIGTAG_/} @stags;
+  my $dosigs = @sigtags && !@stags;
+  @stags = @sigtags if $dosigs;
+
+  my $need_filenames = grep { $_ eq 'FILENAMES' } @stags;
+  push @stags, 'BASENAMES', 'DIRNAMES', 'DIRINDEXES', 'OLDFILENAMES' if $need_filenames;
+  @stags = grep { $_ ne 'FILENAMES' } @stags if $need_filenames;
+
+  my %stags = map {0 + ($rpmstag{$_} || $_) => $_} @stags; 
 
   my ($magic, $sigtype, $headmagic, $cnt, $cntdata, $lead, $head, $index, $data, $tag, $type, $offset, $count);
 
   local *RPM;
-  if (ref($rpm) eq 'GLOB') {
-    *RPM = $rpm;
-  } elsif (!open(RPM, '<', $rpm)) {
-    warn("$rpm: $!\n");
-    return ();
-  }
-  if (read(RPM, $lead, 96) != 96) {
-    warn("Bad rpm $rpm\n");
-    close RPM;
-    return ();
-  }
-  ($magic, $sigtype) = unpack('N@78n', $lead);
-  if ($magic != 0xedabeedb || $sigtype != 5) {
-    warn("Bad rpm $rpm\n");
-    close RPM;
-    return ();
-  }
-  if (read(RPM, $head, 16) != 16) {
-    warn("Bad rpm $rpm\n");
-    close RPM;
-    return ();
-  }
-  ($headmagic, $cnt, $cntdata) = unpack('N@8NN', $head);
-  if ($headmagic != 0x8eade801) {
-    warn("Bad rpm $rpm\n");
-    close RPM;
-    return ();
-  }
-  if (read(RPM, $index, $cnt * 16) != $cnt * 16) {
-    warn("Bad rpm $rpm\n");
-    close RPM;
-    return ();
-  }
-  $cntdata = ($cntdata + 7) & ~7;
-  if (read(RPM, $data, $cntdata) != $cntdata) {
-    warn("Bad rpm $rpm\n");
-    close RPM;
-    return ();
-  }
-  if (read(RPM, $head, 16) != 16) {
-    warn("Bad rpm $rpm\n");
-    close RPM;
-    return ();
+  if (ref($rpm) eq 'ARRAY') {
+    ($headmagic, $cnt, $cntdata) = unpack('N@8NN', $rpm->[0]);
+    if ($headmagic != 0x8eade801) {
+      warn("Bad rpm\n");
+      return ();
+    }
+    if (length($rpm->[0]) < 16 + $cnt * 16 + $cntdata) {
+      warn("Bad rpm\n");
+      return ();
+    }
+    $index = substr($rpm->[0], 16, $cnt * 16);
+    $data = substr($rpm->[0], 16 + $cnt * 16, $cntdata);
+  } else {
+    if (ref($rpm) eq 'GLOB') {
+      *RPM = *$rpm;
+    } elsif (!open(RPM, '<', $rpm)) {
+      warn("$rpm: $!\n");
+      return ();
+    }
+    if (read(RPM, $lead, 96) != 96) {
+      warn("Bad rpm $rpm\n");
+      close RPM unless ref($rpm);
+      return ();
+    }
+    ($magic, $sigtype) = unpack('N@78n', $lead);
+    if ($magic != 0xedabeedb || $sigtype != 5) {
+      warn("Bad rpm $rpm\n");
+      close RPM unless ref($rpm);
+      return ();
+    }
+    if (read(RPM, $head, 16) != 16) {
+      warn("Bad rpm $rpm\n");
+      close RPM unless ref($rpm);
+      return ();
+    }
+    ($headmagic, $cnt, $cntdata) = unpack('N@8NN', $head);
+    if ($headmagic != 0x8eade801) {
+      warn("Bad rpm $rpm\n");
+      close RPM unless ref($rpm);
+      return ();
+    }
+    if (read(RPM, $index, $cnt * 16) != $cnt * 16) {
+      warn("Bad rpm $rpm\n");
+      close RPM unless ref($rpm);
+      return ();
+    }
+    $cntdata = ($cntdata + 7) & ~7;
+    if (read(RPM, $data, $cntdata) != $cntdata) {
+      warn("Bad rpm $rpm\n");
+      close RPM unless ref($rpm);
+      return ();
+    }
   }
-  ($headmagic, $cnt, $cntdata) = unpack('N@8NN', $head);
-  if ($headmagic != 0x8eade801) {
-    warn("Bad rpm $rpm\n");
-    close RPM;
-    return ();
+
+  my %res = ();
+  if (@sigtags && !$dosigs) {
+    %res = &rpmq(["$head$index$data"], @sigtags);
   }
-  if (read(RPM, $index, $cnt * 16) != $cnt * 16) {
-    warn("Bad rpm $rpm\n");
-    close RPM;
-    return ();
+  if (ref($rpm) eq 'ARRAY' && !$dosigs && @stags && @$rpm > 1) {
+    my %res2 = &rpmq([ $rpm->[1] ], @stags);
+    %res = (%res, %res2);
+    return %res;
   }
-  if (read(RPM, $data, $cntdata) != $cntdata) {
-    warn("Bad rpm $rpm\n");
-    close RPM;
-    return ();
+  if (ref($rpm) ne 'ARRAY' && !$dosigs && @stags) {
+    if (read(RPM, $head, 16) != 16) {
+      warn("Bad rpm $rpm\n");
+      close RPM unless ref($rpm);
+      return ();
+    }
+    ($headmagic, $cnt, $cntdata) = unpack('N@8NN', $head);
+    if ($headmagic != 0x8eade801) {
+      warn("Bad rpm $rpm\n");
+      close RPM unless ref($rpm);
+      return ();
+    }
+    if (read(RPM, $index, $cnt * 16) != $cnt * 16) {
+      warn("Bad rpm $rpm\n");
+      close RPM unless ref($rpm);
+      return ();
+    }
+    if (read(RPM, $data, $cntdata) != $cntdata) {
+      warn("Bad rpm $rpm\n");
+      close RPM unless ref($rpm);
+      return ();
+    }
   }
-  close RPM;
-  my %res = ();
+  close RPM unless ref($rpm);
+
+  return %res unless @stags;
+
   while($cnt-- > 0) {
     ($tag, $type, $offset, $count, $index) = unpack('N4a*', $index);
     $tag = 0+$tag;
@@ -989,6 +1029,16 @@ sub rpmq {
       }
     }
   }
+
+  if ($need_filenames) {
+    if ($res{'OLDFILENAMES'}) {
+      $res{'FILENAMES'} = [ @{$res{'OLDFILENAMES'}} ];
+    } else {
+      my $i = 0;
+      $res{'FILENAMES'} = [ map {"$res{'DIRNAMES'}->[$res{'DIRINDEXES'}->[$i++]]$_"} @{$res{'BASENAMES'}} ];
+    }
+  }
+
   return %res;
 }
 
@@ -1108,22 +1158,22 @@ sub ungzip {
 sub debq {
   my ($fn) = @_;
 
-  local *F;
+  local *DEBF;
   if (ref($fn) eq 'GLOB') {
-      *F = $fn;
-  } elsif (!open(F, '<', $fn)) {
+      *DEBF = *$fn;
+  } elsif (!open(DEBF, '<', $fn)) {
     warn("$fn: $!\n");
     return ();
   }
   my $data = '';
-  sysread(F, $data, 4096);
+  sysread(DEBF, $data, 4096);
   if (length($data) < 8+60) {
     warn("$fn: not a debian package\n");
-    close F unless ref $fn;
+    close DEBF unless ref $fn;
     return ();
   }
   if (substr($data, 0, 8+16) ne "!<arch>\ndebian-binary   ") {
-    close F unless ref $fn;
+    close DEBF unless ref $fn;
     return ();
   }
   my $len = substr($data, 8+48, 10);
@@ -1131,29 +1181,30 @@ sub debq {
   if (length($data) < 8+60+$len+60) {
     my $r = 8+60+$len+60 - length($data);
     $r -= length($data);
-    if ((sysread(F, $data, $r < 4096 ? 4096 : $r, length($data)) || 0) < $r) {
+    if ((sysread(DEBF, $data, $r < 4096 ? 4096 : $r, length($data)) || 0) < $r) {
       warn("$fn: unexpected EOF\n");
-      close F unless ref $fn;
+      close DEBF unless ref $fn;
       return ();
     }
   }
   $data = substr($data, 8 + 60 + $len);
   if (substr($data, 0, 16) ne 'control.tar.gz  ') {
     warn("$fn: control.tar.gz is not second ar entry\n");
-    close F unless ref $fn;
+    close DEBF unless ref $fn;
     return ();
   }
   $len = substr($data, 48, 10);
   if (length($data) < 60+$len) {
     my $r = 60+$len - length($data);
-    if ((sysread(F, $data, $r, length($data)) || 0) < $r) {
+    if ((sysread(DEBF, $data, $r, length($data)) || 0) < $r) {
       warn("$fn: unexpected EOF\n");
-      close F unless ref $fn;
+      close DEBF unless ref $fn;
       return ();
     }
   }
-  close F;
+  close DEBF unless ref($fn);
   $data = substr($data, 60, $len);
+  my $controlmd5 = Digest::MD5::md5_hex($data);        # our header signature
   if ($have_zlib) {
     $data = Compress::Zlib::memGunzip($data);
   } else {
@@ -1194,7 +1245,76 @@ sub debq {
     $data =~ s/\s+$//s;
     $res{$tag} = $data;
   }
+  $res{'CONTROL_MD5'} = $controlmd5;
   return %res;
 }
 
+###########################################################################
+
+sub querybinary {
+  my ($binname, $withevra) = @_;
+  my $handle = $binname;
+  if (ref($binname) eq 'ARRAY') {
+    $handle = $binname->[1];
+    $binname = $binname->[0];
+  }
+  if ($binname =~ /\.rpm$/) {
+    my %res = rpmq($handle, qw{NAME SOURCERPM NOSOURCE NOPATCH SIGTAG_MD5 PROVIDENAME PROVIDEFLAGS PROVIDEVERSION REQUIRENAME REQUIREFLAGS REQUIREVERSION}, ($withevra ? qw{EPOCH VERSION RELEASE ARCH}: ()));
+    return undef unless %res;
+    my $src = $res{'SOURCERPM'}->[0];
+    $src = '' unless defined $src;
+    $src =~ s/-[^-]*-[^-]*\.[^\.]*\.rpm//;
+    my $data = {
+      name => $res{'NAME'}->[0],
+      hdrmd5 => unpack('H32', $res{'SIGTAG_MD5'}->[0]),
+      provides => [ grep {!/^rpmlib\(/ && !/^\//} @{$res{'PROVIDENAME'} || []} ],
+      requires => [ grep {!/^rpmlib\(/ && !/^\//} @{$res{'REQUIRENAME'} || []} ],
+    };
+    $data->{'source'} = $src if $src ne '';
+    if ($withevra) {
+      my $arch = $res{'ARCH'}->[0];
+      $arch = $res{'NOSOURCE'} || $res{'NOPATCH'} ? 'nosrc' : 'src' unless $src ne '';
+      $data->{'version'} = $res{'VERSION'}->[0];
+      $data->{'release'} = $res{'RELEASE'}->[0];
+      $data->{'arch'} = $arch;
+      $data->{'epoch'} = $res{'EPOCH'}->[0] if exists $res{'EPOCH'};
+    }
+    return $data;
+  } elsif ($binname =~ /\.deb$/) {
+    my %res = debq($handle);
+    return undef unless %res;
+    my $name = $res{'PACKAGE'};
+    my $src = $name;
+    $src = $res{'SOURCE'} if $res{'SOURCE'};
+    my @provides = split(',\s*', $res{'PROVIDES'} || '');
+    s/\s.*// for @provides;    #for now
+    push @provides, $name unless grep {$_ eq $name} @provides;
+    my @depends = split(',\s*', $res{'DEPENDS'} || '');
+    my @predepends = split(',\s*', $res{'PRE-DEPENDS'} || '');
+    push @depends, @predepends;
+    s/\s.*// for @provides;    #for now
+    s/\|\s*/\|/g for @depends; #for now
+    s/\s[^\|]*//g for @depends;        #for now
+    my $data = {
+      name => $name,
+      hdrmd5 => $res{'CONTROL_MD5'},
+      provides => \@provides,
+      requires => \@depends,
+    };
+    $data->{'source'} = $src if $src ne '';
+    if ($withevra) {
+      if ($res{'VERSION'} =~ /^(.*)-(.*?)$/) {
+        $data->{'version'} = $1;
+        $data->{'release'} = $2;
+      } else {
+        $data->{'version'} = $res{'VERSION'};
+      }
+      $data->{'arch'} = $res{'ARCHITECTURE'};
+    }
+    return $data;
+  } else {
+    return undef;
+  }
+}
+
 1;
diff --git a/build b/build
index 025468e..f2ec48d 100755 (executable)
--- a/build
+++ b/build
@@ -116,7 +116,7 @@ cleanup_and_exit () {
     test -z "$1" && set 0
     if test -n "$RUNNING_IN_XEN" ; then
        cd /
-       if test -n "$XENSWAP" ; then
+       if test -n "$XENSWAP" -a -e "$XENSWAP" ; then
            swapoff "$XENSWAP"
            echo -n "BUILDSTATUS$1" >"$XENSWAP"
        fi
@@ -189,7 +189,7 @@ if test "$0" = "/.build/build" ; then
        export PERSONALITY_SET=true
        echo "switching personality to $PERSONALITY..."
        # this is 32bit perl/glibc, thus the 32bit syscall number
-       exec perl -e 'syscall(136, '$PERSONALITY') == -1 && warn("personality: $!\n");exec "/.build/build" || die("/.build/build: $!")'
+       exec perl -e 'syscall(136, '$PERSONALITY') == -1 && warn("personality: $!\n");exec "/.build/build" || die("/.build/build: $!\n")'
     fi
     PATH=$BUILD_DIR:$PATH
     RUNNING_IN_XEN=true
@@ -203,12 +203,13 @@ if test "$0" = "/.build/build" ; then
            sleep 1
        done
        test $i = 1 || echo
-       cp -a "$XENSWAP" /.build/swapdev
     fi
     umount -l /dev 2>/dev/null
     if test -n "$XENSWAP" ; then
        rm -f "$XENSWAP"
-       cp -a /.build/swapdev "$XENSWAP"
+       umask 027
+       mknod "$XENSWAP" b 3 2
+       umask 022
        swapon -v "$XENSWAP" || exit 1
     fi
     set "/.build-srcdir/$SPECFILE"
@@ -664,6 +665,9 @@ for SPECFILE in $SPECFILES ; do
         fi
     fi
 
+    mount -n -tproc none $BUILD_ROOT/proc 2> /dev/null
+    mount -n -tdevpts none $BUILD_ROOT/dev/pts 2> /dev/null
+
     #
     # now clean up RPM building directories
     #
@@ -720,8 +724,6 @@ for SPECFILE in $SPECFILES ; do
     fi
     echo -----------------------------------------------------------------
     echo -----------------------------------------------------------------
-    mount -n -tproc none $BUILD_ROOT/proc 2> /dev/null
-    mount -n -tdevpts none $BUILD_ROOT/dev/pts 2> /dev/null
     test -n "$RUNNING_IN_XEN" && ifconfig lo 127.0.0.1 up
     test -n "$RUNNING_IN_XEN" -a -n "$MYHOSTNAME" && hostname "$MYHOSTNAME"
 
index 68b4927..71160e2 100755 (executable)
@@ -76,7 +76,7 @@ my $specfile = $vars{'SPECFILE'};
 die("no specfile/dscfile\n") unless $specfile;
 my $topdir = '/usr/src/packages';
 my $psuf = 'deb';
-my @dirs = ($topdir);
+my @dirs = ("$topdir/DEBS");
 if ($specfile =~ /\.spec$/) {
   $topdir = `rpm --eval '%_topdir'`;
   chomp $topdir;
index add042e..2a19ec7 100755 (executable)
@@ -337,10 +337,13 @@ else
        # add util-linux/perl/binutils/mount to preinstall list
        test "$PACKAGES_TO_PREINSTALL" = "${PACKAGES_TO_PREINSTALL/util-linux}" && PACKAGES_TO_PREINSTALL="$PACKAGES_TO_PREINSTALL util-linux"
        test "$PACKAGES_TO_PREINSTALL" = "${PACKAGES_TO_PREINSTALL/perl}" && PACKAGES_TO_PREINSTALL="$PACKAGES_TO_PREINSTALL perl"
+       test "$PACKAGES_TO_PREINSTALL" = "${PACKAGES_TO_PREINSTALL/perl-base}" -a "$PACKAGES_TO_INSTALL" != "${PACKAGES_TO_INSTALL/ perl-base }" && PACKAGES_TO_PREINSTALL="$PACKAGES_TO_PREINSTALL perl-base"
        test "$PACKAGES_TO_PREINSTALL" = "${PACKAGES_TO_PREINSTALL/libvolume_id}" -a "$PACKAGES_TO_INSTALL" != "${PACKAGES_TO_INSTALL/libvolume_id}" && PACKAGES_TO_PREINSTALL="$PACKAGES_TO_PREINSTALL libvolume_id"
        test "$PACKAGES_TO_PREINSTALL" = "${PACKAGES_TO_PREINSTALL/device-mapper}" -a "$PACKAGES_TO_INSTALL" != "${PACKAGES_TO_INSTALL/device-mapper}" && PACKAGES_TO_PREINSTALL="$PACKAGES_TO_PREINSTALL device-mapper"
        test $PSUF = deb -a "$PACKAGES_TO_PREINSTALL" = "${PACKAGES_TO_PREINSTALL/binutils}" && PACKAGES_TO_PREINSTALL="$PACKAGES_TO_PREINSTALL binutils"
-       test $PSUF = deb -a "$PACKAGES_TO_PREINSTALL" = "${PACKAGES_TO_PREINSTALL/mount}" && PACKAGES_TO_PREINSTALL="$PACKAGES_TO_PREINSTALL mount"
+       test $PSUF = deb -a "$PACKAGES_TO_PREINSTALL" = "${PACKAGES_TO_PREINSTALL/libblkid1}" && PACKAGES_TO_PREINSTALL="$PACKAGES_TO_PREINSTALL libblkid1"
+       test $PSUF = deb -a "$PACKAGES_TO_PREINSTALL" = "${PACKAGES_TO_PREINSTALL/libuuid1}" && PACKAGES_TO_PREINSTALL="$PACKAGES_TO_PREINSTALL libuuid1"
+       test $PSUF = deb -a "$PACKAGES_TO_PREINSTALL" = "${PACKAGES_TO_PREINSTALL/libdevmapper1.02}" && PACKAGES_TO_PREINSTALL="$PACKAGES_TO_PREINSTALL libdevmapper1.02"
        test "$PACKAGES_TO_PREINSTALL" = "${PACKAGES_TO_PREINSTALL/mount}" -a "$PACKAGES_TO_INSTALL" != "${PACKAGES_TO_INSTALL/ mount }" && PACKAGES_TO_PREINSTALL="$PACKAGES_TO_PREINSTALL mount"
     fi
 fi
@@ -647,6 +650,7 @@ if test -e $BUILD_ROOT/usr/share/zoneinfo/UTC ; then
 fi
 
 HOST=`hostname`
+test -e $BUILD_ROOT/etc/hosts || echo "127.0.0.1 localhost" > $BUILD_ROOT/etc/hosts
 if ! grep -F "127.0.0.1 $HOST" $BUILD_ROOT/etc/hosts ; then
     # this makes a reverse lookup on 127.0.0.1 return the host name,
     # which is bad, but 127.0.0.2 does not work on all unix systems