aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Nieuwenhuizen <janneke@gnu.org>2020-03-07 11:12:15 -0500
committerJan Nieuwenhuizen <janneke@gnu.org>2020-03-26 12:59:34 +0100
commit3d3ca76f1cde964aa61433cdd40dd701c39e60e7 (patch)
tree9a66a5434e01e398d05645d85e02eed7e35eaa94
parentc0a5cd1be3fce740c634596959321a76f22623a9 (diff)
downloadguix-3d3ca76f1cde964aa61433cdd40dd701c39e60e7.tar
guix-3d3ca76f1cde964aa61433cdd40dd701c39e60e7.tar.gz
gnu: inetutils: Support for the Hurd.
* gnu/packages/linux.scm (net-tools)[supported-systems]: Remove the Hurd. * gnu/packages/patches/inetutils-hurd.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/admin.scm (inetutils): Use it. Disable some features on the Hurd. [native-inputs]: Include net-tools only on supported systems
-rw-r--r--gnu/local.mk1
-rw-r--r--gnu/packages/admin.scm17
-rw-r--r--gnu/packages/linux.scm1
-rw-r--r--gnu/packages/patches/inetutils-hurd.patch583
4 files changed, 601 insertions, 1 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index 0ff248fe70..9e4ce6ce92 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1052,6 +1052,7 @@ dist_patch_DATA = \
%D%/packages/patches/id3lib-UTF16-writing-bug.patch \
%D%/packages/patches/ilmbase-fix-tests.patch \
%D%/packages/patches/ilmbase-openexr-pkg-config.patch \
+ %D%/packages/patches/inetutils-hurd.patch \
%D%/packages/patches/inkscape-poppler-0.76.patch \
%D%/packages/patches/intltool-perl-compatibility.patch \
%D%/packages/patches/irrlicht-use-system-libs.patch \
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index 4958d67b06..9662468b55 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -438,6 +438,7 @@ re-executing them as necessary.")
(method url-fetch)
(uri (string-append "mirror://gnu/inetutils/inetutils-"
version ".tar.gz"))
+ (patches (search-patches "inetutils-hurd.patch"))
(sha256
(base32
"05n65k4ixl85dc6rxc51b1b732gnmm8xnqi424dy9f1nz7ppb3xy"))))
@@ -449,13 +450,27 @@ re-executing them as necessary.")
;; cross-compiling (by default it does not.)
,@(if (%current-target-system)
'("--with-path-procnet-dev=/proc/net/dev")
+ '())
+ ,@(if (hurd-target?)
+ '("--disable-rcp"
+ "--disable-rexec"
+ "--disable-rexecd"
+ "--disable-rlogin"
+ "--disable-rlogind"
+ "--disable-rsh"
+ "--disable-rshd"
+ "--disable-uucpd"
+ "--disable-whois")
'()))
;; On some systems, 'libls.sh' may fail with an error such as:
;; "Failed to tell switch -a apart from -A".
#:parallel-tests? #f))
(inputs `(("ncurses" ,ncurses)
("readline" ,readline))) ;for 'ftp'
- (native-inputs `(("netstat" ,net-tools))) ;for tests
+ (native-inputs (if (member (%current-system)
+ (package-supported-systems net-tools))
+ `(("netstat" ,net-tools)) ;for tests
+ '()))
(home-page "https://www.gnu.org/software/inetutils/")
(synopsis "Basic networking utilities")
(description
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 3abfc469ba..1c157205d3 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -2031,6 +2031,7 @@ inadequately in modern network environments, and both should be deprecated.")
(string-append "mandir=/share/man")))))
(native-inputs `(("gettext" ,gettext-minimal)
("unzip" ,unzip)))
+ (supported-systems (delete "i586-gnu" %supported-systems))
(synopsis "Tools for controlling the network subsystem in Linux")
(description
"This package includes the important tools for controlling the network
diff --git a/gnu/packages/patches/inetutils-hurd.patch b/gnu/packages/patches/inetutils-hurd.patch
new file mode 100644
index 0000000000..bd65c4feb1
--- /dev/null
+++ b/gnu/packages/patches/inetutils-hurd.patch
@@ -0,0 +1,583 @@
+Support compiling on the Hurd.
+
+Taken from https://git.hadrons.org/cgit/debian/pkgs/inetutils.git/tree/debian/patches/0002-ifconfig-Improve-the-support-for-GNU-Hurd.patch
+
+From 9a90d9b9119906df23cb2db1503cb0f099942dd9 Mon Sep 17 00:00:00 2001
+From: Mats Erik Andersson <gnu@gisladisker.se>
+Date: Sat, 18 Jul 2015 01:12:41 +0200
+Subject: [PATCH 02/35] ifconfig: Improve the support for GNU/Hurd.
+
+Use system specific code instead of generic code.
+This provides abilities similar to other systems.
+---
+ ChangeLog | 17 +++
+ ifconfig/system.c | 10 +-
+ ifconfig/system.h | 2 +
+ ifconfig/system/Makefile.am | 4 +-
+ ifconfig/system/generic.c | 14 +-
+ ifconfig/system/hurd.c | 292 ++++++++++++++++++++++++++++++++++++
+ ifconfig/system/hurd.h | 50 ++++++
+ 7 files changed, 381 insertions(+), 8 deletions(-)
+ create mode 100644 ifconfig/system/hurd.c
+ create mode 100644 ifconfig/system/hurd.h
+
+diff --git a/ifconfig/system.c b/ifconfig/system.c
+index 30677e41..e108dc2e 100644
+--- a/ifconfig/system.c
++++ b/ifconfig/system.c
+@@ -25,10 +25,12 @@
+ # include "system/solaris.c"
+ #elif defined __QNX__
+ # include "system/qnx.c"
+-# elif defined __DragonFly__ || defined __FreeBSD__ || \
+- defined __FreeBSD_kernel__ || \
+- defined __NetBSD__ || defined __OpenBSD__
+-# include "system/bsd.c"
++#elif defined __DragonFly__ || defined __FreeBSD__ || \
++ defined __FreeBSD_kernel__ || \
++ defined __NetBSD__ || defined __OpenBSD__
++# include "system/bsd.c"
++#elif defined __GNU__
++# include "system/hurd.c"
+ #else
+ # include "system/generic.c"
+ #endif
+diff --git a/ifconfig/system.h b/ifconfig/system.h
+index 8521ad95..66878d3a 100644
+--- a/ifconfig/system.h
++++ b/ifconfig/system.h
+@@ -97,6 +97,8 @@ extern struct if_nameindex* (*system_if_nameindex) (void);
+ defined __FreeBSD_kernel__ || \
+ defined __NetBSD__ || defined __OpenBSD__
+ # include "system/bsd.h"
++# elif defined __GNU__
++# include "system/hurd.h"
+ # else
+ # include "system/generic.h"
+ # endif
+diff --git a/ifconfig/system/Makefile.am b/ifconfig/system/Makefile.am
+index 954c6774..62a9f1c4 100644
+--- a/ifconfig/system/Makefile.am
++++ b/ifconfig/system/Makefile.am
+@@ -26,8 +26,10 @@ noinst_HEADERS = \
+ linux.h \
+ solaris.h \
+ qnx.h \
++ hurd.h \
+ bsd.c \
+ generic.c \
+ linux.c \
+ solaris.c \
+- qnx.c
++ qnx.c \
++ hurd.c
+diff --git a/ifconfig/system/generic.c b/ifconfig/system/generic.c
+index 9a2bda55..20a78bde 100644
+--- a/ifconfig/system/generic.c
++++ b/ifconfig/system/generic.c
+@@ -22,6 +22,8 @@
+ #include <config.h>
+
+ #include "../ifconfig.h"
++
++#include <unused-parameter.h>
+
+
+ /* Output format stuff. */
+@@ -36,19 +38,25 @@ const char *system_help;
+ struct argp_child system_argp_child;
+
+ int
+-system_parse_opt (struct ifconfig **ifp, char option, char *optarg)
++system_parse_opt (struct ifconfig **ifp _GL_UNUSED_PARAMETER,
++ char option _GL_UNUSED_PARAMETER,
++ char *optarg _GL_UNUSED_PARAMETER)
+ {
+ return 0;
+ }
+
+ int
+-system_parse_opt_rest (struct ifconfig **ifp, int argc, char *argv[])
++system_parse_opt_rest (struct ifconfig **ifp _GL_UNUSED_PARAMETER,
++ int argc _GL_UNUSED_PARAMETER,
++ char *argv[] _GL_UNUSED_PARAMETER)
+ {
+ return 0;
+ }
+
+ int
+-system_configure (int sfd, struct ifreq *ifr, struct system_ifconfig *ifs)
++system_configure (int sfd _GL_UNUSED_PARAMETER,
++ struct ifreq *ifr _GL_UNUSED_PARAMETER,
++ struct system_ifconfig *ifs _GL_UNUSED_PARAMETER)
+ {
+ return 0;
+ }
+diff --git a/ifconfig/system/hurd.c b/ifconfig/system/hurd.c
+new file mode 100644
+index 00000000..3bd19775
+--- /dev/null
++++ b/ifconfig/system/hurd.c
+@@ -0,0 +1,292 @@
++/* hurd.c -- Code for ifconfig specific to GNU/Hurd.
++ Copyright (C) 2015 Free Software Foundation, Inc.
++
++ This file is part of GNU Inetutils.
++
++ GNU Inetutils is free software: you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation, either version 3 of the License, or (at
++ your option) any later version.
++
++ GNU Inetutils is distributed in the hope that it will be useful, but
++ WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program. If not, see `http://www.gnu.org/licenses/'. */
++
++/* Mostly written by Marcus Brinkmann.
++ Adaptions to GNU/Hurd by Mats Erik Andersson. */
++
++#include <config.h>
++
++#include <stdlib.h>
++#include <sys/ioctl.h>
++#include <net/if_arp.h>
++#include "../ifconfig.h"
++
++#include <unused-parameter.h>
++
++
++/* Output format stuff. */
++
++const char *system_default_format = "gnu";
++
++
++/* Argument parsing stuff. */
++
++const char *system_help = "NAME [ADDR]\
++ [broadcast BRDADDR] [netmask MASK]\
++ [mtu N] [up|down] [FLAGS]";
++
++struct argp_child system_argp_child;
++
++int
++system_parse_opt (struct ifconfig **ifp _GL_UNUSED_PARAMETER,
++ char option _GL_UNUSED_PARAMETER,
++ char *optarg _GL_UNUSED_PARAMETER)
++{
++ return 0;
++}
++
++int
++system_parse_opt_rest (struct ifconfig **ifp, int argc, char *argv[])
++{
++ int i = 0, mask, rev;
++ enum {
++ EXPECT_NOTHING,
++ EXPECT_AF,
++ EXPECT_BROADCAST,
++ EXPECT_NETMASK,
++ EXPECT_METRIC,
++ EXPECT_MTU
++ } expect = EXPECT_AF;
++
++ *ifp = parse_opt_new_ifs (argv[0]);
++
++ while (++i < argc)
++ {
++ switch (expect)
++ {
++ case EXPECT_BROADCAST:
++ parse_opt_set_brdaddr (*ifp, argv[i]);
++ break;
++
++ case EXPECT_NETMASK:
++ parse_opt_set_netmask (*ifp, argv[i]);
++ break;
++
++ case EXPECT_MTU:
++ parse_opt_set_mtu (*ifp, argv[i]);
++ break;
++
++ /* XXX: 2015-07-18, GNU/Hurd does not yet support
++ ioctl(SIOCSIFMETRIC), but we let the code
++ handle this standard ability anyway!
++ */
++ case EXPECT_METRIC:
++ parse_opt_set_metric (*ifp, argv[i]);
++ break;
++
++ case EXPECT_AF:
++ expect = EXPECT_NOTHING;
++ if (!strcmp (argv[i], "inet"))
++ continue;
++ else if (!strcmp (argv[i], "inet6"))
++ {
++ error (0, 0, "%s is not a supported address family", argv[i]);
++ return 0;
++ }
++ break;
++
++ case EXPECT_NOTHING:
++ break;
++ }
++
++ if (expect != EXPECT_NOTHING)
++ expect = EXPECT_NOTHING;
++ else if (!strcmp (argv[i], "broadcast"))
++ expect = EXPECT_BROADCAST;
++ else if (!strcmp (argv[i], "netmask"))
++ expect = EXPECT_NETMASK;
++ else if (!strcmp (argv[i], "metric"))
++ expect = EXPECT_METRIC;
++ else if (!strcmp (argv[i], "mtu"))
++ expect = EXPECT_MTU;
++ else if (!strcmp (argv[i], "up"))
++ parse_opt_set_flag (*ifp, IFF_UP | IFF_RUNNING, 0);
++ else if (!strcmp (argv[i], "down"))
++ parse_opt_set_flag (*ifp, IFF_UP, 1);
++ else if (((mask = if_nameztoflag (argv[i], &rev))
++ & ~IU_IFF_CANTCHANGE) != 0)
++ parse_opt_set_flag (*ifp, mask, rev);
++ else
++ {
++ if (!((*ifp)->valid & IF_VALID_ADDR))
++ parse_opt_set_address (*ifp, argv[i]);
++ else if (!((*ifp)->valid & IF_VALID_DSTADDR))
++ parse_opt_set_dstaddr (*ifp, argv[i]);
++ }
++ }
++
++ switch (expect)
++ {
++ case EXPECT_BROADCAST:
++ error (0, 0, "option `broadcast' requires an argument");
++ break;
++
++ case EXPECT_NETMASK:
++ error (0, 0, "option `netmask' requires an argument");
++ break;
++
++ case EXPECT_METRIC:
++ error (0, 0, "option `metric' requires an argument");
++ break;
++
++ case EXPECT_MTU:
++ error (0, 0, "option `mtu' requires an argument");
++ break;
++
++ case EXPECT_AF:
++ case EXPECT_NOTHING:
++ return 1;
++ }
++
++ return 0;
++}
++
++int
++system_configure (int sfd _GL_UNUSED_PARAMETER,
++ struct ifreq *ifr _GL_UNUSED_PARAMETER,
++ struct system_ifconfig *ifs _GL_UNUSED_PARAMETER)
++{
++ return 0;
++}
++
++struct if_nameindex* (*system_if_nameindex) (void) = if_nameindex;
++
++static void
++print_hwaddr_ether (format_data_t form _GL_UNUSED_PARAMETER,
++ unsigned char *data)
++{
++ *column += printf ("%02X:%02X:%02X:%02X:%02X:%02X",
++ data[0], data[1], data[2], data[3], data[4], data[5]);
++ had_output = 1;
++}
++
++struct arphrd_symbol
++{
++ const char *name;
++ const char *title;
++ int value;
++ void (*print_hwaddr) (format_data_t form, unsigned char *data);
++} arphrd_symbols[] =
++ {
++#ifdef ARPHRD_ETHER /* Ethernet 10/100Mbps. */
++ { "ETHER", "Ethernet", ARPHRD_ETHER, print_hwaddr_ether},
++#endif
++#ifdef ARPHRD_LOOPBACK /* Loopback device. */
++ { "LOOPBACK", "Local Loopback", ARPHRD_LOOPBACK, NULL},
++#endif
++ /* XXX: The image debian-hurd-20150424 returns the value 4
++ instead of expected ARPHRD_LOOPBACK. This has been
++ discussed in the list debian-hurd, where I was asked
++ to resist the temptation of a work around!
++ */
++ { NULL, NULL, 0, NULL}
++ };
++
++struct arphrd_symbol *
++arphrd_findvalue (int value)
++{
++ struct arphrd_symbol *arp = arphrd_symbols;
++ while (arp->name != NULL)
++ {
++ if (arp->value == value)
++ break;
++ arp++;
++ }
++ if (arp->name)
++ return arp;
++ else
++ return NULL;
++}
++
++void
++system_fh_hwaddr_query (format_data_t form, int argc, char *argv[])
++{
++#ifdef SIOCGIFHWADDR
++ struct arphrd_symbol *arp;
++
++ if (ioctl (form->sfd, SIOCGIFHWADDR, form->ifr) < 0)
++ select_arg (form, argc, argv, 1);
++
++ arp = arphrd_findvalue (form->ifr->ifr_hwaddr.sa_family);
++ select_arg (form, argc, argv, (arp && arp->print_hwaddr) ? 0 : 1);
++#else
++ select_arg (form, argc, argv, 1);
++#endif
++}
++
++void
++system_fh_hwaddr (format_data_t form, int argc _GL_UNUSED_PARAMETER,
++ char *argv[] _GL_UNUSED_PARAMETER)
++{
++#ifdef SIOCGIFHWADDR
++ if (ioctl (form->sfd, SIOCGIFHWADDR, form->ifr) < 0)
++ error (EXIT_FAILURE, errno,
++ "SIOCGIFHWADDR failed for interface `%s'",
++ form->ifr->ifr_name);
++ else
++ {
++ struct arphrd_symbol *arp;
++
++ arp = arphrd_findvalue (form->ifr->ifr_hwaddr.sa_family);
++ if (arp && arp->print_hwaddr)
++ arp->print_hwaddr (form,
++ (unsigned char *) form->ifr->ifr_hwaddr.sa_data);
++ else
++ put_string (form, "(hwaddr unknown)");
++ }
++#else
++ *column += printf ("(not available)");
++ had_output = 1;
++#endif
++}
++
++void
++system_fh_hwtype_query (format_data_t form, int argc, char *argv[])
++{
++#ifdef SIOCGIFHWADDR
++ if (ioctl (form->sfd, SIOCGIFHWADDR, form->ifr) >= 0)
++ select_arg (form, argc, argv, 0);
++ else
++#endif
++ select_arg (form, argc, argv, 1);
++}
++
++void
++system_fh_hwtype (format_data_t form, int argc _GL_UNUSED_PARAMETER,
++ char *argv[] _GL_UNUSED_PARAMETER)
++{
++#ifdef SIOCGIFHWADDR
++ if (ioctl (form->sfd, SIOCGIFHWADDR, form->ifr) < 0)
++ error (EXIT_FAILURE, errno,
++ "SIOCGIFHWADDR failed for interface `%s'",
++ form->ifr->ifr_name);
++ else
++ {
++ struct arphrd_symbol *arp;
++
++ arp = arphrd_findvalue (form->ifr->ifr_hwaddr.sa_family);
++ if (arp)
++ put_string (form, arp->title);
++ else
++ put_string (form, "(hwtype unknown)");
++ }
++#else
++ *column += printf ("(not available)");
++ had_output = 1;
++#endif
++}
+diff --git a/ifconfig/system/hurd.h b/ifconfig/system/hurd.h
+new file mode 100644
+index 00000000..bab14565
+--- /dev/null
++++ b/ifconfig/system/hurd.h
+@@ -0,0 +1,50 @@
++/*
++ Copyright (C) 2015 Free Software Foundation, Inc.
++
++ This file is part of GNU Inetutils.
++
++ GNU Inetutils is free software: you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation, either version 3 of the License, or (at
++ your option) any later version.
++
++ GNU Inetutils is distributed in the hope that it will be useful, but
++ WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program. If not, see `http://www.gnu.org/licenses/'. */
++
++/* Written by Mats Erik Andersson. */
++
++#ifndef IFCONFIG_SYSTEM_HURD_H
++# define IFCONFIG_SYSTEM_HURD_H
++
++# include "../printif.h"
++# include "../options.h"
++
++
++/* Option support. */
++
++struct system_ifconfig
++{
++ int valid;
++};
++
++
++/* Output format support. */
++
++# define SYSTEM_FORMAT_HANDLER \
++ { "hurd", fh_nothing}, \
++ { "hwaddr?", system_fh_hwaddr_query}, \
++ { "hwaddr", system_fh_hwaddr}, \
++ { "hwtype?", system_fh_hwtype_query}, \
++ { "hwtype", system_fh_hwtype},
++
++void system_fh_hwaddr_query (format_data_t form, int argc, char *argv[]);
++void system_fh_hwaddr (format_data_t form, int argc, char *argv[]);
++void system_fh_hwtype_query (format_data_t form, int argc, char *argv[]);
++void system_fh_hwtype (format_data_t form, int argc, char *argv[]);
++
++#endif /* !IFCONFIG_SYSTEM_HURD_H */
+--
+2.23.0.rc1.170.gbd704faa3e
+
+From 589dab9c7d3119da82837dabae34c8a3d16cbe49 Mon Sep 17 00:00:00 2001
+From: Mats Erik Andersson <gnu@gisladisker.se>
+Date: Thu, 30 Jul 2015 01:06:42 +0200
+Subject: [PATCH 07/35] ifconfig: Hardware detection in GNU/Hurd.
+
+A work-around needed to distinguish hardware type.
+---
+ ChangeLog | 10 ++++++++++
+ ifconfig/system/hurd.c | 19 ++++++++++++-------
+ 2 files changed, 22 insertions(+), 7 deletions(-)
+
+diff --git a/ifconfig/system/hurd.c b/ifconfig/system/hurd.c
+index 3bd19775..b6261a00 100644
+--- a/ifconfig/system/hurd.c
++++ b/ifconfig/system/hurd.c
+@@ -175,6 +175,16 @@ print_hwaddr_ether (format_data_t form _GL_UNUSED_PARAMETER,
+ had_output = 1;
+ }
+
++/* GNU/Hurd and Mach are using a mixture of BSD definitions
++ * and GNU/Linux interface headers, which in this situation
++ * means that sa_family_t is an unsigned char, from BSD, while
++ * all ARPHRD_* come from GNU/Linux and are thus 16 bits wide.
++ * We must account for this. The following bitmask will
++ * adapt to any future change!
++ */
++
++#define _ARP_MASK ((sizeof (sa_family_t) == 1) ? 0xff : 0xffff)
++
+ struct arphrd_symbol
+ {
+ const char *name;
+@@ -184,16 +194,11 @@ struct arphrd_symbol
+ } arphrd_symbols[] =
+ {
+ #ifdef ARPHRD_ETHER /* Ethernet 10/100Mbps. */
+- { "ETHER", "Ethernet", ARPHRD_ETHER, print_hwaddr_ether},
++ { "ETHER", "Ethernet", ARPHRD_ETHER & _ARP_MASK, print_hwaddr_ether},
+ #endif
+ #ifdef ARPHRD_LOOPBACK /* Loopback device. */
+- { "LOOPBACK", "Local Loopback", ARPHRD_LOOPBACK, NULL},
++ { "LOOPBACK", "Local Loopback", ARPHRD_LOOPBACK & _ARP_MASK, NULL},
+ #endif
+- /* XXX: The image debian-hurd-20150424 returns the value 4
+- instead of expected ARPHRD_LOOPBACK. This has been
+- discussed in the list debian-hurd, where I was asked
+- to resist the temptation of a work around!
+- */
+ { NULL, NULL, 0, NULL}
+ };
+
+--
+2.23.0.rc1.170.gbd704faa3e
+
+From d379784b4461d17b2536effd1b52bae21cd28a32 Mon Sep 17 00:00:00 2001
+From: Guillem Jover <guillem@hadrons.org>
+Date: Fri, 16 Aug 2019 00:34:03 +0200
+Subject: [PATCH 35/35] telnet: Several ioctls have been disabled in the Hurd's
+ glibc
+
+But not the related option macros. inetutils uses those macros to decide
+whether the ioctls are available, so it is FTBFS now. The Hurd's glibc
+is being fixed, but we'll use this for now to get the builds going.
+---
+ telnet/sys_bsd.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/telnet/sys_bsd.c b/telnet/sys_bsd.c
+index 662536ab..5eb35cb5 100644
+--- a/telnet/sys_bsd.c
++++ b/telnet/sys_bsd.c
+@@ -63,6 +63,7 @@
+ #include <errno.h>
+ #include <arpa/telnet.h>
+ #include <sys/select.h>
++#include <sys/ioctl.h>
+ #include <unused-parameter.h>
+
+ #include "ring.h"
+@@ -157,7 +158,7 @@ TerminalRead (char *buf, int n)
+ int
+ TerminalAutoFlush (void)
+ {
+-#if defined LNOFLSH
++#if defined TIOCLGET && defined LNOFLSH
+ int flush;
+
+ ioctl (0, TIOCLGET, (char *) &flush);
+@@ -260,7 +261,9 @@ TerminalSaveState (void)
+ ioctl (0, TIOCGETP, (char *) &ottyb);
+ ioctl (0, TIOCGETC, (char *) &otc);
+ ioctl (0, TIOCGLTC, (char *) &oltc);
++#ifdef TIOCLGET
+ ioctl (0, TIOCLGET, (char *) &olmode);
++#endif
+
+ ntc = otc;
+ nltc = oltc;
+@@ -755,7 +758,9 @@ TerminalNewMode (register int f)
+ #endif
+ }
+ #ifndef USE_TERMIO
++#ifdef TIOCLSET
+ ioctl (tin, TIOCLSET, (char *) &lmode);
++#endif
+ ioctl (tin, TIOCSLTC, (char *) &ltc);
+ ioctl (tin, TIOCSETC, (char *) &tc);
+ ioctl (tin, TIOCSETN, (char *) &sb);
+--
+2.23.0.rc1.170.gbd704faa3e
+