nmh-workers
[Top] [All Lists]

patches for mh6.7.2 on aix 3.2

1992-10-12 10:06:39
john,

  ed anselmo updated the old patches to 6.7.2 and i fixed the
  lexedit.sed script for dtimep.c: aix 3.2 lex had added some more
  junk.

  there is these days probably more stuff that the sed script is
  removing than the original authors had intended.  however, if i
  don't sed dtimep.c, it has some syntax errors; so the sed script is
  still necessary.

  when you patch these into the mainline code, i would say that you
  don't need to ifdef the following:

        + #ifdef _AIX
        +         case '\0':
        + #else
                  case NULL:
        ! #endif

  simply replace incorrect NULL with the '\0'.  also change all
  occurrances of

        #endif something

  to

        #endif /* something */

  would you be kind enough to install these patches in
  ftp.ics.edu:mh/updates/aix.mh-6.7.2?  (if that's not where you put
  it, please let me know where so i can update the faq correctly.)

                                                --bw


                  Patches to MH 6.7.2 for IBM AIX 3.2
                             Bill Wohler


1. History: These patches were originally posted by Steven Lebowitz
   <lebowits(_at_)nova(_dot_)bet(_dot_)ibm(_dot_)com> and I made some 
modifications for
   6.7.1.  Ed Anselmo <anselmo(_at_)nic(_dot_)near(_dot_)net> and I modified 
them to
   work on MH 6.7.2 on AIX 3.2.

   AIX support should appear in MH 6.7.3, which is planned to be
   released by the end of '92.

2. To apply this patch:

   cd to the top of the source tree and do:

        patch -p1 -s < aix.mh-6.7.2

   Patch will work silently unless an error occurs.  You will likely
   get the following warning messages, which can be ignored:

        mkdir: cannot create config.
        config: File exists
        mkdir: cannot create sbr.
        sbr: File exists

   If you want to watch patch do its thing, leave out the "-s"
   argument to patch.

   Finally, to rebuild after applying this patch, do:

        % cd conf
        % make
        % ./mhconfig MH
        % cd ..
        % make >& Makelog
        % make inst-all

3. When installing new MH patches, back out these patches first (patch
   -p1 -R -s < aix.mh-6.7.2).

4. my MH file:

bin             /usr/local/bin/mh
ldoptions       -s
manuals         local
mts             sendmail/smtp
options         ATHENA BIND DBM ISI MHRC
options         TYPESIG='void' SYS5 SYS5DIR SOCKETS
options         MHE
curses          -lcurses
sprintf         int

5. fix permissions.

#! /bin/sh
# Run this script as root after installation on AIX systems.
# Otherwise slocal and inc will *not* work.
chgrp mail /usr/local/lib/mh/slocal /usr/local/bin/mh/inc
chmod g+s /usr/local/lib/mh/slocal /usr/local/bin/mh/inc

6. Please contact Bill Wohler <wohler(_at_)sap-ag(_dot_)de> if you have any
   questions regarding these patches.

*** mh-6.7/conf/mhconfig.c      Mon Jan 27 12:34:35 1992
--- mh-6.7.new/conf/mhconfig.c  Thu Aug  6 15:18:19 1992
***************
*** 570,576 ****
        }
        break;
      }
!     if ((config = *vec++) == NULL || *vec != NULL)
        adios (NULLCP, "usage: %s file", myname);

      if ((fp = fopen (config, "r")) == NULL)
--- 570,576 ----
        }
        break;
      }
!     if ((config = *vec++) == NULL && *vec != NULL)
        adios (NULLCP, "usage: %s file", myname);

      if ((fp = fopen (config, "r")) == NULL)
*** mh-6.7/conf/config/mts.c    Thu Feb 14 18:18:22 1991
--- mh-6.7.new/conf/config/mts.c        Fri Aug  7 11:02:42 1992
***************
*** 43,49 ****
--- 43,51 ----
  #define       rindex  strrchr
  #endif        SYS5

+ #ifndef _AIX
  char   *index (), *malloc (), *mktemp (), *rindex (), *strcpy ();
+ #endif

  struct passwd  *getpwuid ();

***************
*** 292,298 ****
--- 294,304 ----
                grot ('t', '\t');
  #undef        grot

+ #ifdef _AIX
+               case '\0': s--;
+ #else
                case NULL: s--;
+ #endif
                case QUOTE:
                    *bp = QUOTE;
                    break;
*** mh-6.7/conf/config/mtstailor        Thu Jun 15 16:10:12 1989
--- mh-6.7.new/conf/config/mtstailor    Mon Jan 28 14:45:47 1991
***************
*** 1,4 ****
! mmdfldir:     @(MHDROPATH)
! mmdflfil:     @(MHDROPFIL)
  hostable:     @(MHETCPATH)/hosts
! servers:      localhost \01localnet
--- 1,12 ----
! mmdfldir:     /usr/mail
! mmdflfil:
! uucpldir:     /usr/mail
! uucplfil:
! mmdelim1:     \001\001\001\001\n
! mmdelim2:     \001\001\001\001\n
! mmailid:      0
! umincproc:
! lockldir:
!
  hostable:     @(MHETCPATH)/hosts
! sendmail:     /usr/local/lib/mail/local_sendmail
*** mh-6.7/config/version.sh    Thu Jan 30 17:20:46 1992
--- mh-6.7.new/config/version.sh        Fri Aug  7 11:09:50 1992
***************
*** 38,63 ****

  rm -f version.c

! cat version ${Patch} |\
! awk -F. '
! BEGIN { split ("'"${1}"'", ver, ".");\
!         major = ver[1]; minor = ver[2]; patch = ver[3]} \
! NR == 1 { local = $(NF) } ;\
! NR == 2 { patch = $(NF) } ;\
! END   { local++;\
!         if (patch > 0) {\
!         printf "char *version = \"@(#)MH %s.%s.%s #%d[UCI] ", \
!               major, minor, patch, local > "version.c"; \
!         printf ".ds MH %s.%s.%s #%d[UCI]\n", \
!               major, minor, patch, local > "../doc/version.rf"; \
!         printf "MH %s.%s.%s #%d[UCI]\n", major, minor, patch, local ;\
!       } else {\
!         printf "char *version = \"@(#)MH %s.%s #%d[UCI] ", \
!               major, minor, local > "version.c"; \
!         printf ".ds MH %s.%s #%d[UCI]\n", \
!               major, minor, local > "../doc/version.rf"; \
!         printf "MH %s.%s #%d[UCI]\n", major, minor, local ;\
!       }\
!         printf "%s.%s.%s.%d\n", major, minor, patch, local > "_version";\
! }' && mv _version version
  echo '('$LOCAL') of '`date`'";' >> version.c
--- 38,42 ----

  rm -f version.c

! (echo $1; cat version ${Patch})|awk -F. -f version.awk && mv _version version
  echo '('$LOCAL') of '`date`'";' >> version.c
*** /dev/null   Sat Sep 12 15:01:35 1992
--- mh-6.7.new/config/version.awk       Sat Sep 12 16:50:50 1992
***************
*** 0 ****
--- 1,20 ----
+ NR == 1       { major = $1; minor = $2; patch = $3 }
+ NR == 2 { local = $(NF) }
+ NR == 3 { patch = $(NF) }
+ END   {
+       local++;
+       if (patch > 0) {
+               printf "char *version = \"MH %s.%s.%s #%d[UCI] ", \
+                      major, minor, patch, local > "version.c";
+               printf  ".ds MH %s.%s.%s #%d[UCI]\n", \
+                      major, minor, patch, local > "../doc/version.rf";
+               printf "MH %s.%s.%s #%d[UCI]\n", major, minor, patch, local;
+       } else {
+               printf "char *version = \"MH %s.%s #%d[UCI] ", \
+                      major, minor, local > "version.c";
+               printf ".ds MH %s.%s #%d[UCI]\n", \
+                      major, minor, local > "../doc/version.rf";
+               printf "MH %s.%s #%d[UCI]\n", major, minor, local;
+       }
+       printf "%s.%s.%s.%d\n", major, minor, patch, local > "_version";
+ }
*** mh-6.7/h/local.h    Thu Oct 29 17:56:18 1987
--- mh-6.7.new/h/local.h        Thu Aug  6 15:35:06 1992
***************
*** 6,19 ****
  #include <sys/param.h>
  #endif        BSD42

! #ifndef       BSD42
  #ifndef NDIR
  #include <dir.h>
  #else NDIR
  #include <ndir.h>
  #endif  NDIR
! #else BSD42
  #include <sys/dir.h>
! #endif        BSD42

  #include <sys/stat.h>
--- 6,23 ----
  #include <sys/param.h>
  #endif        BSD42

! #ifndef _AUX_SOURCE
! #if !defined(BSD42) && !defined(_AIX)
  #ifndef NDIR
  #include <dir.h>
  #else NDIR
  #include <ndir.h>
  #endif  NDIR
! #else BSD42 || _AIX
  #include <sys/dir.h>
! #endif        BSD42 || _AIX
! #else _AUX_SOURCE
! #include <sys/dir.h>
! #endif        _AUX_SOURCE

  #include <sys/stat.h>
*** mh-6.7/h/mh.h       Thu Jan 23 19:03:59 1992
--- mh-6.7.new/h/mh.h   Thu Aug  6 15:36:26 1992
***************
*** 344,350 ****

  /* miscellaneous */

! #if !defined(BSD42) && !defined(hpux) && !defined(ncr)
  #define       rename(f1,f2)   (link (f1, f2) != NOTOK ? unlink (f1) : NOTOK)
  #endif        not BSD42

--- 344,350 ----

  /* miscellaneous */

! #if !defined(BSD42) && !defined(hpux) && !defined(ncr) && !defined(_AIX)
  #define       rename(f1,f2)   (link (f1, f2) != NOTOK ? unlink (f1) : NOTOK)
  #endif        not BSD42

*** mh-6.7/h/strings.h  Thu Jan 23 18:16:49 1992
--- mh-6.7.new/h/strings.h      Fri Aug  7 10:06:28 1992
***************
*** 5,17 ****
--- 5,20 ----
  #define       _STRINGS

  #ifdef        SYS5
+ #ifndef _AIX
  #define       index   strchr
  #define       rindex  strrchr
+ #endif !_AIX
  #endif        SYS5

  char   *index ();
  char   *mktemp ();
  char   *rindex ();
+ #ifndef _AIX
  #ifndef       SPRINTFTYPE
  #ifndef       ncr             /* NCR compiler complains about re-declaration 
*/
  char   *sprintf ();           /* I guess this is the new standard */
***************
*** 29,34 ****
--- 32,38 ----

  char   *getenv ();
  char   *calloc (), *malloc (), *realloc ();
+ #endif !_AIX

  #ifdef        SYS5
  #include <memory.h>
*** /dev/null   Sat Sep 12 15:01:35 1992
--- mh-6.7.new/sbr/version.awk  Sat Sep 12 16:50:51 1992
***************
*** 0 ****
--- 1,7 ----
+ NR == 1       { major = $1; minor = $2; patch = $3 }
+ NR == 2 { compile = $(NF) }
+ NR == 3 { if (major != $1) {major = $1; minor = 0};
+         if (minor != $2) {minor = $2; compile = 0}}
+ END    { compile++;
+          printf "version: libmh %d.%d.%d\n", major, minor, compile;
+          printf "%d.%d.%d\n", major, minor, compile > "_version";}
*** mh-6.7/sbr/formatsbr.c      Fri Jan 24 13:09:34 1992
--- mh-6.7.new/sbr/formatsbr.c  Fri Aug  7 10:09:44 1992
***************
*** 96,103 ****
                case '\n':
                    break;

                case NULL:
!                   cp--;       /* fall */
                default:
                    *dp++ = *cp;
                    break;
--- 96,107 ----
                case '\n':
                    break;

+ #ifdef _AIX
+               case '\0':
+ #else
                case NULL:
! #endif
!               cp--;   /* fall */
                default:
                    *dp++ = *cp;
                    break;
*** mh-6.7/sbr/makedir.c        Thu Jan 23 18:12:50 1992
--- mh-6.7.new/sbr/makedir.c    Thu Aug  6 16:17:02 1992
***************
*** 22,27 ****
--- 22,32 ----
  #ifdef        SYS5DIR
  #include <sys/types.h>
  #include <sys/stat.h>
+ #ifdef _AIX
+ #include <errno.h>
+ #include <sys/param.h>
+ #include <sys/access.h>
+ #endif
  #endif        SYS5DIR

  extern int  errno;
*** mh-6.7/sbr/path.c   Tue Feb  6 16:09:03 1990
--- mh-6.7.new/sbr/path.c       Fri Aug  7 11:35:48 1992
***************
*** 107,113 ****
--- 107,117 ----
      for (cp = f; *cp;)
        if (*cp == '/') {
            switch (*++cp) {
+ #ifdef _AIX
+               case '\0':
+ #else
                case NULL:
+ #endif
                    if (--cp > f)
                        *cp = NULL;
                    break;
*** mh-6.7/support/pop/popd.c   Mon Apr  9 12:45:16 1990
--- mh-6.7.new/support/pop/popd.c       Fri Aug  7 14:13:53 1992
***************
*** 27,32 ****
--- 27,35 ----
  #ifdef        SIGTSTP
  #include <sys/resource.h>
  #include <sys/wait.h>
+ #ifdef _AIX
+ #include <sys/m_wait.h>
+ #endif
  #endif        SIGTSTP
  #include <netinet/in.h>
  #include <netdb.h>
*** mh-6.7/support/pop/popsbr.c Mon Apr  9 12:45:18 1990
--- mh-6.7.new/support/pop/popsbr.c     Mon Jan 28 19:01:07 1991
***************
*** 73,82 ****
--- 73,90 ----
        case OK:
            if (poprint)
                fprintf (stderr, "<--- %s\n", response);
+ #ifndef       _AUX_SOURCE
            if (*response == '+'
                    && command ("USER %s", user) != NOTOK
                    && command ("%s %s", rpop ? "RPOP" : (pophack++, "PASS"),
                                        pass) != NOTOK)
+ #else _AUX_SOURCE
+           if (*response == '+'
+                   && command ("USER %s", user) != NOTOK
+                   && command ("%s %s", rpop ? "RPOP" :
+                       (pophack++ - pophack - atoi("1") + "PASS"),
+                                       pass) != NOTOK)
+ #endif        _AUX_SOURCE
                return OK;
            if (*response != '+') {
                (void) strcpy (buffer, response);
*** mh-6.7/uip/ali.c    Thu Apr  5 19:03:56 1990
--- mh-6.7.new/uip/ali.c        Fri Aug  7 11:47:09 1992
***************
*** 191,197 ****
--- 191,201 ----
                            pos += 2;
                        }

+ #ifdef _AIX
+           case '\0':
+ #else
            case NULL:
+ #endif
                break;

            default:
*** mh-6.7/uip/aliasbr.c        Thu Apr  5 19:03:33 1990
--- mh-6.7.new/uip/aliasbr.c    Fri Aug  7 10:12:42 1992
***************
*** 152,158 ****
            case ':':           /* comment */
            case ';':
            case '#':
!           case NULL:
                continue;
        }

--- 152,162 ----
            case ':':           /* comment */
            case ';':
            case '#':
! #ifdef _AIX
!               case '\0':
! #else
!               case NULL:
! #endif
                continue;
        }

***************
*** 180,186 ****
        }

        switch (*(pp = scanp (ap))) {
!           case NULL:          /* EOL */
                (void) fclose (fp);
                return AK_ERROR;

--- 184,194 ----
        }

        switch (*(pp = scanp (ap))) {
! #ifdef _AIX
!               case '\0':      /* EOL */
! #else
!               case NULL:      /* EOL */
! #endif
                (void) fclose (fp);
                return AK_ERROR;

*** mh-6.7/uip/bbc.c    Thu Apr  5 19:02:56 1990
--- mh-6.7.new/uip/bbc.c        Fri Aug  7 14:25:01 1992
***************
*** 21,26 ****
--- 21,29 ----
  #include <sys/stat.h>
  #ifdef        SIGTSTP
  #include <sys/wait.h>
+ #ifdef _AIX
+ #include <sys/m_wait.h>
+ #endif
  #include <sys/time.h>
  #include <sys/resource.h>
  #endif        SIGTSTP
*** mh-6.7/uip/msh.c    Thu Apr  5 19:02:57 1990
--- mh-6.7.new/uip/msh.c        Fri Aug  7 10:55:57 1992
***************
*** 1562,1568 ****
--- 1562,1572 ----
            case '"':
                for (;;) {
                    switch (c = *cp++) {
+ #ifdef _AIX
+                       case '\0':
+ #else
                        case NULL:
+ #endif
                            padvise (NULLCP, "unmatched \"");
                            return NOTOK;
                        case '"':
*** mh-6.7/uip/mshcmds.c        Thu Jan 23 17:58:19 1992
--- mh-6.7.new/uip/mshcmds.c    Fri Aug  7 14:09:48 1992
***************
*** 39,45 ****
  static int    process();
                                /* SORTM */
  static int    msgsort (), subsort();
! static int    getws ();
  static char    *sosmash ();

  /*  */
--- 39,45 ----
  static int    process();
                                /* SORTM */
  static int    msgsort (), subsort();
! static int    local_getws ();
  static char    *sosmash ();

  /*  */
***************
*** 2502,2508 ****
            Msgs[msgnum].m_scanl = NULL;
        }
        if (mp -> msgstats[msgnum] & SELECTED) {
!           if (getws (datesw, subjsw, msgnum, &Msgs[msgnum]))
                twscopy (&Msgs[msgnum].m_tb,
                        msgnum != mp -> lowsel ? &Msgs[msgnum - 1].m_tb : &tb);
        }
--- 2502,2508 ----
            Msgs[msgnum].m_scanl = NULL;
        }
        if (mp -> msgstats[msgnum] & SELECTED) {
!           if (local_getws (datesw, subjsw, msgnum, &Msgs[msgnum]))
                twscopy (&Msgs[msgnum].m_tb,
                        msgnum != mp -> lowsel ? &Msgs[msgnum - 1].m_tb : &tb);
        }
***************
*** 2534,2544 ****
  /*  */

  /*
!  * getws - parse message, and get date and subject if needed.  We'll use
   * the msgp->m_tb tws struct for the date, and overload the msgp->m_scanl
   * field with our subject string.
   */
! static int   getws (datesw, subjsw, msgnum, msgp)
  char   *datesw,
         *subjsw;
  int   msgnum;
--- 2534,2544 ----
  /*  */

  /*
!  * local_getws - parse message, and get date and subject if needed.  We'll use
   * the msgp->m_tb tws struct for the date, and overload the msgp->m_scanl
   * field with our subject string.
   */
! static int   local_getws (datesw, subjsw, msgnum, msgp)
  char   *datesw,
         *subjsw;
  int   msgnum;
*** mh-6.7/uip/popsbr.c Mon Apr  9 12:47:26 1990
--- mh-6.7.new/uip/popsbr.c     Mon Jan 28 18:47:26 1991
***************
*** 75,82 ****
--- 75,88 ----
                fprintf (stderr, "<--- %s\n", response);
            if (*response == '+'
                    && command ("USER %s", user) != NOTOK
+ #ifndef       _AUX_SOURCE
                    && command ("%s %s", rpop ? "RPOP" : (pophack++, "PASS"),
                                        pass) != NOTOK)
+ #else _AUX_SOURCE
+                   && command ("%s %s", rpop ? "RPOP" :
+                       (pophack++ - pophack - 1 + "PASS"),
+                                       pass) != NOTOK)
+ #endif        _AUX_SOURCE
                return OK;
            if (*response != '+') {
                (void) strcpy (buffer, response);
*** mh-6.7/uip/sortm.c  Wed Dec 19 13:02:32 1990
--- mh-6.7.new/uip/sortm.c      Fri Aug  7 14:10:40 1992
***************
*** 52,58 ****
  int   submajor = 0;           /* if true, sort on subject-major */
  int   verbose;

! static        getws();
  static        int dsort(), read_hdrs (), subsort(), txtsort();
  static void rename_chain(), rename_msgs();

--- 52,58 ----
  int   submajor = 0;           /* if true, sort on subject-major */
  int   verbose;

! static        local_getws();
  static        int dsort(), read_hdrs (), subsort(), txtsort();
  static void rename_chain(), rename_msgs();

***************
*** 295,301 ****
      s = smsgs;
      for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
        if (mp->msgstats[msgnum] & SELECTED) {
!           if (getws (datesw, msgnum, s)) {
                s->s_msg = msgnum;
                s++;
            }
--- 295,301 ----
      s = smsgs;
      for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
        if (mp->msgstats[msgnum] & SELECTED) {
!           if (local_getws (datesw, msgnum, s)) {
                s->s_msg = msgnum;
                s++;
            }
***************
*** 306,312 ****
  }

  static
! getws (datesw, msg, smsg)
  register char *datesw;
  int msg;
  register struct smsg *smsg;
--- 306,312 ----
  }

  static
! local_getws (datesw, msg, smsg)
  register char *datesw;
  int msg;
  register struct smsg *smsg;
*** mh-6.7/zotnet/bboards/getbbent.c    Tue Aug  6 13:23:18 1991
--- mh-6.7.new/zotnet/bboards/getbbent.c        Fri Aug  7 10:57:32 1992
***************
*** 646,652 ****
--- 646,656 ----
                    hp = item;
                    break;

+ #ifdef _AIX
+               case '\0':
+ #else
                case NULL:
+ #endif
                    if ((cp = rindex (bb -> bb_file, '/')) == NULL || *++cp == 
NULL)
                        (void) strcpy (prf, ""), cp = bb -> bb_file;
                    else
*** mh-6.7/zotnet/mf/mf.c       Thu Jan 30 17:40:38 1992
--- mh-6.7.new/zotnet/mf/mf.c   Fri Aug  7 11:45:17 1992
***************
*** 810,816 ****
--- 810,820 ----
      if (c == '(')
        for (*bp++ = c, i = 0;;)
            switch (c = *cp++) {
+ #ifdef _AIX
+               case '\0':
+ #else
                case NULL:
+ #endif
                    cp = NULL;
                    return (last_lex = LX_ERR);
                case QUOTE:
***************
*** 841,847 ****
      if (c == '"')
        for (*bp++ = c;;)
            switch (c = *cp++) {
!               case NULL:
                    cp = NULL;
                    return (last_lex = LX_ERR);
                case QUOTE:
--- 845,855 ----
      if (c == '"')
        for (*bp++ = c;;)
            switch (c = *cp++) {
! #ifdef _AIX
!               case '\0':
! #else
!               case NULL:
! #endif
                    cp = NULL;
                    return (last_lex = LX_ERR);
                case QUOTE:
***************
*** 862,868 ****
      if (c == '[')
        for (*bp++ = c;;)
            switch (c = *cp++) {
!               case NULL:
                    cp = NULL;
                    return (last_lex = LX_ERR);
                case QUOTE:
--- 870,880 ----
      if (c == '[')
        for (*bp++ = c;;)
            switch (c = *cp++) {
! #ifdef _AIX
!               case '\0':
! #else
!               case NULL:
! #endif
                    cp = NULL;
                    return (last_lex = LX_ERR);
                case QUOTE:
***************
*** 965,971 ****
--- 977,987 ----
                pp = NULL;
                return DONE;

+ #ifdef _AIX
+           case '\0':
+ #else
            case NULL:
+ #endif
                continue;

            case '\n':
*** mh-6.7/zotnet/mts/lock.c    Fri Jan 25 12:46:47 1991
--- mh-6.7.new/zotnet/mts/lock.c        Fri Aug  7 11:42:26 1992
***************
*** 37,44 ****
--- 37,46 ----
  #define       NULLCP  ((char *) 0)

  #ifdef        SYS5
+ #ifndef _AIX
  #define       index   strchr
  #define       rindex  strrchr
+ #endif
  #endif        SYS5


*** mh-6.7/zotnet/tws/lexedit.sed       Thu Apr  5 19:06:01 1990
--- mh-6.7.new/zotnet/tws/lexedit.sed   Fri Aug  7 11:04:40 1992
***************
*** 9,11 ****
--- 9,20 ----
  } }
  /^struct yysvf *yybgin = yysvec+1;$/d
  /^int yylineno /,$d
+ /^# define YYTYPE short/c\
+ # define YYTYPE int
+ /^# define YYTYPE unsigned short/c\
+ # define YYTYPE int
+ /^unsigned char yymatch\[\] = {/c\
+ char yymatch[] = {
+ /^unsigned char yyextra\[\] = {/c\
+ char yyextra[] = {
+ /^if (__once_yylex) {$/,/if(yymbcurmax<=0) yymbcurmax=MB_CUR_MAX;$/d

<Prev in Thread] Current Thread [Next in Thread>
  • patches for mh6.7.2 on aix 3.2, Bill Wohler <=