Author: Andreas Tille <tille@debian.org>
Bug-Debian: https://bugs.debian.org/1066561
Last-Update: 2025-08-22
Description: Fix build with gcc-14

--- a/src/main.c
+++ b/src/main.c
@@ -61,6 +61,7 @@ int restriction = 0;
 
 static void FDECL(read_configuration,(CONST char *fname));
 int FDECL(main,(int argc, char **argv));
+extern void main_loop();
 
 int main(argc, argv)
     int argc;
--- a/unix/tfconfig
+++ b/unix/tfconfig
@@ -523,6 +523,17 @@ fi
 echo 'Testing for library symbols...'
 cat > symtest.c <<EOF
 
+#include <pwd.h>
+#include <sys/time.h>
+#include <unistd.h>
+#include <signal.h>
+#include <limits.h>
+#include <locale.h>
+#include <strings.h>
+#include <stdlib.h>
+#include <sys/wait.h>
+#include <time.h> 
+
 #include "../src/config.h"    /* for header file macros */
 #include <stdio.h>
 #ifdef UNISTD_H
@@ -542,6 +553,8 @@ cat > symtest.c <<EOF
 extern int h_errno;
 #endif
 
+void nonexistant_function();
+
 int main() {
     int i;
     char *s;
@@ -569,11 +582,11 @@ int main() {
     srandom(0);
     strcasecmp(NULL, NULL);
     strchr(NULL, 0);
-    strcmpi(NULL, NULL);
+    strcasecmp(NULL, NULL);
     strcspn(NULL, NULL);
     strerror(0);
     strftime(NULL, 0, NULL, NULL);
-    stricmp(NULL, NULL);
+    strcasecmp(NULL, NULL);
     strstr(NULL, NULL);
     strtod(NULL, NULL);
     strtol(NULL, NULL, 0);
@@ -617,8 +630,8 @@ fi
 for sym in \
     bcopy bsearch bzero connect fileno getcwd gethostbyname getpwnam \
     gettimeofday getwd h_errno hstrerror index kill memcpy memset raise \
-    setlocale sigaction srand srandom strcasecmp strchr strcmpi strcspn \
-    strerror strftime stricmp strstr strtod strtol tzset waitpid
+    setlocale sigaction srand srandom strcasecmp strchr strcasecmp strcspn \
+    strerror strftime strcasecmp strstr strtod strtol tzset waitpid
 do
     if egrep "(^|[^a-z_])_?_?${sym}([^a-z]|\$)" symtest.out >/dev/null; then
         echo "Did not find ${sym}, but that's ok."
--- a/src/signals.c
+++ b/src/signals.c
@@ -61,7 +61,7 @@ union wait *dummy_union_wait;
 # define WEXITSTATUS(w)  (((*(int *)&(w)) >> 8) & 0xFF) /* works most places */
 #endif
 
-typedef RETSIG FDECL((SigHandler),(int sig));
+typedef void FDECL((SigHandler),(int sig));
 
 #ifndef HAVE_raise
 # ifdef HAVE_kill
@@ -120,15 +120,15 @@ VEC_TYPEDEF(sig_set, (NSIG-1));
 
 
 static sig_set pending_signals;
-static RETSIG FDECL((*parent_tstp_handler),(int sig));
+static void FDECL((*parent_tstp_handler),(int sig));
 
 static void   NDECL(handle_interrupt);
 static void   FDECL(terminate,(int sig));
 static void   NDECL(coremsg);
-static RETSIG FDECL(core_handler,(int sig));
-static RETSIG FDECL(signal_scheduler,(int sig));
+static void FDECL(core_handler,(int sig));
+static void FDECL(signal_scheduler,(int sig));
 #ifndef SIG_IGN
-static RETSIG FDECL(SIG_IGN,(int sig));
+static void FDECL(SIG_IGN,(int sig));
 #endif
 
 
@@ -145,9 +145,7 @@ static SigHandler *FDECL(setsighandler,(
 # define NEED_sigaction
 #endif
 
-static SigHandler *setsighandler(sig, func)
-    int sig;
-    SigHandler *func;
+static SigHandler *setsighandler(int sig, SigHandler *func)
 {
     if (!sig) return NULL;
 #ifndef NEED_sigaction
@@ -198,7 +196,7 @@ void init_signals()
 }
 
 #ifndef SIG_IGN
-static RETSIG SIG_IGN(sig)
+static void SIG_IGN(sig)
     int sig;
 {
     setsighandler(sig, SIG_IGN);  /* restore handler (POSIX) */
@@ -248,7 +246,7 @@ int suspend()
 }
 
 
-static RETSIG core_handler(sig)
+static void core_handler(sig)
     int sig;
 {
     setsighandler(sig, core_handler);  /* restore handler (POSIX) */
@@ -351,7 +349,7 @@ static void terminate(sig)
     raise(sig);
 }
 
-static RETSIG signal_scheduler(sig)
+static void signal_scheduler(sig)
     int sig;
 {
     setsighandler(sig, signal_scheduler);  /* restore handler (POSIX) */
--- a/src/socket.c
+++ b/src/socket.c
@@ -578,20 +578,17 @@ void main_loop()
         while (hsock) nukesock(hsock);
 }
 
-int is_active(fd)
-    int fd;
+int is_active(int fd)
 {
     return FD_ISSET(fd, &active);
 }
 
-void readers_clear(fd)
-    int fd;
+void readers_clear(int fd)
 {
     FD_CLR(fd, &readers);
 }
 
-void readers_set(fd)
-    int fd;
+void readers_set(int fd)
 {
     FD_SET(fd, &readers);
     if (fd >= nfds) nfds = fd + 1;
@@ -619,8 +616,7 @@ World *xworld()
     return xsock ? xsock->world : NULL;
 }
 
-TIME_T sockidle(name, dir)
-    CONST char *name;
+TIME_T sockidle(CONST char *name, int dir)
 {
     Sock *sock;
     sock = *name ? find_sock(name) : xsock;
@@ -898,8 +894,7 @@ int opensock(world, autologin, quietlogi
     }
 }
 
-static int openconn(sock)
-    Sock *sock;
+static int openconn(Sock *sock)
 {
     int flags, err = 0;
 
@@ -1021,12 +1016,7 @@ static int openconn(sock)
  * Returns -1 for failure, 0 for success, or a positive file descriptor
  * connected to a pending name lookup process or thread.
  */
-static int get_host_address(name, sin_addr, pidp, what, errp)
-    CONST char *name;
-    struct in_addr *sin_addr;
-    long *pidp;
-    CONST char **what;
-    int *errp;
+static int get_host_address(CONST char *name, struct in_addr *sin_addr, long *pidp, CONST char **what, int *errp)
 {
 #ifndef dgux
     /* Most versions of inet_addr() return a long. */
@@ -1050,10 +1040,7 @@ static int get_host_address(name, sin_ad
 
 #ifndef NO_NETDB
 
-static int blocking_gethost(name, sin_addr, errp)
-    CONST char *name;
-    struct in_addr *sin_addr;
-    int *errp;
+static int blocking_gethost(CONST char *name, struct in_addr *sin_addr, int *errp)
 {
     struct hostent *host;
 
@@ -1067,9 +1054,7 @@ static int blocking_gethost(name, sin_ad
 }
 
 #ifdef NONBLOCKING_GETHOST
-static void waitforhostname(fd, name)
-    int fd;
-    CONST char *name;
+static void waitforhostname(int fd, CONST char *name)
 {
     struct hostent *host;
     int err;
@@ -1533,10 +1518,7 @@ static int transmit(str, numtowrite)
  * but if the user types it, we send it regardless of BINARY mode.  Some
  * servers accept it, some strip the high bit, some ignore the characters.
  */
-int send_line(src, len, eol_flag)
-    CONST char *src;
-    unsigned int len;
-    int eol_flag;
+int send_line(CONST char *src, unsigned int len, int eol_flag)
 {
     int result;
     int i = 0, j = 0;
--- a/src/tfio.c
+++ b/src/tfio.c
@@ -69,6 +69,7 @@ static int max_fileid = 0;
 static void FDECL(fileputs,(CONST char *str, FILE *fp));
 static void FDECL(queueputa,(Aline *aline, TFILE *file));
 
+extern void main_loop();
 
 void init_tfio()
 {
--- a/src/regexp/regexp.c
+++ b/src/regexp/regexp.c
@@ -46,6 +46,8 @@
 #include <stdio.h>
 #include <regexp.h>
 #include "regmagic.h"
+#include <stdlib.h>
+#include <string.h>
 
 /*
  * The "internal use only" fields in regexp.h are present to pass info from
@@ -177,16 +179,16 @@ static long regsize;		/* Code size. */
 #ifndef STATIC
 #define	STATIC	static
 #endif
-STATIC char *reg();
-STATIC char *regbranch();
-STATIC char *regpiece();
-STATIC char *regatom();
-STATIC char *regnode();
-STATIC char *regnext();
-STATIC void regc();
-STATIC void reginsert();
-STATIC void regtail();
-STATIC void regoptail();
+STATIC char *reg(int paren, int *flagp);
+STATIC char *regbranch(int *flagp);
+STATIC char *regpiece(int *flagp);
+STATIC char *regatom(int *flagp);
+STATIC char *regnode(char op);
+STATIC char *regnext(register char *p);
+STATIC void regc(char c);
+STATIC void reginsert(char op, char *opnd);
+STATIC void regtail(char *p, char *val);
+STATIC void regoptail(char *p, char *val);
 #ifdef STRCSPN
 STATIC int strcspn();
 #endif
@@ -207,15 +209,13 @@ STATIC int strcspn();
  * of the structure of the compiled regexp.
  */
 regexp *
-regcomp(exp)
-char *exp;
+regcomp(char *exp)
 {
 	register regexp *r;
 	register char *scan;
 	register char *longest;
 	register int len;
 	int flags;
-	extern char *malloc();
 
 	if (exp == NULL)
 		FAIL("NULL argument");
@@ -295,9 +295,7 @@ char *exp;
  * follows makes it hard to avoid.
  */
 static char *
-reg(paren, flagp)
-int paren;			/* Parenthesized? */
-int *flagp;
+reg(int paren, int *flagp)
 {
 	register char *ret;
 	register char *br;
@@ -367,8 +365,7 @@ int *flagp;
  * Implements the concatenation operator.
  */
 static char *
-regbranch(flagp)
-int *flagp;
+regbranch(int *flagp)
 {
 	register char *ret;
 	register char *chain;
@@ -406,8 +403,7 @@ int *flagp;
  * endmarker role is not redundant.
  */
 static char *
-regpiece(flagp)
-int *flagp;
+regpiece(int *flagp)
 {
 	register char *ret;
 	register char op;
@@ -470,8 +466,7 @@ int *flagp;
  * separate node; the code is simpler that way and it's not worth fixing.
  */
 static char *
-regatom(flagp)
-int *flagp;
+regatom(int *flagp)
 {
 	register char *ret;
 	int flags;
@@ -579,8 +574,7 @@ int *flagp;
  - regnode - emit a node
  */
 static char *			/* Location. */
-regnode(op)
-char op;
+regnode(char op)
 {
 	register char *ret;
 	register char *ptr;
@@ -604,8 +598,7 @@ char op;
  - regc - emit (if appropriate) a byte of code
  */
 static void
-regc(b)
-char b;
+regc(char b)
 {
 	if (regcode != &regdummy)
 		*regcode++ = b;
@@ -619,9 +612,7 @@ char b;
  * Means relocating the operand.
  */
 static void
-reginsert(op, opnd)
-char op;
-char *opnd;
+reginsert(char op, char *opnd)
 {
 	register char *src;
 	register char *dst;
@@ -648,9 +639,7 @@ char *opnd;
  - regtail - set the next-pointer at the end of a node chain
  */
 static void
-regtail(p, val)
-char *p;
-char *val;
+regtail(char *p, char *val)
 {
 	register char *scan;
 	register char *temp;
@@ -680,9 +669,7 @@ char *val;
  - regoptail - regtail on operand of first argument; nop if operandless
  */
 static void
-regoptail(p, val)
-char *p;
-char *val;
+regoptail(char *p, char *val)
 {
 	/* "Operandless" and "op != BRANCH" are synonymous in practice. */
 	if (p == NULL || p == &regdummy || OP(p) != BRANCH)
@@ -705,14 +692,14 @@ static char **regendp;		/* Ditto for end
 /*
  * Forwards.
  */
-STATIC int regtry();
-STATIC int regmatch();
-STATIC int regrepeat();
+STATIC int regtry(regexp *prog, char *string);
+STATIC int regmatch(char *prog);
+STATIC int regrepeat(char *p);
 
 #ifdef DEBUG
 int regnarrate = 0;
-void regdump();
-STATIC char *regprop();
+void regdump(regexp *r);
+STATIC char *regprop(char *op);
 #endif
 
 /*
@@ -724,7 +711,6 @@ register regexp *prog;
 register char *string;
 {
 	register char *s;
-	extern char *strchr();
 
 	/* Be paranoid... */
 	if (prog == NULL || string == NULL) {
@@ -781,9 +767,7 @@ register char *string;
  - regtry - try match at specific point
  */
 static int			/* 0 failure, 1 success */
-regtry(prog, string)
-regexp *prog;
-char *string;
+regtry(regexp *prog, char *string)
 {
 	register int i;
 	register char **sp;
@@ -818,12 +802,10 @@ char *string;
  * by recursion.
  */
 static int			/* 0 failure, 1 success */
-regmatch(prog)
-char *prog;
+regmatch(char *prog)
 {
 	register char *scan;	/* Current node. */
 	char *next;		/* Next node. */
-	extern char *strchr();
 
 	scan = prog;
 #ifdef DEBUG
@@ -1006,13 +988,11 @@ char *prog;
  - regrepeat - repeatedly match something simple, report how many
  */
 static int
-regrepeat(p)
-char *p;
+regrepeat(char *p)
 {
 	register int count = 0;
 	register char *scan;
 	register char *opnd;
-	extern char *strchr();   /* missing declaration added by ksk */
 
 	scan = reginput;
 	opnd = OPERAND(p);
@@ -1053,8 +1033,7 @@ char *p;
  - regnext - dig the "next" pointer out of a node
  */
 static char *
-regnext(p)
-register char *p;
+regnext(register char *p)
 {
 	register int offset;
 
@@ -1073,19 +1052,17 @@ register char *p;
 
 #ifdef DEBUG
 
-STATIC char *regprop();
+STATIC char *regprop(char *op);
 
 /*
  - regdump - dump a regexp onto stdout in vaguely comprehensible form
  */
 void
-regdump(r)
-regexp *r;
+regdump(regexp *r)
 {
 	register char *s;
 	register char op = EXACTLY;	/* Arbitrary non-END op. */
 	register char *next;
-	extern char *strchr();
 
 
 	s = r->program + 1;
@@ -1123,8 +1100,7 @@ regexp *r;
  - regprop - printable representation of opcode
  */
 static char *
-regprop(op)
-char *op;
+regprop(char *op)
 {
 	register char *p;
 	static char buf[50];
