Christian Weisgerber <na...@mips.inka.de> writes:

> Jérémie Courrèges-Anglas:
>
>> Here's the metamail diff.
>> 
>> I provide a knob to use tc[gs]etattr if desired.  I didn't use
>> cfmakeraw() since it seems that this one hasn't made its way into POSIX.
>> While here I replaced the gets() calls with fgets but if that's not
>> desired I can remove those parts.
>
> The fgets() chunks are fine.  (Hilariously, the code already checks
> for '\n' even though gets() drops a final newline.)

*chuckles*

> For the tcsetattr() calls I'm not sure about the TCSA* constants.
> Maybe use the same equivalents as ncurses term.h?
>
>   TCSANOW   TCSETA
>   TCSADRAIN TCSETAW
>   TCSAFLUSH TCSETAF
>
> Although I doubt that it matters.

Indeed, thanks.  Updated diff.

Index: Makefile
===================================================================
RCS file: /cvs/ports/mail/metamail/Makefile,v
retrieving revision 1.28
diff -u -p -r1.28 Makefile
--- Makefile    11 Mar 2013 11:23:51 -0000      1.28
+++ Makefile    29 Nov 2013 22:41:12 -0000
@@ -4,7 +4,7 @@ COMMENT=        MIME implementation
 
 DISTNAME=      mm2.7
 PKGNAME=       metamail-2.7
-REVISION=      3
+REVISION=      4
 CATEGORIES=    mail
 
 MASTER_SITES=  http://www.guppylake.com/~nsb/metamail/
@@ -17,7 +17,7 @@ WANTLIB=      c termcap
 USE_X11 =      Yes
 
 WRKSRC=                ${WRKDIST}/src
-MAKE_FLAGS=    CC="${CC}"
+MAKE_FLAGS=    CC="${CC}" CFLAGS="-DHAVE_TCGETATTR ${CFLAGS}"
 NO_TEST=       Yes
 
 post-configure:
Index: patches/patch-src_Makefile
===================================================================
RCS file: /cvs/ports/mail/metamail/patches/patch-src_Makefile,v
retrieving revision 1.1
diff -u -p -r1.1 patch-src_Makefile
--- patches/patch-src_Makefile  17 Mar 2012 10:57:23 -0000      1.1
+++ patches/patch-src_Makefile  29 Nov 2013 22:29:46 -0000
@@ -1,6 +1,6 @@
 $OpenBSD: patch-src_Makefile,v 1.1 2012/03/17 10:57:23 sthen Exp $
---- src/Makefile.orig  Wed Jan 26 17:32:33 1994
-+++ src/Makefile       Sat Mar 17 10:51:52 2012
+--- src/Makefile.orig  Wed Jan 26 18:32:33 1994
++++ src/Makefile       Fri Nov 29 23:29:41 2013
 @@ -38,7 +38,7 @@ FOOBAR-sun4=-Bstatic
  
  STATICFLAG=FOOBAR${HOST_ARCH}
@@ -10,18 +10,6 @@ $OpenBSD: patch-src_Makefile,v 1.1 2012/
  # The following is better if you want to make sure you run with SYSV defined
  # CFLAGS = -g -I.  ${$(STATICFLAG)}  -DSYSV
  # Also, for SGI Irix, compile in K&R mode
-@@ -49,9 +49,9 @@ CFLAGS = -g -I.  ${$(STATICFLAG)} 
- # LDLIBS variable.
- #
- # For Sun and BSD systems, the following should work...
--LDLIBS =
-+# LDLIBS =
- # On BSD 4.4 systems, you will need the following
--# LDLIBS = -lcompat
-+LDLIBS = -s -lcompat
- # On SGI machines, we need -lsun for getpw...(), and -lc_s saves some space.
- # LDLIBS = -lsun -lc_s
- # ISC SysVr3.2.2 has a shared C library and requires libinet.a to resolve
 @@ -72,10 +72,10 @@ CONFIGDIR = .
  #     install -s -c $(LOCALBINDIR) $$file
  #
Index: patches/patch-src_config_h
===================================================================
RCS file: /cvs/ports/mail/metamail/patches/patch-src_config_h,v
retrieving revision 1.1
diff -u -p -r1.1 patch-src_config_h
--- patches/patch-src_config_h  17 Mar 2012 10:57:23 -0000      1.1
+++ patches/patch-src_config_h  29 Nov 2013 21:43:44 -0000
@@ -1,6 +1,6 @@
 $OpenBSD: patch-src_config_h,v 1.1 2012/03/17 10:57:23 sthen Exp $
---- src/config.h.orig  Wed Nov 24 15:36:07 1993
-+++ src/config.h       Sat Mar 17 10:51:52 2012
+--- src/config.h.orig  Wed Nov 24 16:36:07 1993
++++ src/config.h       Fri Nov 29 19:40:35 2013
 @@ -73,7 +73,7 @@ WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
  #ifdef SYSV
  #define RESET_PROGRAM "tput clear"
@@ -29,7 +29,7 @@ $OpenBSD: patch-src_config_h,v 1.1 2012/
  #define PATH_SEPARATOR ':'
  #ifndef STDPATH
 -#define STDPATH 
"/.mailcap:/usr/local/etc/mailcap:/usr/etc/mailcap:/etc/mailcap:/etc/mail/mailcap:/usr/public/lib/mailcap"
-+#define STDPATH "/.mailcap:${SYSCONFDIR}/mailcap:/etc/mail/mailcap"
++#define STDPATH "/.mailcap:/etc/mailcap:/etc/mail/mailcap"
  #endif
  #endif
  #endif
Index: patches/patch-src_metamail_metamail_c
===================================================================
RCS file: /cvs/ports/mail/metamail/patches/patch-src_metamail_metamail_c,v
retrieving revision 1.1
diff -u -p -r1.1 patch-src_metamail_metamail_c
--- patches/patch-src_metamail_metamail_c       17 Mar 2012 10:57:23 -0000      
1.1
+++ patches/patch-src_metamail_metamail_c       30 Nov 2013 00:21:59 -0000
@@ -1,6 +1,6 @@
 $OpenBSD: patch-src_metamail_metamail_c,v 1.1 2012/03/17 10:57:23 sthen Exp $
---- src/metamail/metamail.c.orig       Thu Feb 17 01:57:19 1994
-+++ src/metamail/metamail.c    Sat Mar 17 10:51:52 2012
+--- src/metamail/metamail.c.orig       Thu Feb 17 02:57:19 1994
++++ src/metamail/metamail.c    Sat Nov 30 01:21:52 2013
 @@ -20,6 +20,8 @@ WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
  
   ******************************************************* */
@@ -19,7 +19,25 @@ $OpenBSD: patch-src_metamail_metamail_c,
  #define WRITE_BINARY  "w"
  #else /* BORLAND */
  #ifdef MICROSOFT
-@@ -100,13 +102,6 @@ extern char **environ, *gets();
+@@ -46,12 +48,14 @@ extern char *mktemp(char *);
+ #include <signal.h>
+ 
+ #ifndef AMIGA
+-#ifdef SYSV
++#if defined(HAVE_TCGETATTR)
++#include <termios.h>
++#elif defined(SYSV)
+ #include <termio.h>
+ #include <unistd.h>
+-#else /* SYSV */
++#else
+ #include <sgtty.h>
+-#endif /* SYSV */
++#endif
+ #endif /* AMIGA */
+ #endif /* MICROSOFT */
+ #endif /* BORLAND */
+@@ -100,13 +104,6 @@ extern char **environ, *gets();
  #define CMDSIZE 1200 /* Maximum size of command to execute */
  
  #define LINE_BUF_SIZE       2000
@@ -33,7 +51,7 @@ $OpenBSD: patch-src_metamail_metamail_c,
  char fileToDelete[MAX_FILE_NAME_SIZE];
  
  char *FindParam();
-@@ -302,24 +297,6 @@ char **argv;
+@@ -302,24 +299,6 @@ char **argv;
      int retcode;
  
      modpath(AUXPATH);
@@ -58,7 +76,16 @@ $OpenBSD: patch-src_metamail_metamail_c,
      tmproot = getenv("METAMAIL_TMPDIR");
      if (!tmproot) tmproot="/tmp";
      mailheaders = getenv("MM_HEADERS");
-@@ -1202,9 +1179,9 @@ char *SquirrelFile;
+@@ -579,7 +558,7 @@ int nestingdepth;
+                                 int overwriteans = -1;
+                                 do {
+                                     printf("File %s exists.  Do you want to 
overwrite it (y/n) ?\n", Fname);
+-                                    s = gets(AnsBuf);
++                                    s = fgets(AnsBuf, sizeof(AnsBuf), stdin);
+                                     if (!s) {
+                                         overwriteans = 0;
+                                     } else {
+@@ -1202,9 +1181,9 @@ char *SquirrelFile;
      fprintf(outfp, "Content-type: %s", ContentType);
      for (j=0; j<CParamsUsed; ++j) {
          fprintf(outfp, " ; ");
@@ -70,7 +97,16 @@ $OpenBSD: patch-src_metamail_metamail_c,
      }
      fprintf(outfp, "\n\n"); 
      TranslateInputToOutput(InputFP, outfp, EncodingCode, ContentType);
-@@ -2022,7 +1999,7 @@ int ShowLeadingWhitespace;
+@@ -1823,7 +1802,7 @@ char *ctype, *progname, *label;
+         } else {
+             printf("This message contains '%s'-format data.\nDo you want to 
view it using the '%s' command (y/n) [y] ? ", ctype, ShortCommand(progname));
+         }
+-        s = gets(AnsBuf);
++        s = fgets(AnsBuf, sizeof(AnsBuf), stdin);
+         if (!s) return(0); /* EOF */
+       while (s && *s && isspace((unsigned char) *s)) ++s;
+       if (*s == 'y' || *s == 'Y' || !*s || *s == '\n') return(1);
+@@ -2022,7 +2001,7 @@ int ShowLeadingWhitespace;
      if (lc2strcmp(charset, PrevCharset)) {
          char *s2, *charsetinuse;
  
@@ -79,7 +115,7 @@ $OpenBSD: patch-src_metamail_metamail_c,
          for (s2=PrevCharset; *s2; ++s2) {
              if (isupper((unsigned char) *s2)) *s2 = tolower((unsigned char) 
*s2);
          }
-@@ -2032,7 +2009,7 @@ int ShowLeadingWhitespace;
+@@ -2032,7 +2011,7 @@ int ShowLeadingWhitespace;
          }
      }
      if (ecode == ENCODING_NONE) {
@@ -88,7 +124,44 @@ $OpenBSD: patch-src_metamail_metamail_c,
      } else {
          /* What follows is REALLY bogus, but all my encoding stuff is 
pipe-oriented right now... */
          MkTmpFileName(TmpFile);
-@@ -2489,14 +2466,14 @@ char *name;
+@@ -2374,8 +2353,11 @@ char *Prefix;
+ }
+ 
+ int HasSavedTtyState=0;
++
+ #if !defined(AMIGA) && !defined(MSDOS)
+-#ifdef SYSV
++#if defined(HAVE_TCGETATTR)
++static struct termios MyTtyStateIn, MyTtyStateOut;
++#elif defined(SYSV)
+ static struct termio MyTtyStateIn, MyTtyStateOut;
+ #else
+ static struct sgttyb MyTtyStateIn, MyTtyStateOut;
+@@ -2385,7 +2367,10 @@ static struct sgttyb MyTtyStateIn, MyTtyStateOut;
+ SaveTtyState() {
+     /* Bogus -- would like a good portable way to reset the terminal state 
here */
+ #if !defined(AMIGA) && !defined(MSDOS)
+-#ifdef SYSV
++#if defined(HAVE_TCGETATTR)
++    tcgetattr(fileno(stdin), &MyTtyStateIn);
++    tcgetattr(fileno(stdout), &MyTtyStateOut);
++#elif defined(SYSV)
+     ioctl(fileno(stdin), TCGETA, &MyTtyStateIn);
+     ioctl(fileno(stdout), TCGETA, &MyTtyStateOut);
+ #else
+@@ -2398,7 +2383,10 @@ SaveTtyState() {
+ 
+ RestoreTtyState() {
+ #if !defined(AMIGA) && !defined(MSDOS)
+-#ifdef SYSV
++#if defined(HAVE_TCGETATTR)
++    tcsetattr(fileno(stdin), TCSANOW, &MyTtyStateIn);
++    tcsetattr(fileno(stdout), TCSANOW, &MyTtyStateOut);
++#elif defined(SYSV)
+     if (HasSavedTtyState) {
+         ioctl(fileno(stdout), TCSETA, &MyTtyStateOut);
+         ioctl(fileno(stdin), TCSETA, &MyTtyStateIn);
+@@ -2489,14 +2477,14 @@ char *name;
  {
  #ifdef AMIGA
      strcpy(name, "T:mmXXXXXX");
@@ -106,3 +179,21 @@ $OpenBSD: patch-src_metamail_metamail_c,
           name[0] = 0;
       else
           if (DoDebug) printf("temp name = \"%s\"\n", name);
+@@ -2681,7 +2669,16 @@ PauseForUser() {
+ 
+ StartRawStdin() {
+ #if !defined(AMIGA) && !defined(MSDOS)
+-#ifdef SYSV
++#if defined(HAVE_TCGETATTR)
++    struct termios term;
++
++    if (tcgetattr(0, &term) == -1) /* get current (i.e. cooked) termio */
++        return -1;
++    term.c_lflag &= ~ICANON;    /* clear ICANON giving raw mode */
++    term.c_cc[VMIN] = 1;      /* set MIN char count to 1 */
++    term.c_cc[VTIME] = 0;     /* set NO time limit */
++    return tcsetattr(0, TCSADRAIN, &term);
++#elif defined(SYSV)
+     struct termio   orterm, fterm;
+     ioctl(0, TCGETA, &orterm);        /* get current (i.e. cooked) termio */
+     fterm = orterm;           /* get termio to modify */

Reply via email to