https://bugs.gentoo.org/869371

Upstream variant: https://lists.gnu.org/archive/html/screen-devel/2022-08/msg00000.html
--- a/configure.ac
+++ b/configure.ac
@@ -157,10 +157,11 @@ if test -n "$ULTRIX"; then
 fi
 AC_CHECKING(for POSIX.1)
 AC_EGREP_CPP(YES_IS_DEFINED,
 [#include <sys/types.h>
 #include <unistd.h>
+int
 main () {
 #ifdef _POSIX_VERSION
   YES_IS_DEFINED;
 #endif
 ], AC_NOTE(- you have a POSIX system) AC_DEFINE(POSIX) posix=1)
@@ -231,10 +232,11 @@ dnl
 
 AC_CHECKING(BSD job jontrol)
 AC_TRY_LINK(
 [#include <sys/types.h>
 #include <sys/ioctl.h>
+#include <unistd.h>
 ], [
 #ifdef POSIX
 tcsetpgrp(0, 0);
 #else
 int x = TIOCSPGRP;
@@ -248,48 +250,64 @@ int y = TIOCNOTTY;
 
 dnl
 dnl    ****  setresuid(), setreuid(), seteuid()  ****
 dnl
 AC_CHECKING(setresuid)
-AC_TRY_LINK(,[
+AC_TRY_LINK(
+[#include <unistd.h>
+], [
 setresuid(0, 0, 0);
 ], AC_DEFINE(HAVE_SETRESUID))
 AC_CHECKING(setreuid)
-AC_TRY_LINK(,[
+AC_TRY_LINK(
+[#include <unistd.h>
+], [
 setreuid(0, 0);
 ], AC_DEFINE(HAVE_SETREUID))
 dnl
 dnl seteuid() check:
 dnl   linux seteuid was broken before V1.1.11
 dnl   NeXT, AUX, ISC, and ultrix are still broken (no saved uid support)
 dnl   Solaris seteuid doesn't change the saved uid, bad for
 dnl     multiuser screen sessions
 AC_CHECKING(seteuid)
-AC_TRY_LINK(,[
+AC_TRY_LINK(
+[#include <unistd.h>
+],[
 #if defined(linux) || defined(NeXT) || defined(_AUX_SOURCE) || defined(AUX) || defined(ultrix) || (defined(sun) && defined(SVR4)) || defined(ISC) || defined(sony_news)
-seteuid_is_broken(0);
+int seteuid_is_broken(int); seteuid_is_broken(0);
 #else
 seteuid(0);
 #endif
 ], AC_DEFINE(HAVE_SETEUID))
 
 dnl execvpe
 AC_CHECKING(execvpe)
-AC_TRY_LINK(,[
+AC_TRY_LINK(
+[#include <unistd.h>
+],[
     execvpe(0, 0, 0);
 ], AC_DEFINE(HAVE_EXECVPE)
 CFLAGS="$CFLAGS -D_GNU_SOURCE")
 
 dnl
 dnl    ****  select()  ****
 dnl
 
 AC_CHECKING(select)
-AC_TRY_LINK(,[select(0, 0, 0, 0, 0);],, 
+AC_TRY_LINK(
+[#include <sys/select.h>
+],[
+    select(0, 0, 0, 0, 0);
+],, 
 LIBS="$LIBS -lnet -lnsl"
 AC_CHECKING(select with $LIBS)
-AC_TRY_LINK(,[select(0, 0, 0, 0, 0);],, 
+AC_TRY_LINK(
+[#include <sys/select.h>
+],[
+    select(0, 0, 0, 0, 0);
+],, 
 AC_MSG_ERROR(!!! no select - no screen))
 )
 dnl
 dnl    ****  FIFO tests  ****
 dnl
@@ -314,11 +332,11 @@ AC_TRY_RUN([
 #define S_IFIFO 0010000
 #endif
 
 char *fin = "/tmp/conftest$$";
 
-main()
+int main()
 {
   struct stat stb;
   fd_set f;
 
   (void)alarm(5);
@@ -326,40 +344,40 @@ main()
 #ifdef POSIX
   if (mkfifo(fin, 0777))
 #else
   if (mknod(fin, S_IFIFO|0777, 0))
 #endif
-    exit(1);
+    return 1;
   if (stat(fin, &stb) || (stb.st_mode & S_IFIFO) != S_IFIFO)
-    exit(1);
+    return 1;
   close(0);
 #ifdef __386BSD__
   /*
    * The next test fails under 386BSD, but screen works using fifos.
    * Fifos in O_RDWR mode are only used for the BROKEN_PIPE case and for
    * the select() configuration test.
    */
-  exit(0);
+  return 0;
 #endif
   if (open(fin, O_RDONLY | O_NONBLOCK))
-    exit(1);
+    return 1;
   if (fork() == 0)
     {
       close(0);
       if (open(fin, O_WRONLY | O_NONBLOCK))
-	exit(1);
+        return 1;
       close(0);
       if (open(fin, O_WRONLY | O_NONBLOCK))
-	exit(1);
+        return 1;
       if (write(0, "TEST", 4) == -1)
-	exit(1);
-      exit(0);
+        return 1;
+      return 0;
     }
   FD_SET(0, &f);
   if (select(1, &f, 0, 0, 0) == -1)
-    exit(1);
-  exit(0);
+    return 1;
+  return 0;
 }
 ], AC_NOTE(- your fifos are usable) fifo=1,
 AC_NOTE(- your fifos are not usable),
 AC_NOTE(- skipping check because we are cross compiling; assuming fifos are usable) fifo=1)
 rm -f /tmp/conftest*
@@ -385,30 +403,31 @@ AC_TRY_RUN([
 #define S_IFIFO 0010000
 #endif
 
 char *fin = "/tmp/conftest$$";
 
+int
 main()
 {
   struct timeval tv;
   fd_set f;
 
 #ifdef POSIX
   if (mkfifo(fin, 0600))
 #else
   if (mknod(fin, S_IFIFO|0600, 0))
 #endif
-    exit(1);
+    return 1;
   close(0);
   if (open(fin, O_RDONLY|O_NONBLOCK))
-    exit(1);
+    return 1;
   FD_SET(0, &f);
   tv.tv_sec = 1;
   tv.tv_usec = 0;
   if (select(1, &f, 0, 0, &tv))
-    exit(1);
-  exit(0);
+    return 1;
+  return 0;
 }
 ], AC_NOTE(- your implementation is ok), 
 AC_NOTE(- you have a broken implementation) AC_DEFINE(BROKEN_PIPE) fifobr=1,
 AC_NOTE(- skipping check because we are cross compiling; assuming fifo implementation is ok))
 rm -f /tmp/conftest*
@@ -432,46 +455,48 @@ AC_TRY_RUN([
 
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <sys/socket.h>
 #include <sys/un.h>
+#include <signal.h>
 
 char *son = "/tmp/conftest$$";
 
+int
 main()
 {
   int s1, s2, l;
   struct sockaddr_un a;
   fd_set f;
 
   (void)alarm(5);
   if ((s1 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
-    exit(1);
+    return 1;
   a.sun_family = AF_UNIX;
   strcpy(a.sun_path, son);
   (void) unlink(son);
   if (bind(s1, (struct sockaddr *) &a, strlen(son)+2) == -1)
-    exit(1);
+    return 1;
   if (listen(s1, 2))
-    exit(1);
+    return 1;
   if (fork() == 0)
     {
       if ((s2 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
 	kill(getppid(), 3);
       (void)connect(s2, (struct sockaddr *)&a, strlen(son) + 2);
       if (write(s2, "HELLO", 5) == -1)
 	kill(getppid(), 3);
-      exit(0);
+      return 0;
     }
   l = sizeof(a);
   close(0);
   if (accept(s1, &a, &l))
-    exit(1);
+    return 1;
   FD_SET(0, &f);
   if (select(1, &f, 0, 0, 0) == -1)
-    exit(1);
-  exit(0);
+    return 1;
+  return 0;
 }
 ], AC_NOTE(- your sockets are usable) sock=1,
 AC_NOTE(- your sockets are not usable),
 AC_NOTE(- skipping check because we are cross compiling; assuming sockets are usable) sock=1)
 rm -f /tmp/conftest*
@@ -491,26 +516,27 @@ AC_TRY_RUN([
 #include <sys/socket.h>
 #include <sys/un.h>
 
 char *son = "/tmp/conftest$$";
 
+int
 main()
 {
   int s;
   struct stat stb;
   struct sockaddr_un a;
   if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
-    exit(0);
+    return 0;
   a.sun_family = AF_UNIX;
   strcpy(a.sun_path, son);
   (void) unlink(son);
   if (bind(s, (struct sockaddr *) &a, strlen(son)+2) == -1)
-    exit(0);
+    return 0;
   if (stat(son, &stb))
-    exit(1);
+    return 1;
   close(s);
-  exit(0);
+  return 0;
 }
 ],AC_NOTE(- you are normal),
 AC_NOTE(- unix domain sockets are not kept in the filesystem)
 AC_DEFINE(SOCK_NOT_IN_FS) socknofs=1,
 AC_NOTE(- skipping check because we are cross compiling; assuming sockets are normal))
@@ -545,122 +571,167 @@ char *nam = "/tmp/conftest$$";
 #endif
 #ifndef S_IFIFO
 #define S_IFIFO 0010000
 #endif
 
+int
 main()
 {
   fd_set f;
 
 #ifdef __FreeBSD__
 /* From Andrew A. Chernov (ache@astral.msk.su):
  * opening RDWR fifo fails in BSD 4.4, but select return values are
  * right.
  */
-  exit(0);
+  return 0;
 #endif
   (void)alarm(5);
 #ifdef POSIX
   if (mkfifo(nam, 0777))
 #else
   if (mknod(nam, S_IFIFO|0777, 0))
 #endif
-    exit(1);
+    return 1;
   close(0);
   if (open(nam, O_RDWR | O_NONBLOCK))
-    exit(1);
+    return 1;
   if (write(0, "TEST", 4) == -1)
-    exit(1);
+    return 1;
 
 #else
 
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/un.h>
+#include <signal.h>
 
+int
 main()
 {
   int s1, s2, l;
   struct sockaddr_un a;
   fd_set f;
 
   (void)alarm(5);
   if ((s1 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
-    exit(1);
+    return 1;
   a.sun_family = AF_UNIX;
   strcpy(a.sun_path, nam);
   (void) unlink(nam);
   if (bind(s1, (struct sockaddr *) &a, strlen(nam)+2) == -1)
-    exit(1);
+    return 1;
   if (listen(s1, 2))
-    exit(1);
+    return 1;
   if (fork() == 0)
     {
       if ((s2 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
 	kill(getppid(), 3);
       (void)connect(s2, (struct sockaddr *)&a, strlen(nam) + 2);
       if (write(s2, "HELLO", 5) == -1)
 	kill(getppid(), 3);
-      exit(0);
+      return 0;
     }
   l = sizeof(a);
   close(0);
   if (accept(s1, (struct sockaddr *)&a, &l))
-    exit(1);
+    return 1;
 #endif
 
 
   FD_SET(0, &f);
   if (select(1, &f, 0, 0, 0) == -1)
-    exit(1);
+    return 1;
   if (select(1, &f, &f, 0, 0) != 2)
-    exit(1);
-  exit(0);
+    return 1;
+  return 0;
 }
 ],AC_NOTE(- select is ok),
 AC_NOTE(- select can't count) AC_DEFINE(SELECT_BROKEN),
 AC_NOTE(- skipping check because we are cross compiling; assuming select is ok))
 
 dnl
 dnl    ****  termcap or terminfo  ****
 dnl
 AC_CHECKING(for tgetent)
-AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
+AC_TRY_LINK([
+    #include <curses.h>
+    #include <term.h>
+], [
+    tgetent((char *)0, (char *)0);
+],,
 olibs="$LIBS"
 LIBS="-lcurses $olibs"
 AC_CHECKING(libcurses)
-AC_TRY_LINK(,[
+AC_TRY_LINK([#include <curses.h>
+    #include <term.h>
+],[
 #ifdef __hpux
 __sorry_hpux_libcurses_is_totally_broken_in_10_10();
 #else
 tgetent((char *)0, (char *)0);
 #endif
 ],,
 LIBS="-ltermcap $olibs"
 AC_CHECKING(libtermcap)
-AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
+AC_TRY_LINK(
+[#include <curses.h>
+    #include <term.h>
+],[
+    tgetent((char *)0, (char *)0);
+],,
 LIBS="-ltermlib $olibs"
 AC_CHECKING(libtermlib)
-AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
+AC_TRY_LINK(
+[#include <curses.h>
+    #include <term.h>
+],[
+    tgetent((char *)0, (char *)0);
+],,
 LIBS="-lncursesw $olibs"
 AC_CHECKING(libncursesw)
-AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
+AC_TRY_LINK(
+[#include <curses.h>
+    #include <term.h>
+],[
+    tgetent((char *)0, (char *)0);
+],,
 LIBS="-ltinfow $olibs"
 AC_CHECKING(libtinfow)
-AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
+AC_TRY_LINK(
+[#include <curses.h>
+    #include <term.h>
+],[
+    tgetent((char *)0, (char *)0);
+],,
 LIBS="-lncurses $olibs"
 AC_CHECKING(libncurses)
-AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
+AC_TRY_LINK(
+[#include <curses.h>
+    #include <term.h>
+],[
+    tgetent((char *)0, (char *)0);
+],,
 LIBS="-ltinfo $olibs"
 AC_CHECKING(libtinfo)
-AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
+AC_TRY_LINK(
+[#include <curses.h>
+    #include <term.h>
+],[
+    tgetent((char *)0, (char *)0);
+],,
 AC_MSG_ERROR(!!! no tgetent - no screen)))))))))
 
 AC_TRY_RUN([
+#include <curses.h>
+#include <string.h>
+#include <term.h>
+
+int
 main()
 {
- exit(strcmp(tgoto("%p1%d", 0, 1), "1") ? 0 : 1);
+ return(strcmp(tgoto("%p1%d", 0, 1), "1") ? 0 : 1);
 }], AC_NOTE(- you use the termcap database),
 AC_NOTE(- you use the terminfo database) AC_DEFINE(TERMINFO),
 AC_NOTE(- skipping check because we are cross compiling; assuming terminfo database is used) AC_DEFINE(TERMINFO))
 AC_CHECKING(ospeed)
 AC_TRY_LINK(extern short ospeed;,ospeed=5;,,AC_DEFINE(NEED_OSPEED))
@@ -677,11 +748,15 @@ fi
 
 if test "$cross_compiling" = no ; then
 AC_CHECKING(for SVR4 ptys)
 sysvr4ptys=
 if test -c /dev/ptmx ; then
-AC_TRY_LINK([],[ptsname(0);grantpt(0);unlockpt(0);],[AC_DEFINE(HAVE_SVR4_PTYS)
+AC_TRY_LINK([
+    #include <stdlib.h>
+], [
+    ptsname(0);grantpt(0);unlockpt(0);
+],[AC_DEFINE(HAVE_SVR4_PTYS)
 sysvr4ptys=1])
 fi
 fi
 
 AC_CHECK_FUNCS(getpt)
@@ -733,33 +808,36 @@ AC_CHECKING(default tty permissions/group)
 rm -f conftest_grp
 AC_TRY_RUN([
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+int
 main()
 {
   struct stat sb;
   char *x,*ttyname();
   int om, m;
   FILE *fp;
 
-  if (!(x = ttyname(0))) exit(1);
-  if (stat(x, &sb)) exit(1);
+  if (!(x = ttyname(0))) return 1;
+  if (stat(x, &sb)) return 1;
   om = sb.st_mode;
-  if (om & 002) exit(0);
+  if (om & 002) return 0;
   m = system("mesg y");
-  if (m == -1 || m == 127) exit(1);
-  if (stat(x, &sb)) exit(1);
+  if (m == -1 || m == 127) return 1;
+  if (stat(x, &sb)) return 1;
   m = sb.st_mode;
-  if (chmod(x, om)) exit(1);
-  if (m & 002) exit(0);
-  if (sb.st_gid == getgid()) exit(1);
+  if (chmod(x, om)) return 1;
+  if (m & 002) return 0;
+  if (sb.st_gid == getgid()) return 1;
   if (!(fp=fopen("conftest_grp", "w")))
-    exit(1);
+    return 1;
   fprintf(fp, "%d\n", sb.st_gid);
   fclose(fp);
-  exit(0);
+  return 0;
 }
 ],[
     if test -f conftest_grp; then
 	ptygrp=`cat conftest_grp`
 	AC_NOTE([- pty mode: $ptymode, group: $ptygrp])
@@ -869,17 +942,25 @@ AC_CHECKING(for libutil(s))
 test -f /usr/lib/libutils.a && LIBS="$LIBS -lutils"
 test -f /usr/lib/libutil.a && LIBS="$LIBS -lutil"
 fi
 
 AC_CHECKING(getloadavg)
-AC_TRY_LINK(,[getloadavg((double *)0, 0);],
+AC_TRY_LINK(
+[
+    #include <stdlib.h>
+],[
+    getloadavg((double *)0, 0);],
 AC_DEFINE(LOADAV_GETLOADAVG) load=1,
 if test "$cross_compiling" = no && test -f /usr/lib/libkvm.a ; then
 olibs="$LIBS"
 LIBS="$LIBS -lkvm"
 AC_CHECKING(getloadavg with -lkvm)
-AC_TRY_LINK(,[getloadavg((double *)0, 0);],
+AC_TRY_LINK(
+[
+    #include <stdlib.h>
+],[
+    getloadavg((double *)0, 0);],
 AC_DEFINE(LOADAV_GETLOADAVG) load=1, LIBS="$olibs")
 fi
 )
 
 if test -z "$load" ; then
@@ -931,10 +1012,11 @@ else
 
 $nlist64
 
 struct nlist nl[2];
 
+int
 main()
 {
 #if !defined(_AUX_SOURCE) && !defined(AUX)
 # ifdef NLIST_NAME_UNION
   nl[0].n_un.n_name = "$av";
@@ -944,12 +1026,12 @@ main()
 #else
   strncpy(nl[0].n_name, "$av", sizeof(nl[0].n_name));
 #endif
   nlist(LOADAV_UNIX, nl);
   if (nl[0].n_value == 0)
-    exit(1);
-  exit(0);
+    return 1;
+  return 0;
 }
   ],avensym=$av;break)
   if test "$av" = _Loadavg; then
     nlist64='#define nlist nlist64'
   fi
@@ -1068,21 +1150,22 @@ void
 hand()
 {
   got++;
 }
 
+int
 main()
 {
   /* on hpux we use sigvec to get bsd signals */
 #ifdef __hpux
   (void)signal(SIGCLD, hand);
   kill(getpid(), SIGCLD);
   kill(getpid(), SIGCLD);
   if (got < 2)
-    exit(1);
+    return 1;
 #endif
-  exit(0);
+  return 0;
 }
 ],,AC_DEFINE(SYSVSIGS),:)
 
 fi
 
@@ -1107,14 +1190,22 @@ oldlibs="$LIBS"
 LIBS="$LIBS -lsun"
 AC_CHECKING(IRIX sun library)
 AC_TRY_LINK(,,,LIBS="$oldlibs")
 
 AC_CHECKING(syslog)
-AC_TRY_LINK(,[closelog();], , [oldlibs="$LIBS"
+AC_TRY_LINK(
+[#include <syslog.h>
+], [
+    closelog();
+], , [oldlibs="$LIBS"
 LIBS="$LIBS -lbsd"
 AC_CHECKING(syslog in libbsd.a)
-AC_TRY_LINK(, [closelog();], AC_NOTE(- found.), [LIBS="$oldlibs"
+AC_TRY_LINK(
+[#include <syslog.h>
+], [
+    closelog();
+], AC_NOTE(- found.), [LIBS="$oldlibs"
 AC_NOTE(- bad news: syslog missing.) AC_DEFINE(NOSYSLOG)])])
 
 AC_EGREP_CPP(YES_IS_DEFINED,
 [#ifdef M_UNIX
    YES_IS_DEFINED;
@@ -1147,66 +1238,87 @@ fi
 dnl AC_CHECK_HEADER(shadow.h, AC_DEFINE(SHADOWPW))
 AC_CHECKING(getspnam)
 AC_TRY_LINK([#include <shadow.h>], [getspnam("x");],AC_DEFINE(SHADOWPW))
 
 AC_CHECKING(getttyent)
-AC_TRY_LINK(,[getttyent();], AC_DEFINE(GETTTYENT))
+AC_TRY_LINK(
+[
+    #include <ttyent.h>
+],[
+    getttyent();
+], AC_DEFINE(GETTTYENT))
 
 AC_CHECKING(fdwalk)
 AC_TRY_LINK([#include <stdlib.h>], [fdwalk(NULL, NULL);],AC_DEFINE(HAVE_FDWALK))
 
 AC_CHECKING(whether memcpy/memmove/bcopy handles overlapping arguments)
 AC_TRY_RUN([
+#include <string.h>
+
+int
 main() {
   char buf[10];
   strcpy(buf, "abcdefghi");
   bcopy(buf, buf + 2, 3);
   if (strncmp(buf, "ababcf", 6))
-    exit(1);
+    return 1;
   strcpy(buf, "abcdefghi");
   bcopy(buf + 2, buf, 3);
   if (strncmp(buf, "cdedef", 6))
-    exit(1);
-  exit(0); /* libc version works properly.  */
+    return 1;
+  return 0; /* libc version works properly.  */
 }], AC_DEFINE(USEBCOPY),,:)
 
 AC_TRY_RUN([
+#include <string.h>
+
 #define bcopy(s,d,l) memmove(d,s,l)
+int
 main() {
   char buf[10];
   strcpy(buf, "abcdefghi");
   bcopy(buf, buf + 2, 3);
   if (strncmp(buf, "ababcf", 6))
-    exit(1);
+    return 1;
   strcpy(buf, "abcdefghi");
   bcopy(buf + 2, buf, 3);
   if (strncmp(buf, "cdedef", 6))
-    exit(1);
-  exit(0); /* libc version works properly.  */
+    return 1;
+  return 0; /* libc version works properly.  */
 }], AC_DEFINE(USEMEMMOVE),,
   AC_NOTE(- skipping check because we are cross compiling; use memmove) AC_DEFINE(USEMEMMOVE))
 
 
 AC_TRY_RUN([
+#include <string.h>
+
 #define bcopy(s,d,l) memcpy(d,s,l)
+int
 main() {
   char buf[10];
   strcpy(buf, "abcdefghi");
   bcopy(buf, buf + 2, 3);
   if (strncmp(buf, "ababcf", 6))
-    exit(1);
+    return 1;
   strcpy(buf, "abcdefghi");
   bcopy(buf + 2, buf, 3);
   if (strncmp(buf, "cdedef", 6))
-    exit(1);
-  exit(0); /* libc version works properly.  */
+    return 1;
+  return 0; /* libc version works properly.  */
 }], AC_DEFINE(USEMEMCPY),,:)
 
 AC_SYS_LONG_FILE_NAMES
 
 AC_MSG_CHECKING(for vsprintf)
-AC_TRY_LINK([#include <stdarg.h>],[va_list valist; vsprintf(0,0,valist);], AC_MSG_RESULT(yes);AC_DEFINE(USEVARARGS), AC_MSG_RESULT(no))
+AC_TRY_LINK(
+[
+    #include <stdarg.h>
+    #include <stdio.h>
+],
+[
+    va_list valist; vsprintf(0,0,valist);
+], AC_MSG_RESULT(yes);AC_DEFINE(USEVARARGS), AC_MSG_RESULT(no))
 
 AC_HEADER_DIRENT
 
 AC_MSG_CHECKING(for setenv)
 if test -z "$ac_setenv_args"; then

