Table of Contents Previous Chapter

B Patches, Upgrades und Erweiterungen

Die folgenden Anhänge enthalten Bezugsadressen und Informationen über Upgrades und Erweiterungen, die zur Realisierung der Diplomarbeit nötig waren. Es wird auch beschrieben, welche Patches vorgenommen werden mußten, besonders an den SMF-Dateien für UnixWare.

B.1 Für NGM

Der Upgrade-Patch ist auf allen ftp-Sites erhältlich, die ein Mirror-Verzeichnis der NOVLIB besitzen, z. B.

ftp.novell.com
in: /pub/netwire/novlib/08/ngm207.exe

oder
ftp.uni-regensburg.de
in: /pub/freeware/software/novlib/novlib/08/ngm207.exe

B.2 Für UnixWare

Die in den folgenden Kapiteln aufgelisteten Patches sind zwingend notwendig, um den NGM-SMTP-Gateway von UnixWare zum Laufen zu bringen. Die Patches entstanden durch Re-Engineering der entsprechenden perl-Skripten von UnixWare, dieses benötigte auch den meisten Teil der für die Diplomarbeit benötigte Zeit.

Die Funktionen der einzelnen (gepatchten) Skripten sind in Kapitel 5.2.3 erklärt, die aufgelisteten Patches sind in Form von Context-Diffs jeweils durch folgenden Befehl erstellt worden:

$ diff -c originalScript.pl gepatchtesScript.pl

Die aufgelisteten Context-Diffs können auf die perl-Skripten angewendet werden, indem sie dem Programm "patch" eingegeben werden:

# patch -p1 <patch

Für den Fall, daß patch nicht zur Verfügung steht, soll hier kurz auf den Aufbau von Context-Diffs eingegangen werden, damit diese zur Not auch per Hand installiert werden können.

Die ersten beiden Zeilen geben die Namen der Originaldatei und der modifizierten Datei an, eventuelle Pfadangaben können mit patch (Option: -p) automatisch entfernt werden. Die Originaldatei wird dabei mit vorangestellten Sternen ("***"), die modifizierte Datei mit den Änderungen für die vorhandene Originaldatei mit vorangestellten Minuszeichen ("---") gekennzeichnet:

*** contextdifftest     Sun Jan 22 18:52:37 1995
--- contextdifftest.orig        Sun Jan 22 18:53:21 1995
Anschließend werden die Unterschiede zwischen den beiden Dateien aufgelistet, wobei die einzelnen Blöcke jeweils durch eine Reihe von Sternen ("***************") abgetrennt werden:

***************
In den jeweiligen Diff-Blöcken wird zuerst die ursprüngliche Form der Datei aufgelistet, dann die entsprechenden Zeilen, wie sie nach der Modifikation vorliegen sollten. Nachdem der Patch angewandt ist, sollte also die zu modifizierende Datei mit dem zweiten Block übereinstimmen:

*** 2,7 ****
  
  int main(void)
  {
!       printf("Hallo Welt\n");
        return 0;
  }
--- 2,7 ----
  
  int main(void)
  {
!       printf("Hello world\n");
        return 0;
  }
Am Anfang und Ende jedes Blockes werden jeweils drei Zeilen Kontext geliefert, die bei beiden Blöcken gleich sein sollten und das finden des entsprechenden Blocks in der zu modifizierenden Datei erleichtern sollen. Dabei sollen auch die Zeilennummern eine Hilfe sein, die jede Passage einleiten, ausschlaggebend ist jedoch der Kontext. Dadurch wird z. B. vermieden, daß die falschen Zeilen gepacht werden, wenn weiter oben Zeilen entfernt oder eingefügt wurden.

Die Veränderungen zwischen den beiden Dateien werden jeweils am Anfang einer Zeile mit einem der folgenden Zeichen markiert:

B.2.1 smf-poll

Der folgende Context-Diff stellt eine Korrektur der Fehler in /usr/lib/mail/surrcmd/smfpoll dar. Er kann mit folgender Prozedur angebracht werden:

# cd /usr/lib/mail/surrcmd
# patch -p1 <patch
*** Ngate/smf-poll              Sat Dec 10 03:06:45 1994
--- NGate+NGM/smf-poll          Sat Dec 10 03:06:46 1994
***************
*** 44,59 ****
  local(@filenames) = readdir(DIR);
  closedir(DIR);
  for (@filenames) {
      next if /\./;
      # inverse sense used here because system returns exit value 
where
      # 0 = OK
!     if (rename($_, "$_.$$")) {
!       system ("smf-in", "$_.$$");
!       if ($?) {
!           rename("$_.use", "$_.bad");
!       }
!       else {
!           unlink("$_.$$");
        }
      }
  }
--- 39,54 ----
  local(@filenames) = readdir(DIR);
  closedir(DIR);
  for (@filenames) {
+     ($tmp="$$")=~s/(...)$/$1/;
      next if /\./;
      # inverse sense used here because system returns exit value 
where
      # 0 = OK
!     if (rename($_, "$tmp")) {
!       system ("smf-in", "$tmp");
!       if ($? >> 8) {
!           rename("$tmp", "$_.bad");
!       } else {
!           unlink("$tmp");
        }
      }
  }

B.2.2 smf-in

Der folgende Context-Diff stellt eine Korrektur der Fehler in /usr/lib/mail/surrcmd/smf-in dar. Er kann mit folgender Prozedur angebracht werden:

# cd /usr/lib/mail/surrcmd
# patch -p1 <patch
*** Ngate/smf-in  Sat Dec 10 03:06:45 1994
--- UnixWare/mitNGM/smf-in  Sat Dec 10 03:06:44 1994
***************
*** 34,40 ****
    next;
    }
      # inetGW is the name of the smtp side of the gateway
!     if (/^INETGW="({^"]+)"/i) {$inetGW = $1; next;}
      }
  
  close(SMFDATA);
--- 36,44 ----
    next;
    }
      # inetGW is the name of the smtp side of the gateway
!     if (/^INETGW="([^"]+)"/i) {$inetGW = $1; next;}
      }
  
  close(SMFDATA);
***************
*** 79,101 ****
    $toFlag = $_[1];
    $_ = $_[0];
    study;
!   # user@$mhsGWS (comment) {SMTP:user@domain}
!   if (/$mhsGWS\s*($comment)?\s*{\s*(SMTP:)?(\S+).*}/i) {
      return "$4 $2";
    }
    # user.app@host [intended] (comment)
    if (/
^\s?($name8)\s*\.?\s*($name8)?\s*@\s*($name8)\s*(\[\s*($nam
e8)\s*\])?\s*($comment)?/io) {
      $name = $1;
!     return "Postmaster" if ($name =~ /-MaiSer-/i);
      # $app = $2 ? ".$2" : "";
      $host = $5 ? $5 : $3;
      $host =~ tr/a-z/A-Z/;
!     return "$name $6" if ($host =~ /$mhsGWS/io);
!     return "$name $6" if ($toFlag eq 1);
!     return "$name@$inetGW.$domain $6" if (($host eq $mhsWG) && 
($domain));
!     return "$name@$inetGW $6" if ($host eq $mhsWG);
!     return "$name@$host.$inetGW.$domain $6" if ($domain);
!     return "$name@$host.$inetGW $6";
    }
    # distribution list is legal alternate form
    if (/^\s?($name8)$/io) {
--- 83,142 ----
    $toFlag = $_[1];
    $_ = $_[0];
    study;
!   #HF# WENN toFlag==2: user@host (comment) {MHS:user@domain}
!   if ($toFlag eq 2){
!       if (/($comment)?\s*{\s*(MHS:)?(\S+).*}/i) {
!         return "$3 $1";
!       }
!   }
!   #HF# user@$mhsGWS (comment) {MHS:user@domain}
!   if (/$mhsGWS\s*($comment)?\s*{\s*(MHS:)?(\S+).*}/i) {
      return "$4 $2";
    }
    # user.app@host [intended] (comment)
    if (/
^\s?($name8)\s*\.?\s*($name8)?\s*@\s*($name8)\s*(\[\s*($nam
e8)\s*\])?\s*($comment)?/io) {
+     print OURLOG "mhs2inet: 1<$1> 2<$2> 3<$3> 4<$4> 5<$5> 6<$6> 
7<$7> 8<$8>\n";
      $name = $1;
!     if ($name =~ /-MaiSer-/i){
!         return                           "Postmaster";
!     }
      # $app = $2 ? ".$2" : "";
      $host = $5 ? $5 : $3;
      $host =~ tr/a-z/A-Z/;
!     if ($host =~ /$mhsGWS/io){
!   return                           "$name $6";
!     }
!     if ($toFlag eq 1){
!   return                           "$name $6";
!     }
!     if (($host eq $mhsWG) && ($domain)){
!   return                           "$name@$inetGW.$domain $6";
!     }
!     if ($host eq $mhsWG){
!   return                           "$name@$inetGW $6";
!     }
!     if ($domain){
!   return                           "$name@$host.$inetGW.$domain 
$6";
!     }
!     return                           "$name@$host.$inetGW $6";
    }
    # distribution list is legal alternate form
    if (/^\s?($name8)$/io) {
***************
*** 124,135 ****
  die "$0: received null header, stopped" if ($#header < $[);
  
  # reformat header into $header
! if($domain) {
!     $header = "Received: by $inetGW.$domain id MHS-id; ".`smf-
date '+%a, %d %b %y %H:%M:%S %Z'`;
! } else {
!     $header = "Received: by $inetGW id MHS-id; ".`smf-date '+%a, 
%d %b %y %H:%M:%S %Z'`;
! }
! 
  for (@header) {
    study;
    if (/^Sender: (.+)/i) {
--- 165,171 ----
  die "$0: received null header, stopped" if ($#header < $[);
  
  # reformat header into $header
! $header = "Received: by $inetGW.$domain id MHS-id; ".`smf-date 
'+%a, %d %b %y %H:%M:%S %Z'`;
  for (@header) {
    study;
    if (/^Sender: (.+)/i) {
***************
*** 168,178 ****
    if (/^Hop-count: (\d+)/i) { $hopCount = $1 + 1; next; }
    if (/^Error-report: (\d+)(.*)/i) { next if ($1 == 0 && $2 eq 
""); }
    if (/^(Date: )(.?.)-(...)-(..)(.+)/i) {
!     $header .= $1.`smf-date -n -s "$2 $3 $4$5" '+%a, %d %b %y 
%H:%M:%S %Z'`;
      next;
    }
    if (/^(Message-id: )(.+)/i) { $header .= 
"$1<$2@$inetGW.$domain>\n"; next; }
--- 207,219 ----
    if (/^Hop-count: (\d+)/i) { $hopCount = $1 + 1; next; }
    if (/^Error-report: (\d+)(.*)/i) { next if ($1 == 0 && $2 eq 
""); }
    if (/^(Date: )(.?.)-(...)-(..)(.+)/i) {
!     ($tmp=$5)=~s/GMT-1/GMT/g;  #HF#
!     $header .= $1.`smf-date -n -s "$2 $3 $4$tmp" '+%a, %d %b %y 
%H:%M:%S %Z'`;
      next;
    }
    if (/^(Message-id: )(.+)/i) { $header .= 
"$1<$2@$inetGW.$domain>\n"; next; }
***************
*** 180,186 ****
      chop;
      @to = split(/,/);
      foreach (@to) {
!       $_ = &mhs2inet($_, 1);
      }
      $tmp = "CC: " if ($tmp =~ /^Copies-To/i);
      $header .= $tmp.join(",\n\t", @to)."\n";
--- 221,228 ----
      chop;
      @to = split(/,/);
      foreach (@to) {
!       $_ = &mhs2inet($_, 2);  #HF# evtl. toFlags=2 nur bei To:
      }
      $tmp = "CC: " if ($tmp =~ /^Copies-To/i);
      $header .= $tmp.join(",\n\t", @to)."\n";

B.2.3 smf-out

Der folgende Context-Diff stellt eine Korrektur des Fehlers in /usr/lib/mail/surrcmd/suid/smf-out dar. Er kann mit folgender Prozedur angebracht werden:

# cd /usr/lib/mail/surrcmd/suid
# patch -p1 <patch
*** vorNGM/suid_smf-out  Sun Dec 25 19:59:00 1994
--- mitNGM/suid_smf-out  Sat Dec 10 03:06:40 1994
***************
*** 238,246 ****
      $tmp = $1;
      $cmd = ($tmp =~ s/\.Z$//) ? "uncompress" : "cat";
      $attachmentName[++$#attachmentName] = $tmp;
!     $fifo = "FIFO$$";
      $attach = "a$$$#attachmentName";
!     system("/sbin/mknod $fifo p");
      if (fork() == 0) {
        # child process
        #exec "$cmd <$fifo >$MV/mhs/mail/parcel/$attach"
--- 238,250 ----
      $tmp = $1;
      $cmd = ($tmp =~ s/\.Z$//) ? "uncompress" : "cat";
      $attachmentName[++$#attachmentName] = $tmp;
!     #HF# $fifo = "FIFO$$";
!     $fifo = "/tmp/FIFO$$";  # Netware kann keine Device-Nodes
      $attach = "a$$$#attachmentName";
!     $rc=system("/sbin/mknod $fifo p");
!     $rc/=256;
!     print STDERR "system returned $rc: $!\n"; #HF#
!     die if $rc;
      if (fork() == 0) {
        # child process
        #exec "$cmd <$fifo >$MV/mhs/mail/parcel/$attach"

B.2.4 getDomain

Der folgende Context-Diff stellt eine Korrektur des Fehlerverhaltens in /usr/lib/mail/surrcmd/getDomain dar. Er kann mit folgender Prozedur angebracht werden:

# cd /usr/lib/mail/surrcmd
# patch -p3 <patch
*** Setups/Ngate/getDomain    Sat Dec 10 03:06:45 1994
--- Setups/Ngate/vorNGM/getDomain  Sat Dec 10 03:06:40 1994
***************
*** 1,17 ****
! #!/usr/gnu/bin/perl --    # -*-Perl-*-
  $ENV{"PATH"} = "/usr/lib/mail/surrcmd:/usr/bin:/bin";
  
- if (open(RESOLV, "</etc/resolv.conf")) {
-     while (<RESOLV>) {
-   # GATEWAY is the name of our gateway as known to the MHS 
world
-   if (/^domain (.+)/i) { printf "%s", $1; exit 0;}
-   }
-     close(RESOLV);
-     }
  if (open(MAILCNFG, "</etc/mail/mailcnfg")) {
      while (<MAILCNFG>) {
    # GATEWAY is the name of our gateway as known to the MHS 
world
    if (/^DOMAIN=(.+)/i) { printf "%s", $1; exit 0;}
    }
      close(MAILCNFG);
      }
--- 1,21 ----
! #!/usr/bin/perl --    # -*-Perl-*-
! ##
! ### Fixed 940915 HF
! ##
! #
  $ENV{"PATH"} = "/usr/lib/mail/surrcmd:/usr/bin:/bin";
  
  if (open(MAILCNFG, "</etc/mail/mailcnfg")) {
      while (<MAILCNFG>) {
    # GATEWAY is the name of our gateway as known to the MHS 
world
    if (/^DOMAIN=(.+)/i) { printf "%s", $1; exit 0;}
    }
      close(MAILCNFG);
+     }
+ if (open(RESOLV, "</etc/resolv.conf")) {
+     while (<RESOLV>) {
+   # GATEWAY is the name of our gateway as known to the MHS 
world
+   if (/^domain (.+)/i) { printf "%s", $1; exit 0;}
+   }
+     close(RESOLV);
      }

B.3 Für MS-Mail

Der NetWare MHS Treiber für MS-Mail kann von jedem NOVLIB-ftp-Server geholt werden, z. B.

ftp.novell.com
in: /pub/netwire/novlib/08/msmail.exe

oder

ftp.uni-regensburg.de
in: /pub/freeware/software/novlib/novlib/08/msmail.exe

 
Table of Contents Next Chapter