I made telnet use C23 compatible prototypes so now it can be built
using 'gcc -std=c23', for example.

With an exception for some Kerberos 4 stuff, which I cannot test. I
assume the plan is still to remove that as mentioned in TODO?

Also I think that ./configure  --with-shishi is broken, or maybe it is
because I have a local install? In any case, I could test telnet
commands including encryption by modifying my 'config.site'.

    $ ./telnet/telnet 
    telnet> encrypt type ?
    Usage: encrypt type <type> [input|output]
    Valid encryption types:
        DES_CFB64 (1)
        DES_OFB64 (2)

Collin
From 380bbda03648b8f2f2b1590547d4afa4b40152af Mon Sep 17 00:00:00 2001
From: Collin Funk <collin.fu...@gmail.com>
Date: Fri, 10 May 2024 20:51:53 -0700
Subject: [PATCH] telnet: Make function declarations C23 compatible.

* NEWS: Mention C23 support.
* telnet/commands.c (Sendlist, Togglelist, Setlist, ModeList, SlcList)
(EnvList): Replace '0' pointers with NULL.
(struct authlist, struct encryptlist): Add types to function
prototypes.
(AuthList, EncryptList): Cast some function pointers. Replace '0'
pointers with NULL.
(auth_cmd, encrypt_cmd): Fix number of arguments passed to functions.
---
 NEWS              |   3 +
 telnet/commands.c | 200 +++++++++++++++++++++++-----------------------
 2 files changed, 104 insertions(+), 99 deletions(-)

diff --git a/NEWS b/NEWS
index 9f546c3b..99d570e1 100644
--- a/NEWS
+++ b/NEWS
@@ -17,6 +17,9 @@ correctly handle a prefix length of 0.
 when using the --format or --short option. More details in
 <https://lists.gnu.org/archive/html/bug-inetutils/2024-05/msg00020.html>.
 
+** Inetutils can now be built with C23 compilers.
+Except for when configured to support Kerberos 4.
+
 * Noteworthy changes in release 2.5 (2023-12-29) [stable]
 
 ** ftpd, rcp, rlogin, rsh, rshd, uucpd
diff --git a/telnet/commands.c b/telnet/commands.c
index 01f5b27b..610e4b6c 100644
--- a/telnet/commands.c
+++ b/telnet/commands.c
@@ -316,32 +316,32 @@ static int send_wontcmd (const char *);
 static int send_help (const char *);
 
 static struct sendlist Sendlist[] = {
-  {"ao", "Send Telnet Abort output", 1, 0, 0, 2, AO},
-  {"ayt", "Send Telnet 'Are You There'", 1, 0, 0, 2, AYT},
-  {"brk", "Send Telnet Break", 1, 0, 0, 2, BREAK},
-  {"break", 0, 1, 0, 0, 2, BREAK},
-  {"ec", "Send Telnet Erase Character", 1, 0, 0, 2, EC},
-  {"el", "Send Telnet Erase Line", 1, 0, 0, 2, EL},
+  {"ao", "Send Telnet Abort output", 1, 0, NULL, 2, AO},
+  {"ayt", "Send Telnet 'Are You There'", 1, 0, NULL, 2, AYT},
+  {"brk", "Send Telnet Break", 1, 0, NULL, 2, BREAK},
+  {"break", NULL, 1, 0, NULL, 2, BREAK},
+  {"ec", "Send Telnet Erase Character", 1, 0, NULL, 2, EC},
+  {"el", "Send Telnet Erase Line", 1, 0, NULL, 2, EL},
   {"escape", "Send current escape character", 1, 0, send_esc, 1, 0},
-  {"ga", "Send Telnet 'Go Ahead' sequence", 1, 0, 0, 2, GA},
-  {"ip", "Send Telnet Interrupt Process", 1, 0, 0, 2, IP},
-  {"intp", 0, 1, 0, 0, 2, IP},
-  {"interrupt", 0, 1, 0, 0, 2, IP},
-  {"intr", 0, 1, 0, 0, 2, IP},
-  {"nop", "Send Telnet 'No operation'", 1, 0, 0, 2, NOP},
-  {"eor", "Send Telnet 'End of Record'", 1, 0, 0, 2, EOR},
-  {"abort", "Send Telnet 'Abort Process'", 1, 0, 0, 2, ABORT},
-  {"susp", "Send Telnet 'Suspend Process'", 1, 0, 0, 2, SUSP},
-  {"eof", "Send Telnet End of File Character", 1, 0, 0, 2, xEOF},
+  {"ga", "Send Telnet 'Go Ahead' sequence", 1, 0, NULL, 2, GA},
+  {"ip", "Send Telnet Interrupt Process", 1, 0, NULL, 2, IP},
+  {"intp", NULL, 1, 0, NULL, 2, IP},
+  {"interrupt", NULL, 1, 0, NULL, 2, IP},
+  {"intr", NULL, 1, 0, 0, 2, IP},
+  {"nop", "Send Telnet 'No operation'", 1, 0, NULL, 2, NOP},
+  {"eor", "Send Telnet 'End of Record'", 1, 0, NULL, 2, EOR},
+  {"abort", "Send Telnet 'Abort Process'", 1, 0, NULL, 2, ABORT},
+  {"susp", "Send Telnet 'Suspend Process'", 1, 0, NULL, 2, SUSP},
+  {"eof", "Send Telnet End of File Character", 1, 0, NULL, 2, xEOF},
   {"synch", "Perform Telnet 'Synch operation'", 1, 0, dosynch, 2, 0},
   {"getstatus", "Send request for STATUS", 1, 0, get_status, 6, 0},
   {"?", "Display send options", 0, 0, send_help, 0, 0},
-  {"help", 0, 0, 0, send_help, 0, 0},
-  {"do", 0, 0, 1, send_docmd, 3, 0},
-  {"dont", 0, 0, 1, send_dontcmd, 3, 0},
-  {"will", 0, 0, 1, send_willcmd, 3, 0},
-  {"wont", 0, 0, 1, send_wontcmd, 3, 0},
-  {NULL, 0, 0, 0, NULL, 0, 0}
+  {"help", NULL, 0, 0, send_help, 0, 0},
+  {"do", NULL, 0, 1, send_docmd, 3, 0},
+  {"dont", NULL, 0, 1, send_dontcmd, 3, 0},
+  {"will", NULL, 0, 1, send_willcmd, 3, 0},
+  {"wont", NULL, 0, 1, send_wontcmd, 3, 0},
+  {NULL, NULL, 0, 0, NULL, 0, 0}
 };
 
 #define GETSEND(name) ((struct sendlist *) genget(name, (char **) Sendlist, \
@@ -758,76 +758,76 @@ struct togglelist
 static struct togglelist Togglelist[] = {
   {"autoflush",
    "flushing of output when sending interrupt characters",
-   0,
+   NULL,
    &autoflush,
    "flush output when sending interrupt characters"},
   {"autosynch",
    "automatic sending of interrupt characters in urgent mode",
-   0,
+   NULL,
    &autosynch,
    "send interrupt characters in urgent mode"},
 #if defined AUTHENTICATION
   {"autologin",
    "automatic sending of login and/or authentication info",
-   0,
+   NULL,
    &autologin,
    "send login name and/or authentication information"},
   {"authdebug",
    "Toggle authentication debugging",
    auth_togdebug,
-   0,
+   NULL,
    "print authentication debugging information"},
 #endif
 #ifdef	ENCRYPTION
   {"autoencrypt",
    "automatic encryption of data stream",
    EncryptAutoEnc,
-   0,
+   NULL,
    "automatically encrypt output"},
   {"autodecrypt",
    "automatic decryption of data stream",
    EncryptAutoDec,
-   0,
+   NULL,
    "automatically decrypt input"},
   {"verbose_encrypt",
    "Toggle verbose encryption output",
    EncryptVerbose,
-   0,
+   NULL,
    "print verbose encryption output"},
   {"encdebug",
    "Toggle encryption debugging",
    EncryptDebug,
-   0,
+   NULL,
    "print encryption debugging information"},
 #endif /* ENCRYPTION */
   {"skiprc",
    "don't read ~/.telnetrc file",
-   0,
+   NULL,
    &skiprc,
    "skip reading of ~/.telnetrc file"},
   {"binary",
    "sending and receiving of binary data",
    togbinary,
-   0,
-   0},
+   NULL,
+   NULL},
   {"inbinary",
    "receiving of binary data",
    togrbinary,
-   0,
-   0},
+   NULL,
+   NULL},
   {"outbinary",
    "sending of binary data",
    togxbinary,
-   0,
-   0},
+   NULL,
+   NULL},
   {"crlf",
    "sending carriage returns as telnet <CR><LF>",
    togcrlf,
    &crlf,
-   0},
+   NULL},
   {"crmod",
    "mapping of received carriage returns",
-   0,
+   NULL,
    &crmod,
    "map carriage return on output"},
   {"localchars",
@@ -835,16 +835,16 @@ static struct togglelist Togglelist[] = {
    lclchars,
    &localchars,
    "recognize certain control characters"},
-  {" ", "", 0, NULL, NULL},	/* empty line */
+  {" ", "", NULL, NULL, NULL},	/* empty line */
 #if (defined unix || defined __unix || defined __unix__) && defined TN3270
   {"apitrace",
    "(debugging) toggle tracing of API transactions",
-   0,
+   NULL,
    &apitrace,
    "trace API transactions"},
   {"cursesdata",
    "(debugging) toggle printing of hexadecimal curses data",
-   0,
+   NULL,
    &cursesdata,
    "print hexadecimal representation of curses data"},
 #endif /* (unix || __unix || __unix__)) && TN3270 */
@@ -855,31 +855,31 @@ static struct togglelist Togglelist[] = {
    "turn on socket level debugging"},
   {"netdata",
    "printing of hexadecimal network data (debugging)",
-   0,
+   NULL,
    &netdata,
    "print hexadecimal representation of network traffic"},
   {"prettydump",
    "output of \"netdata\" to user readable format (debugging)",
-   0,
+   NULL,
    &prettydump,
    "print user readable output for \"netdata\""},
   {"options",
    "viewing of options processing (debugging)",
-   0,
+   NULL,
    &showoptions,
    "show option processing"},
   {"termdata",
    "(debugging) toggle printing of hexadecimal terminal data",
-   0,
+   NULL,
    &termdata,
    "print hexadecimal representation of terminal traffic"},
   {"?",
-   0,
+   NULL,
    togglehelp, NULL, NULL},
   {"help",
-   0,
+   NULL,
    togglehelp, NULL, NULL},
-  {NULL, NULL, 0, NULL, NULL}
+  {NULL, NULL, NULL, NULL, NULL}
 };
 
 static int
@@ -992,32 +992,34 @@ struct setlist
 
 static struct setlist Setlist[] = {
 #ifdef	KLUDGELINEMODE
-  {"echo", "character to toggle local echoing on/off", 0, &echoc},
+  {"echo", "character to toggle local echoing on/off", NULL, &echoc},
 #endif
-  {"escape", "character to escape back to telnet command mode", 0, &escape},
-  {"rlogin", "rlogin escape character", 0, &rlogin},
+  {"escape", "character to escape back to telnet command mode", NULL,
+   &escape},
+  {"rlogin", "rlogin escape character", NULL, &rlogin},
   {"tracefile", "file to write trace information to", SetNetTrace,
    (cc_t *) NetTraceFile},
-  {" ", "", 0, NULL},
-  {" ", "The following need 'localchars' to be toggled true", 0, 0},
-  {"flushoutput", "character to cause an Abort Output", 0, termFlushCharp},
-  {"interrupt", "character to cause an Interrupt Process", 0, termIntCharp},
-  {"quit", "character to cause an Abort process", 0, termQuitCharp},
-  {"eof", "character to cause an EOF ", 0, termEofCharp},
-  {" ", "", 0, NULL},
-  {" ", "The following are for local editing in linemode", 0, 0},
-  {"erase", "character to use to erase a character", 0, termEraseCharp},
-  {"kill", "character to use to erase a line", 0, termKillCharp},
-  {"lnext", "character to use for literal next", 0, termLiteralNextCharp},
-  {"susp", "character to cause a Suspend Process", 0, termSuspCharp},
-  {"reprint", "character to use for line reprint", 0, termRprntCharp},
-  {"worderase", "character to use to erase a word", 0, termWerasCharp},
-  {"start", "character to use for XON", 0, termStartCharp},
-  {"stop", "character to use for XOFF", 0, termStopCharp},
-  {"forw1", "alternate end of line character", 0, termForw1Charp},
-  {"forw2", "alternate end of line character", 0, termForw2Charp},
-  {"ayt", "alternate AYT character", 0, termAytCharp},
-  {NULL, NULL, 0, NULL}
+  {" ", "", NULL, NULL},
+  {" ", "The following need 'localchars' to be toggled true", NULL, NULL},
+  {"flushoutput", "character to cause an Abort Output", NULL, termFlushCharp},
+  {"interrupt", "character to cause an Interrupt Process", NULL,
+   termIntCharp},
+  {"quit", "character to cause an Abort process", NULL, termQuitCharp},
+  {"eof", "character to cause an EOF ", NULL, termEofCharp},
+  {" ", "", NULL, NULL},
+  {" ", "The following are for local editing in linemode", NULL, NULL},
+  {"erase", "character to use to erase a character", NULL, termEraseCharp},
+  {"kill", "character to use to erase a line", NULL, termKillCharp},
+  {"lnext", "character to use for literal next", NULL, termLiteralNextCharp},
+  {"susp", "character to cause a Suspend Process", NULL, termSuspCharp},
+  {"reprint", "character to use for line reprint", NULL, termRprntCharp},
+  {"worderase", "character to use to erase a word", NULL, termWerasCharp},
+  {"start", "character to use for XON", NULL, termStartCharp},
+  {"stop", "character to use for XOFF", NULL, termStopCharp},
+  {"forw1", "alternate end of line character", NULL, termForw1Charp},
+  {"forw2", "alternate end of line character", NULL, termForw2Charp},
+  {"ayt", "alternate AYT character", NULL, termAytCharp},
+  {NULL, NULL, NULL, NULL}
 };
 
 #if defined CRAY && !defined __STDC__
@@ -1352,21 +1354,21 @@ static struct modelist ModeList[] = {
   {"", "", NULL, 0, 0},
   {"", "These require the LINEMODE option to be enabled", NULL, 0, 0},
   {"isig", "Enable signal trapping", set_mode, 1, MODE_TRAPSIG},
-  {"+isig", 0, set_mode, 1, MODE_TRAPSIG},
+  {"+isig", NULL, set_mode, 1, MODE_TRAPSIG},
   {"-isig", "Disable signal trapping", clear_mode, 1, MODE_TRAPSIG},
   {"edit", "Enable character editing", set_mode, 1, MODE_EDIT},
-  {"+edit", 0, set_mode, 1, MODE_EDIT},
+  {"+edit", NULL, set_mode, 1, MODE_EDIT},
   {"-edit", "Disable character editing", clear_mode, 1, MODE_EDIT},
   {"softtabs", "Enable tab expansion", set_mode, 1, MODE_SOFT_TAB},
-  {"+softtabs", 0, set_mode, 1, MODE_SOFT_TAB},
+  {"+softtabs", NULL, set_mode, 1, MODE_SOFT_TAB},
   {"-softtabs", "Disable character editing", clear_mode, 1, MODE_SOFT_TAB},
   {"litecho", "Enable literal character echo", set_mode, 1, MODE_LIT_ECHO},
-  {"+litecho", 0, set_mode, 1, MODE_LIT_ECHO},
+  {"+litecho", NULL, set_mode, 1, MODE_LIT_ECHO},
   {"-litecho", "Disable literal character echo", clear_mode, 1,
    MODE_LIT_ECHO},
-  {"help", 0, modehelp, 0, 0},
+  {"help", NULL, modehelp, 0, 0},
 #ifdef	KLUDGELINEMODE
-  {"kludgeline", 0, dokludgemode, 1, 0},
+  {"kludgeline", NULL, dokludgemode, 1, 0},
 #endif
   {"", "", NULL, 0, 0},
   {"?", "Print help information", modehelp, 0, 0},
@@ -1703,7 +1705,7 @@ struct slclist SlcList[] = {
    slc_mode_import, 1},
   {"check", "Verify remote special character definitions",
    slc_mode_import, 0},
-  {"help", 0, slc_help, 0},
+  {"help", NULL, slc_help, 0},
   {"?", "Print help information", slc_help, 0},
   {NULL, NULL, NULL, 0},
 };
@@ -1789,7 +1791,7 @@ struct envlist EnvList[] = {
   {"varval", "Reverse VAR and VALUE (auto, right, wrong, status)",
    env_varval, 1},
 #endif
-  {"help", 0, env_help, 0},
+  {"help", NULL, env_help, 0},
   {"?", "Print help information", env_help, 0},
   {NULL, NULL, NULL, 0},
 };
@@ -2116,7 +2118,7 @@ struct authlist
 {
   const char *name;
   char *help;
-  int (*handler) ();
+  int (*handler) (char *);
   int narg;
 };
 
@@ -2125,13 +2127,13 @@ static int auth_help (void);
 
 struct authlist AuthList[] = {
   {"status", "Display current status of authentication information",
-   auth_status, 0},
+   (int (*)(char *)) auth_status, 0},
   {"disable", "Disable an authentication type ('auth disable ?' for more)",
    auth_disable, 1},
   {"enable", "Enable an authentication type ('auth enable ?' for more)",
    auth_enable, 1},
-  {"help", 0, auth_help, 0},
-  {"?", "Print help information", auth_help, 0},
+  {"help", NULL, (int (*)(char *)) auth_help, 0},
+  {"?", "Print help information", (int (*)(char *)) auth_help, 0},
   {NULL, NULL, NULL, 0},
 };
 
@@ -2167,7 +2169,7 @@ auth_cmd (int argc, char *argv[])
 
   c = (struct authlist *)
     genget (argv[1], (char **) AuthList, sizeof (struct authlist));
-  if (c == 0)
+  if (c == NULL)
     {
       fprintf (stderr, "'%s': unknown argument ('auth ?' for help).\n",
 	       argv[1]);
@@ -2187,7 +2189,7 @@ auth_cmd (int argc, char *argv[])
 	       c->narg, c->narg == 1 ? "" : "s", c->name);
       return 0;
     }
-  return ((*c->handler) (argv[2], argv[3]));
+  return (*c->handler) (argv[2]);
 }
 #endif
 
@@ -2200,7 +2202,7 @@ struct encryptlist
 {
   const char *name;
   const char *help;
-  int (*handler) ();
+  int (*handler) (char *, char *);
   int needconnect;
   int minarg;
   int maxarg;
@@ -2225,22 +2227,23 @@ struct encryptlist EncryptList[] = {
   {"type", "Set encryption type. ('encrypt type ?' for more)",
    EncryptType, 0, 1, 1},
   {"start", "Start encryption. ('encrypt start ?' for more)",
-   EncryptStart, 1, 0, 1},
+   (int (*)(char *, char *)) EncryptStart, 1, 0, 1},
   {"stop", "Stop encryption. ('encrypt stop ?' for more)",
-   EncryptStop, 1, 0, 1},
+   (int (*)(char *, char *)) EncryptStop, 1, 0, 1},
   {"input", "Start encrypting the input stream",
-   EncryptStartInput, 1, 0, 0},
+   (int (*)(char *, char *)) EncryptStartInput, 1, 0, 0},
   {"-input", "Stop encrypting the input stream",
-   EncryptStopInput, 1, 0, 0},
+   (int (*)(char *, char *)) EncryptStopInput, 1, 0, 0},
   {"output", "Start encrypting the output stream",
-   EncryptStartOutput, 1, 0, 0},
+   (int (*)(char *, char *)) EncryptStartOutput, 1, 0, 0},
   {"-output", "Stop encrypting the output stream",
-   EncryptStopOutput, 1, 0, 0},
+   (int (*)(char *, char *)) EncryptStopOutput, 1, 0, 0},
 
   {"status", "Display current status of authentication information",
-   EncryptStatus, 0, 0, 0},
-  {"help", 0, EncryptHelp, 0, 0, 0},
-  {"?", "Print help information", EncryptHelp, 0, 0, 0},
+   (int (*)(char *, char *)) EncryptStatus, 0, 0, 0},
+  {"help", 0, (int (*)(char *, char *)) EncryptHelp, 0, 0, 0},
+  {"?", "Print help information", (int (*)(char *, char *)) EncryptHelp, 0, 0,
+   0},
   {NULL, NULL, NULL, 0, 0, 0},
 };
 
@@ -2276,7 +2279,7 @@ encrypt_cmd (int argc, char *argv[])
 
   c = (struct encryptlist *)
     genget (argv[1], (char **) EncryptList, sizeof (struct encryptlist));
-  if (c == 0)
+  if (c == NULL)
     {
       fprintf (stderr, "'%s': unknown argument ('encrypt ?' for help).\n",
 	       argv[1]);
@@ -2314,8 +2317,7 @@ encrypt_cmd (int argc, char *argv[])
 	  return 0;
 	}
     }
-  return ((*c->handler) (argc > 0 ? argv[2] : 0,
-			 argc > 1 ? argv[3] : 0, argc > 2 ? argv[4] : 0));
+  return (*c->handler) (argc > 0 ? argv[2] : NULL, argc > 1 ? argv[3] : NULL);
 }
 #endif /* ENCRYPTION */
 
-- 
2.45.0

  • telnet: Mak... Collin Funk
    • Re: te... Simon Josefsson via Bug reports for the GNU Internet utilities

Reply via email to