1885 lines
52 KiB
Diff
1885 lines
52 KiB
Diff
diff -Nru netkit-base-0.17/ChangeLog netkit-base/ChangeLog
|
|
--- netkit-base-0.17/ChangeLog 2000-07-25 01:48:33.000000000 +0200
|
|
+++ netkit-base/ChangeLog 2001-01-29 19:38:19.000000000 +0100
|
|
@@ -1,3 +1,37 @@
|
|
+2001/01/30 yoshfuji
|
|
+ - MULOG support for new parser.
|
|
+ - removed old parser.
|
|
+
|
|
+2001/01/29 yoshfuji
|
|
+ - remove inet6d things.
|
|
+
|
|
+2001/01/29 yoshfuji
|
|
+ - identd over ipv6 support.
|
|
+
|
|
+2001/01/28 yoshfuji
|
|
+ - do not compile inet6d by default. if you want inet6d
|
|
+ compiled, do configure with --build-inet6d.
|
|
+
|
|
+2001/01/28 yoshfuji
|
|
+ inetd/{inetd,servtab}.c: revised.
|
|
+ - handle {tcp,udp}{4,6,46} more properly.
|
|
+ - set IPV6_V6ONLY / if it is not supported, ignore connection
|
|
+ via ipv4-mapped addresses for tcp6 entries.
|
|
+ - clean-up.
|
|
+
|
|
+2001/01/27 yoshfuji
|
|
+ inetd/inetd.c ...: import patch to ipv6 integrated inetd from
|
|
+ Mauro Tortonesi <mauro@ferrara.linux.it>;
|
|
+ <ftp://ftp.ferrara.linux.it/pub/project6/patches/\
|
|
+netkit-base_inetd-0.17-ipv6rel4pre1.patch.gz>
|
|
+
|
|
+19-Jan-2000:
|
|
+ removed ipv6 patch from inet6 and introduce inet6d from KAME.
|
|
+ (yoshfuji)
|
|
+
|
|
+4-Nov-2000:
|
|
+ IPv6 enabled inetd (mk@linux-ipv6.org)
|
|
+
|
|
24-Jul-2000:
|
|
Don't use OPEN_MAX. (Olaf Kirch)
|
|
|
|
diff -Nru netkit-base-0.17/configure netkit-base/configure
|
|
--- netkit-base-0.17/configure 2000-07-29 20:00:28.000000000 +0200
|
|
+++ netkit-base/configure 2001-01-29 05:47:51.000000000 +0100
|
|
@@ -29,6 +29,7 @@
|
|
--manmode=mode Mode for manual pages [644]
|
|
--suidmode=mode Mode for setuid programs [4755]
|
|
--with-c-compiler=cc Program for compiling C source [guessed]
|
|
+ --enable-ipv6 Enable IPv6 support
|
|
EOF
|
|
exit 0;;
|
|
--verbose) ;;
|
|
@@ -46,6 +47,11 @@
|
|
--manmode=*) MANMODE=`echo $1 | sed 's/^[^=]*=//'` ;;
|
|
--suidmode=*) SUIDMODE=`echo $1 | sed 's/^[^=]*=//'` ;;
|
|
--with-c-compiler=*) CC=`echo $1 | sed 's/^[^=]*=//'` ;;
|
|
+
|
|
+ --disable-ipv6) ENABLE_IPV6=no;;
|
|
+ --enable-ipv6=*) ENABLE_IPV6=`echo $1 | sed 's/^[^=]*=//'`;;
|
|
+ --enable-ipv6) ENABLE_IPV6=yes;;
|
|
+
|
|
*) echo "Unrecognized option: $1"; exit 1;;
|
|
esac
|
|
shift
|
|
@@ -167,6 +173,42 @@
|
|
rm -f __conftest*
|
|
|
|
##################################################
|
|
+## Enable IPv6
|
|
+echo -n "Whether to enable IPv6 support... "
|
|
+if [ x"$ENABLE_IPV6" = x"yes" ]; then
|
|
+ echo yes
|
|
+ CFLAGS="$CFLAGS -DINET6"
|
|
+else
|
|
+ echo no
|
|
+fi
|
|
+
|
|
+rm -f __conftest*
|
|
+
|
|
+## Search IPv6 Library / Headers
|
|
+if [ x"$ENABLE_IPV6" = x"yes" ]; then
|
|
+ echo -n "Search for IPv6 library... "
|
|
+ inet6libdirs="/usr/local/v6/lib /usr/local/lib /usr /usr/inet6/lib"
|
|
+ inet6libs="inet6"
|
|
+ inet6found=no
|
|
+ for inet6libdir in $inet6libdirs; do
|
|
+ for inet6lib in $inet6libs; do
|
|
+ if [ -d $inet6libdir ] && [ -f $inet6libdir/lib$inet6lib.a ]; then
|
|
+ inet6found=yes
|
|
+ break 2
|
|
+ fi
|
|
+ done
|
|
+ done
|
|
+ if [ x"$inet6found" = x"yes" ]; then
|
|
+ echo "$inet6libdir/lib$inet6lib.a"
|
|
+ LIBS="$LIBS -L$inet6libdir -l$inet6lib"
|
|
+ else
|
|
+ echo "not found"
|
|
+ fi
|
|
+fi
|
|
+
|
|
+rm -f __conftest*
|
|
+
|
|
+##################################################
|
|
|
|
echo -n 'Checking for BSD signal semantics... '
|
|
cat <<EOF >__conftest.c
|
|
diff -Nru netkit-base-0.17/etc.sample/inetd.conf netkit-base/etc.sample/inetd.conf
|
|
--- netkit-base-0.17/etc.sample/inetd.conf 1999-07-16 04:27:26.000000000 +0200
|
|
+++ netkit-base/etc.sample/inetd.conf 2001-03-02 14:35:46.000000000 +0100
|
|
@@ -9,23 +9,35 @@
|
|
# <service_name> <sock_type> <proto> <flags> <user> <server_path> <args>
|
|
#
|
|
# It is generally considered safer to keep these off.
|
|
+#echo stream tcp6 nowait root internal
|
|
#echo stream tcp nowait root internal
|
|
+#echo dgram udp6 wait root internal
|
|
#echo dgram udp wait root internal
|
|
+#discard stream tcp6 nowait root internal
|
|
#discard stream tcp nowait root internal
|
|
+#discard dgram udp6 wait root internal
|
|
#discard dgram udp wait root internal
|
|
+#daytime stream tcp6 nowait root internal
|
|
#daytime stream tcp nowait root internal
|
|
+#daytime dgram udp6 wait root internal
|
|
#daytime dgram udp wait root internal
|
|
+#chargen stream tcp6 nowait root internal
|
|
#chargen stream tcp nowait root internal
|
|
+#chargen dgram udp6 wait root internal
|
|
#chargen dgram udp wait root internal
|
|
+#time stream tcp6 nowait root internal
|
|
#time stream tcp nowait root internal
|
|
+#time dgram udp6 wait root internal
|
|
#time dgram udp wait root internal
|
|
#
|
|
# These are standard services.
|
|
#
|
|
+ftp stream tcp6 nowait root /usr/local/v6/sbin/tcpd /usr/local/v6/sbin/in.ftpd
|
|
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd
|
|
-telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
|
|
-# nntp stream tcp nowait root tcpd in.nntpd
|
|
-# smtp stream tcp nowait root tcpd sendmail -v
|
|
+telnet stream tcp6 nowait root /usr/local/v6/sbin/tcpd /usr/local/v6/sbin/in.telnetd
|
|
+telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
|
|
+# nntp stream tcp nowait root tcpd in.nntpd
|
|
+# smtp stream tcp nowait root tcpd sendmail -v
|
|
#
|
|
# Shell, login, exec and talk are BSD protocols.
|
|
#
|
|
@@ -36,11 +48,17 @@
|
|
# The talkd from netkit-ntalk 0.12 and higher, however, can speak the
|
|
# old talk protocol and can be used safely.
|
|
#
|
|
+# The talkd for ipv6 and one for ipv4 should NOT be run at the same time.
|
|
+#
|
|
+#shell stream tcp6 nowait root /usr/local/v6/sbin/tcpd /usr/local/v6/sbin/in.rshd -L
|
|
#shell stream tcp nowait root /usr/sbin/tcpd in.rshd -L
|
|
+login stream tcp6 nowait root /usr/local/v6/sbin/tcpd /usr/local/v6/sbin/in.rlogind -L
|
|
login stream tcp nowait root /usr/sbin/tcpd in.rlogind -L
|
|
+#exec stream tcp6 nowait root /usr/local/v6/sbin/tcpd /usr/local/v6/sbin/in.rexecd
|
|
#exec stream tcp nowait root /usr/sbin/tcpd in.rexecd
|
|
# talk dgram udp wait root /usr/sbin/tcpd in.talkd
|
|
-ntalk dgram udp wait root /usr/sbin/tcpd in.talkd
|
|
+ntalk dgram udp46 wait root /usr/local/v6/sbin/tcpd /usr/local/v6/sbin/in.talkd
|
|
+#ntalk dgram udp wait root /usr/sbin/tcpd in.talkd
|
|
#
|
|
# Kerberos authenticated services
|
|
#
|
|
@@ -61,6 +79,7 @@
|
|
#
|
|
# Comsat - asynchronous new mail notification. Recommended to leave it off.
|
|
#
|
|
+# comsat dgram udp6 wait root /usr/local/v6/sbin/in.comsat
|
|
# comsat dgram udp wait root /usr/sbin/tcpd in.comsat
|
|
#
|
|
# The Internet UUCP service.
|
|
@@ -71,6 +90,7 @@
|
|
# run this only on machines acting as "boot servers." If you don't
|
|
# need it, don't use it.
|
|
#
|
|
+# tftp dgram udp6 wait nobody /usr/local/v6/sbin/tcpd /usr/local/v6/sbin/in.tftpd
|
|
# tftp dgram udp wait nobody /usr/sbin/tcpd in.tftpd
|
|
# bootps dgram udp wait root /usr/sbin/in.bootpd in.bootpd
|
|
#
|
|
@@ -78,6 +98,7 @@
|
|
# valuable to potential "system crackers." Many sites choose to disable
|
|
# some or all of these services to improve security.
|
|
#
|
|
+finger stream tcp6 nowait nobody /usr/local/v6/sbin/tcpd /usr/local/v6/sbin/in.fingerd -w
|
|
finger stream tcp nowait nobody /usr/sbin/tcpd in.fingerd -w
|
|
#systat stream tcp nowait nobody /usr/sbin/tcpd /bin/ps -auwwx
|
|
#netstat stream tcp nowait root /usr/sbin/tcpd /bin/netstat -a
|
|
diff -Nru netkit-base-0.17/inetd/Makefile netkit-base/inetd/Makefile
|
|
--- netkit-base-0.17/inetd/Makefile 2000-07-22 22:14:21.000000000 +0200
|
|
+++ netkit-base/inetd/Makefile 2001-02-11 03:30:33.000000000 +0100
|
|
@@ -3,7 +3,12 @@
|
|
include ../MCONFIG
|
|
include ../MRULES
|
|
|
|
-OBJS=inetd.o servtab.o builtins.o sig.o daemon.o setproctitle.o mysleep.o
|
|
+OBJS=inetd.o servtab.o builtins.o sig.o setproctitle.o doalloc.o mysleep.o
|
|
+ifeq ($(HAVE_DAEMON), 1)
|
|
+CFLAGS+=-DHAVE_DAEMON
|
|
+else
|
|
+OBJS+=daemon.o
|
|
+endif
|
|
|
|
inetd: $(OBJS)
|
|
$(CC) $(LDFLAGS) $^ $(LIBS) -o $@
|
|
@@ -16,7 +21,9 @@
|
|
$(CC) $(CFLAGS) -MM *.c > depend.mk
|
|
|
|
install: inetd
|
|
+ install -d $(INSTALLROOT)$(SBINDIR)
|
|
install -s -m$(DAEMONMODE) inetd $(INSTALLROOT)$(SBINDIR)
|
|
+ install -d $(INSTALLROOT)$(MANDIR)/man8
|
|
install -m$(MANMODE) inetd.8 $(INSTALLROOT)$(MANDIR)/man8
|
|
|
|
clean:
|
|
diff -Nru netkit-base-0.17/inetd/builtins.c netkit-base/inetd/builtins.c
|
|
--- netkit-base-0.17/inetd/builtins.c 2000-07-22 22:13:07.000000000 +0200
|
|
+++ netkit-base/inetd/builtins.c 2001-01-29 03:03:20.000000000 +0100
|
|
@@ -1,3 +1,34 @@
|
|
+/* $USAGI: builtins.c,v 1.11 2001/01/29 02:03:20 yoshfuji Exp $ */
|
|
+
|
|
+/*
|
|
+ * Copyright (C) 2001 USAGI/WIDE Project.
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * Redistribution and use in source and binary forms, with or without
|
|
+ * modification, are permitted provided that the following conditions
|
|
+ * are met:
|
|
+ * 1. Redistributions of source code must retain the above copyright
|
|
+ * notice, this list of conditions and the following disclaimer.
|
|
+ * 2. Redistributions in binary form must reproduce the above copyright
|
|
+ * notice, this list of conditions and the following disclaimer in the
|
|
+ * documentation and/or other materials provided with the distribution.
|
|
+ * 3. Neither the name of the project nor the names of its contributors
|
|
+ * may be used to endorse or promote products derived from this software
|
|
+ * without specific prior written permission.
|
|
+ *
|
|
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
|
|
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
|
|
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
+ * SUCH DAMAGE.
|
|
+ */
|
|
+
|
|
/*
|
|
* Internet services provided internally by inetd:
|
|
*/
|
|
@@ -13,6 +44,12 @@
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
|
|
+#ifdef INET6
|
|
+#include <netinet/ip6.h>
|
|
+#include <netdb.h>
|
|
+#endif
|
|
+#include <syslog.h>
|
|
+
|
|
#include "servtab.h"
|
|
#include "builtins.h"
|
|
#include "setproctitle.h"
|
|
@@ -23,22 +60,68 @@
|
|
char builtins_rcsid[] =
|
|
"$Id: builtins.c,v 1.5 2000/07/22 20:13:07 dholland Exp $";
|
|
|
|
+
|
|
+unsigned short int
|
|
+sockaddr_port(struct sockaddr *sa, socklen_t salen)
|
|
+{
|
|
+#ifdef INET6
|
|
+ char sbuf[NI_MAXSERV];
|
|
+#endif
|
|
+ unsigned short int port = 0;
|
|
+
|
|
+#ifdef INET6
|
|
+ if (getnameinfo(sa, salen, NULL, 0, sbuf, sizeof(sbuf),
|
|
+ NI_NUMERICSERV) == 0)
|
|
+ port = atoi(sbuf);
|
|
+ else
|
|
+#endif
|
|
+ switch (sa->sa_family) {
|
|
+ case AF_INET:
|
|
+ port = ntohs(((struct sockaddr_in *)sa)->sin_port);
|
|
+ break;
|
|
+#ifdef INET6
|
|
+ case AF_INET6:
|
|
+ port = ntohs(((struct sockaddr_in6 *)sa)->sin6_port);
|
|
+ break;
|
|
+#endif
|
|
+ default:
|
|
+ /* everything went wrong :-P */
|
|
+ syslog(LOG_ERR, "cannot find port number: %m");
|
|
+ exit(1);
|
|
+ }
|
|
+ return port;
|
|
+}
|
|
+
|
|
+
|
|
static void
|
|
do_setproctitle(char *a, int s)
|
|
{
|
|
- struct sockaddr_in sn;
|
|
- socklen_t size = sizeof(sn);
|
|
-
|
|
- if (getpeername(s, (struct sockaddr *)&sn, &size) == 0) {
|
|
- setproctitle("-%s [%s]", a, inet_ntoa(sn.sin_addr));
|
|
- }
|
|
- else {
|
|
+#ifdef INET6
|
|
+ struct sockaddr_storage sa;
|
|
+#else
|
|
+ struct sockaddr sa;
|
|
+#endif
|
|
+ socklen_t size = sizeof(sa);
|
|
+
|
|
+ if (getpeername(s, (struct sockaddr *)&sa, &size) == 0) {
|
|
+#ifdef INET6
|
|
+ char buf[INET6_ADDRSTRLEN+1];
|
|
+
|
|
+ if(getnameinfo((struct sockaddr *)&sa, size, buf, sizeof(buf),
|
|
+ NULL, 0, NI_NUMERICHOST) == 0) {
|
|
+ setproctitle("-%s [%s]", a, buf);
|
|
+ } else {
|
|
+ setproctitle("-%s", a);
|
|
+ }
|
|
+#else
|
|
+ setproctitle("-%s [%s]", a, inet_ntoa(((struct sockaddr_in *)&sa)->sin_addr));
|
|
+#endif
|
|
+ } else {
|
|
setproctitle("-%s", a);
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
/* Echo service -- echo data back */
|
|
/* ARGSUSED */
|
|
void
|
|
@@ -61,10 +144,12 @@
|
|
{
|
|
char buffer[BUFSIZE];
|
|
int i, port;
|
|
-/* size_t size; */
|
|
+#ifdef INET6
|
|
+ struct sockaddr_storage sa;
|
|
+#else
|
|
+ struct sockaddr sa;
|
|
+#endif
|
|
socklen_t size;
|
|
-/* struct sockaddr sa; */
|
|
- struct sockaddr_in sa;
|
|
|
|
(void)sep;
|
|
|
|
@@ -73,10 +158,11 @@
|
|
(struct sockaddr *)&sa, &size);
|
|
if (i < 0)
|
|
return;
|
|
- port = sa.sin_port;
|
|
- if (ntohs(port) < MINUDPSRCPORT)
|
|
+
|
|
+ port = sockaddr_port((struct sockaddr *)&sa, size);
|
|
+ if (port < MINUDPSRCPORT)
|
|
return;
|
|
- (void) sendto(s, buffer, i, 0, (struct sockaddr *)&sa, sizeof(sa));
|
|
+ (void) sendto(s, buffer, i, 0, (struct sockaddr *)&sa, size);
|
|
}
|
|
|
|
/* Discard service -- ignore data */
|
|
@@ -159,7 +245,11 @@
|
|
chargen_dg(int s, struct servtab *sep)
|
|
{
|
|
/* struct sockaddr sa; */
|
|
- struct sockaddr_in sa;
|
|
+#ifdef INET6
|
|
+ struct sockaddr_storage sa;
|
|
+#else
|
|
+ struct sockaddr sa;
|
|
+#endif
|
|
static char *rs;
|
|
size_t len;
|
|
socklen_t size;
|
|
@@ -178,8 +268,8 @@
|
|
(struct sockaddr *)&sa, &size) < 0)
|
|
return;
|
|
|
|
- port = sa.sin_port;
|
|
- if (ntohs(port)<MINUDPSRCPORT)
|
|
+ port = sockaddr_port((struct sockaddr *)&sa, size);
|
|
+ if (port < MINUDPSRCPORT)
|
|
return;
|
|
|
|
if ((len = endring - rs) >= LINESIZ)
|
|
@@ -193,7 +283,7 @@
|
|
text[LINESIZ] = '\r';
|
|
text[LINESIZ + 1] = '\n';
|
|
(void) sendto(s, text, sizeof(text), 0,
|
|
- (struct sockaddr *)&sa, sizeof(sa));
|
|
+ (struct sockaddr *)&sa, size);
|
|
}
|
|
|
|
/*
|
|
@@ -236,7 +326,11 @@
|
|
{
|
|
unsigned long result;
|
|
/* struct sockaddr sa; */
|
|
- struct sockaddr_in sa;
|
|
+#ifdef INET6
|
|
+ struct sockaddr_storage sa;
|
|
+#else
|
|
+ struct sockaddr sa;
|
|
+#endif
|
|
/* size_t size; */
|
|
socklen_t size;
|
|
int port;
|
|
@@ -246,12 +340,13 @@
|
|
if (recvfrom(s, (char *)&result, sizeof(result), 0,
|
|
(struct sockaddr *)&sa, &size) < 0)
|
|
return;
|
|
- port = sa.sin_port;
|
|
- if (ntohs(port) < MINUDPSRCPORT)
|
|
+
|
|
+ port = sockaddr_port((struct sockaddr *)&sa, size);
|
|
+ if (port < MINUDPSRCPORT)
|
|
return;
|
|
result = machtime();
|
|
(void) sendto(s, (char *) &result, sizeof(result), 0,
|
|
- (struct sockaddr *)&sa, sizeof(sa));
|
|
+ (struct sockaddr *)&sa, size);
|
|
}
|
|
|
|
/* Return human-readable time of day */
|
|
@@ -274,8 +369,11 @@
|
|
{
|
|
char buffer[256];
|
|
time_t clocc;
|
|
- struct sockaddr_in sa;
|
|
-/* size_t size; */
|
|
+#ifdef INET6
|
|
+ struct sockaddr_storage sa;
|
|
+#else
|
|
+ struct sockaddr sa;
|
|
+#endif
|
|
socklen_t size;
|
|
int port;
|
|
|
|
@@ -286,10 +384,11 @@
|
|
if (recvfrom(s, buffer, sizeof(buffer), 0,
|
|
(struct sockaddr *)&sa, &size) < 0)
|
|
return;
|
|
- port = sa.sin_port;
|
|
- if (ntohs(port) < MINUDPSRCPORT)
|
|
+
|
|
+ port = sockaddr_port((struct sockaddr *)&sa, size);
|
|
+ if (port < MINUDPSRCPORT)
|
|
return;
|
|
snprintf(buffer, sizeof(buffer), "%.24s\r\n", ctime(&clocc));
|
|
sendto(s, buffer, strlen(buffer), 0,
|
|
- (struct sockaddr *)&sa, sizeof(sa));
|
|
+ (struct sockaddr *)&sa, size);
|
|
}
|
|
diff -Nru netkit-base-0.17/inetd/builtins.h netkit-base/inetd/builtins.h
|
|
--- netkit-base-0.17/inetd/builtins.h 1999-08-23 04:30:24.000000000 +0200
|
|
+++ netkit-base/inetd/builtins.h 2001-01-27 14:14:00.000000000 +0100
|
|
@@ -8,3 +8,4 @@
|
|
void machtime_dg(int, struct servtab *);
|
|
void daytime_dg(int, struct servtab *);
|
|
void chargen_dg(int, struct servtab *);
|
|
+unsigned short int sockaddr_port(struct sockaddr *sa, socklen_t salen);
|
|
diff -Nru netkit-base-0.17/inetd/depend.mk netkit-base/inetd/depend.mk
|
|
--- netkit-base-0.17/inetd/depend.mk 1999-08-23 04:30:24.000000000 +0200
|
|
+++ netkit-base/inetd/depend.mk 2001-01-29 02:48:42.000000000 +0100
|
|
@@ -1,7 +1,10 @@
|
|
builtins.o: builtins.c servtab.h builtins.h setproctitle.h
|
|
daemon.o: daemon.c daemon.h
|
|
+doalloc.o: doalloc.c mysleep.h inetd.h
|
|
+inet6d.o: inet6d.c setproctitle.h mysleep.h pathnames.h
|
|
inetd.o: inetd.c ../version.h pathnames.h inetd.h servtab.h sig.h \
|
|
- daemon.h setproctitle.h
|
|
-servtab.o: servtab.c inetd.h servtab.h builtins.h sig.h
|
|
+ daemon.h setproctitle.h builtins.h mysleep.h
|
|
+mysleep.o: mysleep.c mysleep.h
|
|
+servtab.o: servtab.c inetd.h servtab.h builtins.h sig.h mysleep.h
|
|
setproctitle.o: setproctitle.c setproctitle.h inetd.h
|
|
sig.o: sig.c sig.h
|
|
diff -Nru netkit-base-0.17/inetd/doalloc.c netkit-base/inetd/doalloc.c
|
|
--- netkit-base-0.17/inetd/doalloc.c 1970-01-01 01:00:00.000000000 +0100
|
|
+++ netkit-base/inetd/doalloc.c 2001-01-28 02:31:14.000000000 +0100
|
|
@@ -0,0 +1,90 @@
|
|
+/* $USAGI: doalloc.c,v 1.3 2001/01/28 01:31:14 yoshfuji Exp $ */
|
|
+
|
|
+/*
|
|
+ * Copyright (c) 1983, 1991 The Regents of the University of California.
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * Redistribution and use in source and binary forms, with or without
|
|
+ * modification, are permitted provided that the following conditions
|
|
+ * are met:
|
|
+ * 1. Redistributions of source code must retain the above copyright
|
|
+ * notice, this list of conditions and the following disclaimer.
|
|
+ * 2. Redistributions in binary form must reproduce the above copyright
|
|
+ * notice, this list of conditions and the following disclaimer in the
|
|
+ * documentation and/or other materials provided with the distribution.
|
|
+ * 3. All advertising materials mentioning features or use of this software
|
|
+ * must display the following acknowledgement:
|
|
+ * This product includes software developed by the University of
|
|
+ * California, Berkeley and its contributors.
|
|
+ * 4. Neither the name of the University nor the names of its contributors
|
|
+ * may be used to endorse or promote products derived from this software
|
|
+ * without specific prior written permission.
|
|
+ *
|
|
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
+ * SUCH DAMAGE.
|
|
+ */
|
|
+
|
|
+#include <sys/types.h>
|
|
+#include <sys/time.h>
|
|
+#include <sys/socket.h>
|
|
+#include <netinet/in.h>
|
|
+#include <sys/un.h>
|
|
+#include <netdb.h>
|
|
+#include <syslog.h>
|
|
+#include <signal.h>
|
|
+#include <unistd.h>
|
|
+#include <stdlib.h>
|
|
+#include <stdio.h>
|
|
+#include "mysleep.h"
|
|
+#include "inetd.h"
|
|
+
|
|
+/********* exit-resistant malloc ************************/
|
|
+
|
|
+/*
|
|
+ * On many systems, including presently Linux, this is bloat because
|
|
+ * malloc never returns null - if the system runs out of swap, it
|
|
+ * panics or randomly starts killing processes or does other weird
|
|
+ * stuff. However, it doesn't hurt to be prepared. This is the only
|
|
+ * place inetd can actually exit due to failure, now.
|
|
+ */
|
|
+
|
|
+void *
|
|
+domalloc(size_t len)
|
|
+{
|
|
+ static int retries[] = { 2, 10, 60, 600, -1 };
|
|
+ void *p;
|
|
+ int try = 0;
|
|
+
|
|
+ while (retries[try]>0) {
|
|
+ p = malloc(len);
|
|
+ if (p != NULL) {
|
|
+ return p;
|
|
+ }
|
|
+
|
|
+ syslog(LOG_ERR, "Out of memory - retrying in %d seconds.",
|
|
+ retries[try]);
|
|
+ mysleep(retries[try]);
|
|
+ try++;
|
|
+ }
|
|
+ /* Should this be LOG_EMERG? */
|
|
+ syslog(LOG_ALERT, "Out of memory - GIVING UP!");
|
|
+ exit(100);
|
|
+ return NULL; /* unreachable */
|
|
+}
|
|
+
|
|
+char *
|
|
+dostrdup(const char *cp)
|
|
+{
|
|
+ char *x = domalloc(strlen(cp)+1);
|
|
+ strcpy(x, cp);
|
|
+ return x;
|
|
+}
|
|
diff -Nru netkit-base-0.17/inetd/inetd.8 netkit-base/inetd/inetd.8
|
|
--- netkit-base-0.17/inetd/inetd.8 2000-07-31 01:56:58.000000000 +0200
|
|
+++ netkit-base/inetd/inetd.8 2001-01-29 06:23:38.000000000 +0100
|
|
@@ -1,3 +1,30 @@
|
|
+.\" Copyright (C) 2001 USAGI/WIDE Project.
|
|
+.\" All rights reserved.
|
|
+.\"
|
|
+.\" Redistribution and use in source and binary forms, with or without
|
|
+.\" modification, are permitted provided that the following conditions
|
|
+.\" are met:
|
|
+.\" 1. Redistributions of source code must retain the above copyright
|
|
+.\" notice, this list of conditions and the following disclaimer.
|
|
+.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
+.\" notice, this list of conditions and the following disclaimer in the
|
|
+.\" documentation and/or other materials provided with the distribution.
|
|
+.\" 3. Neither the name of the project nor the names of its contributors
|
|
+.\" may be used to endorse or promote products derived from this software
|
|
+.\" without specific prior written permission.
|
|
+.\"
|
|
+.\" THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
|
|
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
|
|
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
+.\" SUCH DAMAGE.
|
|
+.\"
|
|
.\" Copyright (c) 1985, 1991 The Regents of the University of California.
|
|
.\" All rights reserved.
|
|
.\"
|
|
@@ -183,7 +210,27 @@
|
|
Examples might be
|
|
.Dq tcp
|
|
or
|
|
-.Dq udp .
|
|
+.Dq udp ,
|
|
+both of which imply IPv4 for backward compatibility.
|
|
+The names
|
|
+.Dq tcp4
|
|
+and
|
|
+.Dq udp4
|
|
+specify IPv4 only.
|
|
+The names
|
|
+.Dq tcp6
|
|
+and
|
|
+.Dq udp6
|
|
+specify IPv6 only;
|
|
+inetd will reject / ignore packets from ipv4 clients.
|
|
+The names
|
|
+.Dq tcp46
|
|
+and
|
|
+.Dq udp46
|
|
+specify that the entry accepts both IPv4 and IPv6 connections
|
|
+via a wildcard
|
|
+.Dv PF_INET6
|
|
+socket.
|
|
Rpc based services are specified with the
|
|
.Dq rpc/tcp
|
|
or
|
|
@@ -315,3 +362,7 @@
|
|
based services is modelled after that
|
|
provided by
|
|
.Em SunOS 4.1 .
|
|
+.Em IPv6
|
|
+support was developed by USAGI Project,
|
|
+based on Mauro Tortonesi <mauro@ferrara.linux.it>'s patch.
|
|
+
|
|
diff -Nru netkit-base-0.17/inetd/inetd.c netkit-base/inetd/inetd.c
|
|
--- netkit-base-0.17/inetd/inetd.c 2000-07-25 01:48:34.000000000 +0200
|
|
+++ netkit-base/inetd/inetd.c 2001-02-11 03:30:33.000000000 +0100
|
|
@@ -1,3 +1,34 @@
|
|
+/* $USAGI: inetd.c,v 1.14 2001/02/11 02:30:33 yoshfuji Exp $ */
|
|
+
|
|
+/*
|
|
+ * Copyright (C) 2001 USAGI/WIDE Project.
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * Redistribution and use in source and binary forms, with or without
|
|
+ * modification, are permitted provided that the following conditions
|
|
+ * are met:
|
|
+ * 1. Redistributions of source code must retain the above copyright
|
|
+ * notice, this list of conditions and the following disclaimer.
|
|
+ * 2. Redistributions in binary form must reproduce the above copyright
|
|
+ * notice, this list of conditions and the following disclaimer in the
|
|
+ * documentation and/or other materials provided with the distribution.
|
|
+ * 3. Neither the name of the project nor the names of its contributors
|
|
+ * may be used to endorse or promote products derived from this software
|
|
+ * without specific prior written permission.
|
|
+ *
|
|
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
|
|
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
|
|
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
+ * SUCH DAMAGE.
|
|
+ */
|
|
+
|
|
/*
|
|
* Copyright (c) 1983, 1991 The Regents of the University of California.
|
|
* All rights reserved.
|
|
@@ -41,7 +72,11 @@
|
|
char rcsid[] =
|
|
"$Id: inetd.c,v 1.38 2000/07/24 23:48:34 dholland Exp $";
|
|
|
|
+#ifdef _USAGI
|
|
+#include "version.h"
|
|
+#else
|
|
#include "../version.h"
|
|
+#endif
|
|
|
|
/*
|
|
* Inetd - Internet super-server
|
|
@@ -137,7 +172,17 @@
|
|
#include <getopt.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
+#ifndef HAVE_DAEMON
|
|
+#include "daemon.h"
|
|
+#endif
|
|
+#ifdef MULOG
|
|
+#include <signal.h>
|
|
+#endif
|
|
|
|
+#ifdef INET6
|
|
+#include <netinet/ip6.h>
|
|
+#endif
|
|
+
|
|
#ifndef __linux__
|
|
#ifndef RLIMIT_NOFILE
|
|
#define RLIMIT_NOFILE RLIMIT_OFILE
|
|
@@ -148,8 +193,8 @@
|
|
#include "inetd.h"
|
|
#include "servtab.h"
|
|
#include "sig.h"
|
|
-#include "daemon.h"
|
|
#include "setproctitle.h"
|
|
+#include "builtins.h"
|
|
#include "mysleep.h"
|
|
|
|
#ifdef RPC /* must come after inetd.h, which defines RPC */
|
|
@@ -176,6 +221,12 @@
|
|
|
|
static void attempt_to_restart(void);
|
|
|
|
+#ifdef MULOG
|
|
+static void dolog(struct servtab *, int);
|
|
+char *rfc931_name(struct sockaddr *, int);
|
|
+static void timeout(int);
|
|
+#endif
|
|
+
|
|
struct servtab *servtab; /* service table */
|
|
const char *configfile = _PATH_INETDCONF; /* config file path */
|
|
int debug = 0; /* debug flag */
|
|
@@ -189,7 +240,7 @@
|
|
static int options;
|
|
static int timingout;
|
|
|
|
-static long rlim_ofile_cur = DEFAULT_FILE_LIMIT;
|
|
+static unsigned long rlim_ofile_cur = DEFAULT_FILE_LIMIT;
|
|
|
|
#ifdef RLIMIT_NOFILE
|
|
struct rlimit rlim_ofile;
|
|
@@ -457,6 +508,13 @@
|
|
{
|
|
char buf[50];
|
|
int ctrl, dofork;
|
|
+#ifdef INET6
|
|
+ struct sockaddr_storage sa;
|
|
+#else
|
|
+ struct sockaddr sa;
|
|
+#endif
|
|
+ socklen_t salen = sizeof(&sa);
|
|
+ int nowait = 0;
|
|
|
|
if (debug) {
|
|
fprintf(stderr, "launching: %s\n", sep->se_service);
|
|
@@ -465,9 +523,26 @@
|
|
if (!sep->se_wait && sep->se_socktype == SOCK_STREAM) {
|
|
/* Do nonblocking accept, just in case */
|
|
fcntl(sep->se_fd, F_SETFL, O_NDELAY);
|
|
- ctrl = accept(sep->se_fd, NULL, NULL);
|
|
+ ctrl = accept(sep->se_fd, (struct sockaddr *)&sa, &salen);
|
|
fcntl(sep->se_fd, F_SETFL, 0);
|
|
+#ifdef INET6
|
|
+ nowait = 1;
|
|
+#endif
|
|
+ } else {
|
|
+ ctrl = sep->se_fd;
|
|
+ }
|
|
+#ifdef INET6
|
|
+ if (sep->se_sockopt_ipv6_only &&
|
|
+ ((struct sockaddr *)&sa)->sa_family == AF_INET6 &&
|
|
+ IN6_IS_ADDR_V4MAPPED(&((struct sockaddr_in6 *)&sa)->sin6_addr)) {
|
|
+ syslog(LOG_WARNING, "packet arrived via ipv4 mapped address; ignored.");
|
|
+ if (nowait)
|
|
+ close(ctrl);
|
|
+ return;
|
|
+ }
|
|
+#endif
|
|
|
|
+ if (nowait) {
|
|
if (debug) {
|
|
fprintf(stderr, "accept: new socket %d\n", ctrl);
|
|
}
|
|
@@ -485,9 +560,6 @@
|
|
return;
|
|
}
|
|
}
|
|
- else {
|
|
- ctrl = sep->se_fd;
|
|
- }
|
|
|
|
dofork = (sep->se_bi == NULL || sep->se_bi->bi_fork);
|
|
if (dofork) {
|
|
@@ -844,6 +916,9 @@
|
|
(void)unlink(sep->se_service);
|
|
break;
|
|
case AF_INET:
|
|
+#ifdef INET6
|
|
+ case AF_INET6:
|
|
+#endif
|
|
if (sep->se_wait == 1 && isrpcservice(sep))
|
|
unregister_rpc(sep);
|
|
break;
|
|
@@ -886,6 +961,13 @@
|
|
syslog(LOG_ERR, "setsockopt (SO_DEBUG): %m");
|
|
if (turnon(sep->se_fd, SO_REUSEADDR) < 0)
|
|
syslog(LOG_ERR, "setsockopt (SO_REUSEADDR): %m");
|
|
+#ifdef INET6
|
|
+#ifdef IPV6_V6ONLY
|
|
+ if (sep->se_sockopt_ipv6_only == 1 &&
|
|
+ setsockopt(sep->se_fd, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&on, sizeof (on)) <0)
|
|
+ syslog(LOG_ERR, "setsockopt (IPPROTO_IPV6, IPV6_V6ONLY): %m");
|
|
+#endif
|
|
+#endif
|
|
#undef turnon
|
|
if (bind(sep->se_fd, &sep->se_ctrladdr, sep->se_ctrladdr_size) < 0) {
|
|
syslog(LOG_ERR, "%s: bind: %m", service_name(sep),
|
|
@@ -898,6 +980,10 @@
|
|
}
|
|
return;
|
|
}
|
|
+#ifdef INET6
|
|
+ if (debug)
|
|
+ fprintf(stderr, "bound to af: %i\n", sep->se_family);
|
|
+#endif
|
|
if (sep->se_socktype == SOCK_STREAM)
|
|
listen(sep->se_fd, global_queuelen);
|
|
|
|
@@ -916,7 +1002,7 @@
|
|
nsock++;
|
|
if (sep->se_fd > maxsock) {
|
|
maxsock = sep->se_fd;
|
|
- if (maxsock > rlim_ofile_cur - FD_MARGIN)
|
|
+ if ((unsigned int)maxsock + FD_MARGIN > rlim_ofile_cur)
|
|
bump_nofile();
|
|
}
|
|
}
|
|
@@ -927,8 +1013,12 @@
|
|
#ifdef RPC
|
|
/* size_t m; */
|
|
socklen_t m;
|
|
- int i;
|
|
+ int i, port;
|
|
+#ifdef INET6
|
|
+ struct sockaddr_storage sn;
|
|
+#else
|
|
struct sockaddr_in sn;
|
|
+#endif
|
|
struct protoent *pp;
|
|
|
|
if ((pp = getprotobyname(sep->se_proto+4)) == NULL) {
|
|
@@ -943,16 +1033,18 @@
|
|
return;
|
|
}
|
|
|
|
+ port = sockaddr_port((struct sockaddr *)&sn, m);
|
|
+
|
|
for (i = sep->se_rpcversl; i <= sep->se_rpcversh; i++) {
|
|
if (debug)
|
|
fprintf(stderr, "pmap_set: %u %u %u %u\n",
|
|
sep->se_rpcprog, i,
|
|
- pp->p_proto, ntohs(sn.sin_port));
|
|
+ pp->p_proto, port);
|
|
(void)pmap_unset(sep->se_rpcprog, i);
|
|
- if (!pmap_set(sep->se_rpcprog, i, pp->p_proto, ntohs(sn.sin_port)))
|
|
+ if (!pmap_set(sep->se_rpcprog, i, pp->p_proto, port))
|
|
syslog(LOG_ERR, "pmap_set: %u %u %u %u: %m",
|
|
sep->se_rpcprog, i,
|
|
- pp->p_proto, ntohs(sn.sin_port));
|
|
+ pp->p_proto, port);
|
|
}
|
|
#endif /* RPC */
|
|
}
|
|
@@ -1048,45 +1140,75 @@
|
|
|
|
|
|
#ifdef MULOG
|
|
+static
|
|
+void
|
|
dolog(sep, ctrl)
|
|
struct servtab *sep;
|
|
int ctrl;
|
|
{
|
|
+#ifdef INET6
|
|
+ struct sockaddr_storage sa;
|
|
+ char host[NI_MAXHOST];
|
|
+#else
|
|
struct sockaddr sa;
|
|
struct sockaddr_in *sin = (struct sockaddr_in *)&sa;
|
|
- int len = sizeof(sa);
|
|
struct hostent *hp;
|
|
- char *host, *dp, buf[BUFSIZ], *rfc931_name();
|
|
+ char *host;
|
|
+#endif
|
|
+ socklen_t len = sizeof(sa);
|
|
+ char buf[BUFSIZ];
|
|
int connected = 1;
|
|
|
|
- if (sep->se_family != AF_INET)
|
|
+ if (sep->se_family != AF_INET
|
|
+#ifdef INET6
|
|
+ && sep->se_family != AF_INET6
|
|
+#endif
|
|
+ )
|
|
return;
|
|
|
|
- if (getpeername(ctrl, &sa, &len) < 0) {
|
|
+ if (getpeername(ctrl, (struct sockaddr *)&sa, &len) < 0) {
|
|
if (errno != ENOTCONN) {
|
|
syslog(LOG_ERR, "getpeername: %m");
|
|
return;
|
|
}
|
|
- if (recvfrom(ctrl, buf, sizeof(buf), MSG_PEEK, &sa, &len) < 0) {
|
|
+ if (recvfrom(ctrl, buf, sizeof(buf), MSG_PEEK,
|
|
+ (struct sockaddr *)&sa, &len) < 0) {
|
|
syslog(LOG_ERR, "recvfrom: %m");
|
|
return;
|
|
}
|
|
connected = 0;
|
|
}
|
|
- if (sa.sa_family != AF_INET) {
|
|
- syslog(LOG_ERR, "unexpected address family %u", sa.sa_family);
|
|
+ if (((struct sockaddr *)&sa)->sa_family != AF_INET
|
|
+#ifdef INET6
|
|
+ && ((struct sockaddr *)&sa)->sa_family != AF_INET6
|
|
+#endif
|
|
+ ) {
|
|
+ syslog(LOG_ERR, "unexpected address family %u",
|
|
+ ((struct sockaddr *)&sa)->sa_family);
|
|
return;
|
|
}
|
|
|
|
+#ifdef INET6
|
|
+ if (getnameinfo((struct sockaddr *)&sa, len,
|
|
+ host, sizeof(host), NULL, 0, 0)) {
|
|
+ syslog(LOG_ERR, "cannot do getnameinfo: family %u",
|
|
+ ((struct sockaddr *)&sa)->sa_family);
|
|
+ return;
|
|
+ }
|
|
+#else
|
|
hp = gethostbyaddr((char *) &sin->sin_addr.s_addr,
|
|
sizeof (sin->sin_addr.s_addr), AF_INET);
|
|
|
|
host = hp?hp->h_name:inet_ntoa(sin->sin_addr);
|
|
+#endif
|
|
|
|
switch (sep->se_log & ~MULOG_RFC931) {
|
|
case 0:
|
|
return;
|
|
case 1:
|
|
+ {
|
|
+#if 0 /* XXX where is curdom? */
|
|
+ char *dp;
|
|
if (curdom == NULL || *curdom == '\0')
|
|
break;
|
|
dp = host + strlen(host) - strlen(curdom);
|
|
@@ -1097,7 +1219,9 @@
|
|
host, curdom);
|
|
if (strcasecmp(dp, curdom) == 0)
|
|
return;
|
|
+#endif
|
|
break;
|
|
+ }
|
|
case 2:
|
|
default:
|
|
break;
|
|
@@ -1107,7 +1231,7 @@
|
|
|
|
if (connected && (sep->se_log & MULOG_RFC931))
|
|
syslog(LOG_INFO, "%s@%s wants %s",
|
|
- rfc931_name(sin, ctrl), host, sep->se_service);
|
|
+ rfc931_name((struct sockaddr *)&sa, ctrl), host, sep->se_service);
|
|
else
|
|
syslog(LOG_INFO, "%s wants %s",
|
|
host, sep->se_service);
|
|
@@ -1139,11 +1263,17 @@
|
|
/* rfc931_name - return remote user name */
|
|
|
|
char *
|
|
-rfc931_name(struct sockaddr_in *there, int ctrl)
|
|
+rfc931_name(struct sockaddr *there, int ctrl)
|
|
{
|
|
/* "there" is remote link information */
|
|
- struct sockaddr_in here; /* local link information */
|
|
- struct sockaddr_in sin; /* for talking to RFC931 daemon */
|
|
+#ifdef INET6
|
|
+ struct sockaddr_storage here; /* local link information */
|
|
+ struct sockaddr_storage sa; /* for talking to RFC931 daemon */
|
|
+#else
|
|
+ struct sockaddr here; /* local link information */
|
|
+ struct sockaddr sa; /* for talking to RFC931 daemon */
|
|
+#endif
|
|
+ unsigned int there_port, here_port;
|
|
int length;
|
|
int s;
|
|
unsigned remote;
|
|
@@ -1152,7 +1282,7 @@
|
|
char buf[256];
|
|
char *cp;
|
|
char *result = "USER_UNKNOWN";
|
|
- int len;
|
|
+ size_t len;
|
|
|
|
/* Find out local port number of our stdin. */
|
|
|
|
@@ -1161,33 +1291,70 @@
|
|
syslog(LOG_ERR, "getsockname: %m");
|
|
return (result);
|
|
}
|
|
- /* Set up timer so we won't get stuck. */
|
|
|
|
- if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
|
|
+ memcpy(&sa, &here, sizeof(sa));
|
|
+ switch(((struct sockaddr *) &here)->sa_family) {
|
|
+ case AF_INET:
|
|
+ ((struct sockaddr_in *)&sa)->sin_port = htons(0);
|
|
+ break;
|
|
+#ifdef INET6
|
|
+ case AF_INET6:
|
|
+ ((struct sockaddr_in6 *)&sa)->sin6_port = htons(0);
|
|
+ break;
|
|
+#endif
|
|
+ default:
|
|
+ syslog(LOG_ERR, "getsockname: unsupported family %d",
|
|
+ ((struct sockaddr *) &here)->sa_family);
|
|
+ return (result);
|
|
+ }
|
|
+
|
|
+ s = socket(((struct sockaddr*)&here)->sa_family, SOCK_STREAM, 0);
|
|
+ if (s == -1) {
|
|
syslog(LOG_ERR, "socket: %m");
|
|
return (result);
|
|
}
|
|
|
|
- sin = here;
|
|
- sin.sin_port = htons(0);
|
|
- if (bind(s, (struct sockaddr *) &sin, sizeof(sin)) == -1) {
|
|
+ if (bind(s, (struct sockaddr *) &sa, length) == -1) {
|
|
syslog(LOG_ERR, "bind: %m");
|
|
close(s);
|
|
return (result);
|
|
}
|
|
|
|
+ /* Set up timer so we won't get stuck. */
|
|
+
|
|
signal(SIGALRM, timeout);
|
|
- if (sigsetjmp(timebuf)) {
|
|
+ if (sigsetjmp(timebuf, 0)) {
|
|
close(s); /* not: fclose(fp) */
|
|
return (result);
|
|
}
|
|
alarm(TIMEOUT);
|
|
|
|
+ /* ports */
|
|
+ there_port = ntohs(((struct sockaddr_in *)there)->sin_port);
|
|
+ here_port = ntohs(((struct sockaddr_in *)&here)->sin_port);
|
|
+
|
|
/* Connect to the RFC931 daemon. */
|
|
|
|
- sin = *there;
|
|
- sin.sin_port = htons(RFC931_PORT);
|
|
- if (connect(s, (struct sockaddr *) &sin, sizeof(sin)) == -1) {
|
|
+ length = SA_LEN((struct sockaddr *)there);
|
|
+ memcpy(&sa, there, length);
|
|
+ switch(((struct sockaddr *) there)->sa_family) {
|
|
+ case AF_INET:
|
|
+ ((struct sockaddr_in *)&sa)->sin_port = htons(RFC931_PORT);
|
|
+ break;
|
|
+#ifdef INET6
|
|
+ case AF_INET6:
|
|
+ ((struct sockaddr_in6 *)&sa)->sin6_port = htons(RFC931_PORT);
|
|
+ break;
|
|
+#endif
|
|
+ default:
|
|
+ syslog(LOG_ERR, "unsupported remote family %u",
|
|
+ ((struct sockaddr *) there)->sa_family);
|
|
+ close(s);
|
|
+ alarm(0);
|
|
+ return result;
|
|
+ }
|
|
+
|
|
+ if (connect(s, (struct sockaddr *) &sa, length) == -1) {
|
|
close(s);
|
|
alarm(0);
|
|
return (result);
|
|
@@ -1195,7 +1362,7 @@
|
|
|
|
/* Query the RFC 931 server. Would 13-byte writes ever be broken up? */
|
|
snprintf(buf, sizeof(buf), "%u,%u\r\n",
|
|
- ntohs(there->sin_port), ntohs(here.sin_port));
|
|
+ there_port, here_port);
|
|
|
|
|
|
for (len = 0, cp = buf; len < strlen(buf); ) {
|
|
@@ -1224,11 +1391,11 @@
|
|
*cp = '\0';
|
|
|
|
if (sscanf(buf, "%u , %u : USERID :%*[^:]:%255s", &remote, &local, user) == 3
|
|
- && ntohs(there->sin_port) == remote
|
|
- && ntohs(here.sin_port) == local) {
|
|
+ && there_port == remote
|
|
+ && here_port == local) {
|
|
|
|
/* Strip trailing carriage return. */
|
|
- if (cp = strchr(user, '\r'))
|
|
+ if ((cp = strchr(user, '\r')) != NULL)
|
|
*cp = 0;
|
|
result = user;
|
|
}
|
|
diff -Nru netkit-base-0.17/inetd/pathnames.h netkit-base/inetd/pathnames.h
|
|
--- netkit-base-0.17/inetd/pathnames.h 2000-07-23 01:00:05.000000000 +0200
|
|
+++ netkit-base/inetd/pathnames.h 2001-04-03 22:33:59.000000000 +0200
|
|
@@ -36,6 +36,14 @@
|
|
|
|
#include <paths.h>
|
|
|
|
+#ifndef _PATH_INETDCONF
|
|
#define _PATH_INETDCONF "/etc/inetd.conf"
|
|
+#endif
|
|
+
|
|
+#ifndef _PATH_INETDPID
|
|
#define _PATH_INETDPID "/var/run/inetd.pid"
|
|
+#endif
|
|
+
|
|
+#ifndef _PATH_INETD
|
|
#define _PATH_INETD "/usr/sbin/inetd"
|
|
+#endif
|
|
diff -Nru netkit-base-0.17/inetd/servtab.c netkit-base/inetd/servtab.c
|
|
--- netkit-base-0.17/inetd/servtab.c 2000-07-22 22:20:50.000000000 +0200
|
|
+++ netkit-base/inetd/servtab.c 2001-01-29 19:38:19.000000000 +0100
|
|
@@ -1,3 +1,34 @@
|
|
+/* $USAGI: servtab.c,v 1.10 2001/01/29 18:38:19 yoshfuji Exp $ */
|
|
+
|
|
+/*
|
|
+ * Copyright (C) 2001 USAGI/WIDE Project.
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * Redistribution and use in source and binary forms, with or without
|
|
+ * modification, are permitted provided that the following conditions
|
|
+ * are met:
|
|
+ * 1. Redistributions of source code must retain the above copyright
|
|
+ * notice, this list of conditions and the following disclaimer.
|
|
+ * 2. Redistributions in binary form must reproduce the above copyright
|
|
+ * notice, this list of conditions and the following disclaimer in the
|
|
+ * documentation and/or other materials provided with the distribution.
|
|
+ * 3. Neither the name of the project nor the names of its contributors
|
|
+ * may be used to endorse or promote products derived from this software
|
|
+ * without specific prior written permission.
|
|
+ *
|
|
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
|
|
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
|
|
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
+ * SUCH DAMAGE.
|
|
+ */
|
|
+
|
|
/*
|
|
* Copyright (c) 1983, 1991 The Regents of the University of California.
|
|
* All rights reserved.
|
|
@@ -42,6 +73,9 @@
|
|
#include <unistd.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
+#ifdef MULOG
|
|
+#include <ctype.h>
|
|
+#endif
|
|
|
|
#include "inetd.h"
|
|
#include "servtab.h"
|
|
@@ -49,6 +83,10 @@
|
|
#include "sig.h"
|
|
#include "mysleep.h"
|
|
|
|
+#ifdef INET6
|
|
+#include <netinet/ip6.h>
|
|
+#endif
|
|
+
|
|
char servtab_rcsid[] =
|
|
"$Id: servtab.c,v 1.6 2000/07/22 20:20:50 dholland Exp $";
|
|
|
|
@@ -104,6 +142,7 @@
|
|
{
|
|
struct servtab *sep;
|
|
for (sep = servtab; sep; sep = sep->se_next) {
|
|
+ if (sep->se_family != cp->se_family) continue;
|
|
if (strcmp(sep->se_service, cp->se_service)) continue;
|
|
if (strcmp(sep->se_proto, cp->se_proto)) continue;
|
|
|
|
@@ -123,8 +162,21 @@
|
|
if (sep->se_address==NULL || cp->se_address==NULL) continue;
|
|
|
|
/* Don't bother to compare the hostnames, just the IPs */
|
|
- if (sep->se_ctrladdr_in.sin_addr.s_addr ==
|
|
- cp->se_ctrladdr_in.sin_addr.s_addr) return sep;
|
|
+ switch(sep->se_family) {
|
|
+#ifdef INET6
|
|
+ case AF_INET6:
|
|
+ if (memcmp(&sep->se_ctrladdr_in6.sin6_addr,
|
|
+ &cp->se_ctrladdr_in6.sin6_addr,
|
|
+ sizeof(struct in6_addr)) == 0) return sep;
|
|
+ break;
|
|
+#endif
|
|
+ case AF_INET:
|
|
+ if (sep->se_ctrladdr_in.sin_addr.s_addr ==
|
|
+ cp->se_ctrladdr_in.sin_addr.s_addr) return sep;
|
|
+ break;
|
|
+ default:
|
|
+ /*XXX*/
|
|
+ }
|
|
}
|
|
return NULL;
|
|
}
|
|
@@ -144,49 +196,6 @@
|
|
return rv;
|
|
}
|
|
|
|
-/********* exit-resistant malloc ************************/
|
|
-
|
|
-/*
|
|
- * On many systems, including presently Linux, this is bloat because
|
|
- * malloc never returns null - if the system runs out of swap, it
|
|
- * panics or randomly starts killing processes or does other weird
|
|
- * stuff. However, it doesn't hurt to be prepared. This is the only
|
|
- * place inetd can actually exit due to failure, now.
|
|
- */
|
|
-
|
|
-void *
|
|
-domalloc(size_t len)
|
|
-{
|
|
- static int retries[] = { 2, 10, 60, 600, -1 };
|
|
- void *p;
|
|
- int try = 0;
|
|
-
|
|
- while (retries[try]>0) {
|
|
- p = malloc(len);
|
|
- if (p != NULL) {
|
|
- return p;
|
|
- }
|
|
-
|
|
- syslog(LOG_ERR, "Out of memory - retrying in %d seconds.",
|
|
- retries[try]);
|
|
- mysleep(retries[try]);
|
|
- try++;
|
|
- }
|
|
- /* Should this be LOG_EMERG? */
|
|
- syslog(LOG_ALERT, "Out of memory - GIVING UP!");
|
|
- exit(100);
|
|
- return NULL; /* unreachable */
|
|
-}
|
|
-
|
|
-char *
|
|
-dostrdup(const char *cp)
|
|
-{
|
|
- char *x = domalloc(strlen(cp)+1);
|
|
- strcpy(x, cp);
|
|
- return x;
|
|
-}
|
|
-
|
|
-
|
|
/********* config parser ********************************/
|
|
|
|
static void loadconfigent(struct servtab *cp);
|
|
@@ -194,203 +203,6 @@
|
|
static FILE *fconfig = NULL;
|
|
|
|
|
|
-#if 0 /* old version */
|
|
-static struct servtab serv;
|
|
-static char line[256];
|
|
-
|
|
-static
|
|
-char *
|
|
-nextline(FILE *fd)
|
|
-{
|
|
- char *cp;
|
|
-
|
|
- if (fgets(line, sizeof (line), fd) == NULL)
|
|
- return ((char *)0);
|
|
- cp = strchr(line, '\n');
|
|
- if (cp)
|
|
- *cp = '\0';
|
|
- return (line);
|
|
-}
|
|
-
|
|
-static
|
|
-char *
|
|
-skip(char **cpp)
|
|
-{
|
|
- register char *cp = *cpp;
|
|
- char *start;
|
|
-
|
|
- if (*cpp == NULL)
|
|
- return ((char *)0);
|
|
-
|
|
-again:
|
|
- while (*cp == ' ' || *cp == '\t')
|
|
- cp++;
|
|
- if (*cp == '\0') {
|
|
- int c;
|
|
-
|
|
- c = getc(fconfig);
|
|
- (void) ungetc(c, fconfig);
|
|
- if (c == ' ' || c == '\t')
|
|
- if ((cp = nextline(fconfig))!=NULL)
|
|
- goto again;
|
|
- *cpp = NULL;
|
|
- return NULL;
|
|
- }
|
|
- start = cp;
|
|
- while (*cp && *cp != ' ' && *cp != '\t')
|
|
- cp++;
|
|
- if (*cp != '\0')
|
|
- *cp++ = '\0';
|
|
- *cpp = cp;
|
|
- return (start);
|
|
-}
|
|
-
|
|
-static
|
|
-struct servtab *
|
|
-getconfigent(void)
|
|
-{
|
|
- register struct servtab *sep = &serv;
|
|
- int argc;
|
|
- char *cp, *arg;
|
|
-
|
|
-more:
|
|
- while ((cp = nextline(fconfig)) && *cp == '#')
|
|
- ;
|
|
-
|
|
- if (cp == NULL) {
|
|
- return NULL;
|
|
- }
|
|
-
|
|
- memset(sep, 0, sizeof(*sep));
|
|
- sep->se_service = dostrdup(skip(&cp));
|
|
- arg = skip(&cp);
|
|
- if (arg == NULL)
|
|
- goto more;
|
|
-
|
|
- if (strcmp(arg, "stream") == 0)
|
|
- sep->se_socktype = SOCK_STREAM;
|
|
- else if (strcmp(arg, "dgram") == 0)
|
|
- sep->se_socktype = SOCK_DGRAM;
|
|
- else if (strcmp(arg, "rdm") == 0)
|
|
- sep->se_socktype = SOCK_RDM;
|
|
- else if (strcmp(arg, "seqpacket") == 0)
|
|
- sep->se_socktype = SOCK_SEQPACKET;
|
|
- else if (strcmp(arg, "raw") == 0)
|
|
- sep->se_socktype = SOCK_RAW;
|
|
- else
|
|
- sep->se_socktype = -1;
|
|
-
|
|
- sep->se_proto = dostrdup(skip(&cp));
|
|
- if (strcmp(sep->se_proto, "unix") == 0) {
|
|
- sep->se_family = AF_UNIX;
|
|
- } else {
|
|
- sep->se_family = AF_INET;
|
|
- if (strncmp(sep->se_proto, "rpc/", 4) == 0) {
|
|
-#ifdef RPC
|
|
- char *cp1, *ccp;
|
|
- cp1 = index(sep->se_service, '/');
|
|
- if (cp1 == NULL) {
|
|
- syslog(LOG_ERR, "%s: no rpc version",
|
|
- sep->se_service);
|
|
- goto more;
|
|
- }
|
|
- *cp1++ = '\0';
|
|
- sep->se_rpcversl =
|
|
- sep->se_rpcversh = strtol(cp1, &ccp, 0);
|
|
- if (ccp == cp1) {
|
|
- badafterall:
|
|
- syslog(LOG_ERR, "%s/%s: bad rpc version",
|
|
- sep->se_service, cp1);
|
|
- goto more;
|
|
- }
|
|
- if (*ccp == '-') {
|
|
- cp1 = ccp + 1;
|
|
- sep->se_rpcversh = strtol(cp1, &ccp, 0);
|
|
- if (ccp == cp1)
|
|
- goto badafterall;
|
|
- }
|
|
-#else
|
|
- syslog(LOG_ERR, "%s: rpc services not supported",
|
|
- sep->se_service);
|
|
- goto more;
|
|
-#endif /* RPC */
|
|
- }
|
|
- }
|
|
- arg = skip(&cp);
|
|
- if (arg == NULL)
|
|
- goto more;
|
|
- {
|
|
- char *s = index(arg, '.');
|
|
- if (s) {
|
|
- *s++ = '\0';
|
|
- sep->se_max = atoi(s);
|
|
- } else
|
|
- sep->se_max = TOOMANY;
|
|
- }
|
|
- sep->se_wait = strcmp(arg, "wait") == 0;
|
|
- sep->se_user = dostrdup(skip(&cp));
|
|
- sep->se_group = strchr(sep->se_user, '.');
|
|
- if (sep->se_group) {
|
|
- *sep->se_group++ = '\0';
|
|
- }
|
|
- sep->se_server = dostrdup(skip(&cp));
|
|
- if (strcmp(sep->se_server, "internal") == 0) {
|
|
- register struct biltin *bi;
|
|
-
|
|
- for (bi = biltins; bi->bi_service; bi++)
|
|
- if (bi->bi_socktype == sep->se_socktype &&
|
|
- strcmp(bi->bi_service, sep->se_service) == 0)
|
|
- break;
|
|
- if (bi->bi_service == 0) {
|
|
- syslog(LOG_ERR, "internal service %s unknown\n",
|
|
- sep->se_service);
|
|
- goto more;
|
|
- }
|
|
- sep->se_bi = bi;
|
|
- sep->se_wait = bi->bi_wait;
|
|
- } else
|
|
- sep->se_bi = NULL;
|
|
- argc = 0;
|
|
- for (arg = skip(&cp); cp; arg = skip(&cp)) {
|
|
-#if MULOG
|
|
- char *colon, *rindex();
|
|
-
|
|
- if (argc == 0 && (colon = rindex(arg, ':'))) {
|
|
- while (arg < colon) {
|
|
- int x;
|
|
- char *ccp;
|
|
-
|
|
- switch (*arg++) {
|
|
- case 'l':
|
|
- x = 1;
|
|
- if (isdigit(*arg)) {
|
|
- x = strtol(arg, &ccp, 0);
|
|
- if (ccp == arg)
|
|
- break;
|
|
- arg = ccp;
|
|
- }
|
|
- sep->se_log &= ~MULOG_RFC931;
|
|
- sep->se_log |= x;
|
|
- break;
|
|
- case 'a':
|
|
- sep->se_log |= MULOG_RFC931;
|
|
- break;
|
|
- default:
|
|
- break;
|
|
- }
|
|
- }
|
|
- arg = colon + 1;
|
|
- }
|
|
-#endif
|
|
- if (argc < MAXARGV)
|
|
- sep->se_argv[argc++] = dostrdup(arg);
|
|
- }
|
|
- while (argc <= MAXARGV)
|
|
- sep->se_argv[argc++] = NULL;
|
|
- return (sep);
|
|
-}
|
|
-#else /* new version begins here */
|
|
-
|
|
struct wordmap {
|
|
const char *word;
|
|
int val;
|
|
@@ -434,8 +246,18 @@
|
|
const char *
|
|
assemble_entry(struct servtab *sep, int nfields, char **fields)
|
|
{
|
|
+ char *proto;
|
|
+ int use_family = PF_UNSPEC;
|
|
+#ifdef INET6
|
|
+ int use_v6only = 0;
|
|
+ struct sockaddr_storage service_home;
|
|
+ struct addrinfo hints, *res0, *res;
|
|
+ char *serv = "discard"; /* discard(dummy) */
|
|
+ int err;
|
|
+#else
|
|
struct in_addr service_home;
|
|
struct hostent *hp;
|
|
+#endif
|
|
char *s, *t;
|
|
int i;
|
|
|
|
@@ -444,33 +266,138 @@
|
|
}
|
|
|
|
memset(sep, 0, sizeof(*sep));
|
|
+ memset(&service_home, 0, sizeof(service_home));
|
|
+
|
|
+ proto = fields[2];
|
|
+ if (!strcmp(fields[2], "unix")) {
|
|
+ use_family = PF_UNIX;
|
|
+ } else {
|
|
+ char *p = strchr(proto, '/');
|
|
+ if (p)
|
|
+ proto = p + 1;
|
|
+
|
|
+ if (strncmp(proto, "udp", 3) == 0 ||
|
|
+ strncmp(proto, "tcp", 3) == 0) {
|
|
+ int len = strlen(proto);
|
|
+
|
|
+ switch(len) {
|
|
+ case 3:
|
|
+ use_family = PF_INET;
|
|
+ break;
|
|
+ case 4:
|
|
+ if (*(proto + 3) == '4')
|
|
+ use_family = PF_INET;
|
|
+#ifdef INET6
|
|
+ else if (*(proto + 3) == '6') {
|
|
+ use_family = PF_INET6;
|
|
+ use_v6only = 1;
|
|
+ }
|
|
+#endif
|
|
+ else
|
|
+ return "Invalid / unsupported protocol";
|
|
+ break;
|
|
+ case 5:
|
|
+#ifdef INET6
|
|
+ if (strcmp(proto + 3, "46") == 0)
|
|
+ use_family = PF_INET6;
|
|
+ else
|
|
+#endif
|
|
+ return "Invalid / unsupported protocol";
|
|
+ break;
|
|
+ default:
|
|
+ return "Invalid / unsupported protocol";
|
|
+ }
|
|
|
|
+ /* now we shall set the protocol name back to the
|
|
+ standard value. */
|
|
+ *(proto + 3) = '\0';
|
|
+ }
|
|
+ }
|
|
+
|
|
s = strchr(fields[0], '@');
|
|
if (s) {
|
|
*s++ = 0;
|
|
sep->se_address = s;
|
|
- hp = gethostbyname(s);
|
|
- if (hp==NULL) return "Service hostname/address not found";
|
|
- memcpy(&service_home, hp->h_addr, sizeof(service_home));
|
|
- }
|
|
- else {
|
|
- service_home.s_addr = INADDR_ANY;
|
|
- }
|
|
- sep->se_service = fields[0];
|
|
- sep->se_socktype = map_word(socket_types, fields[1]);
|
|
- free(fields[1]);
|
|
|
|
- sep->se_proto = fields[2];
|
|
- if (!strcmp(sep->se_proto, "unix")) {
|
|
- sep->se_family = AF_UNIX;
|
|
- if (sep->se_address!=NULL) {
|
|
+ if (use_family == PF_UNIX) {
|
|
return "@host given for unix socket";
|
|
}
|
|
}
|
|
- else {
|
|
- sep->se_family = AF_INET;
|
|
+
|
|
+#ifdef INET6
|
|
+ memset(&hints, 0, sizeof(hints));
|
|
+ hints.ai_family = use_family;
|
|
+ hints.ai_flags = AI_PASSIVE;
|
|
+
|
|
+ err = getaddrinfo(s, s ? NULL : serv, &hints, &res0);
|
|
+ if (err)
|
|
+ return gai_strerror(err);
|
|
+
|
|
+ for (res=res0; res; res=res->ai_next){
|
|
+ switch(res->ai_family){
|
|
+ case PF_INET:
|
|
+ ((struct sockaddr_in*)res->ai_addr)->sin_port = 0;
|
|
+ break;
|
|
+ case PF_INET6:
|
|
+ ((struct sockaddr_in6*)res->ai_addr)->sin6_port = 0;
|
|
+ break;
|
|
+ case PF_UNIX:
|
|
+ ((struct sockaddr_un*)res->ai_addr)->sun_path[0] = 0;
|
|
+ break;
|
|
+ default:
|
|
+ /*XXX*/
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (res0==NULL)
|
|
+ return "Service hostname/address not found";
|
|
+
|
|
+ if ((size_t)res0->ai_addrlen > sizeof(sep->se_ctrladdr_storage)) {
|
|
+ freeaddrinfo(res0);
|
|
+ return "sockaddr got from getaddrinfo() was too large";
|
|
+ }
|
|
+
|
|
+ memcpy(&service_home, res0->ai_addr, res0->ai_addrlen);
|
|
+ sep->se_ctrladdr_storage = service_home;
|
|
+ sep->se_ctrladdr_size = res0->ai_addrlen;
|
|
+ if (use_v6only)
|
|
+ sep->se_sockopt_ipv6_only = 1;
|
|
+
|
|
+ freeaddrinfo(res0);
|
|
+#else
|
|
+ switch (use_family) {
|
|
+ case PF_INET:
|
|
+ if (s) {
|
|
+ hp = gethostbyname(s);
|
|
+ if (hp==NULL)
|
|
+ return "Service hostname/address not found";
|
|
+ memcpy(&service_home, hp->h_addr, sizeof(service_home));
|
|
+ }
|
|
+ else
|
|
+ service_home.s_addr = INADDR_ANY;
|
|
+ sep->se_ctrladdr_size = sizeof(struct sockaddr_in);
|
|
+ sep->se_ctrladdr_in.sin_family = PF_INET;
|
|
sep->se_ctrladdr_in.sin_addr = service_home;
|
|
+ break;
|
|
+ case PF_UNIX:
|
|
+ sep->se_ctrladdr_size = sizeof(struct sockaddr_un);
|
|
+ sep->se_ctrladdr_un.sun_family = PF_UNIX;
|
|
+ strncpy(sep->se_ctrladdr_un.sun_path, sep->se_service,
|
|
+ sizeof(sep->se_ctrladdr_un.sun_path));
|
|
+ sep->se_ctrladdr_un.sun_path[sizeof(sep->se_ctrladdr_un.sun_path)-1] = '\0';
|
|
+ break;
|
|
+ default:
|
|
+ /*XXX*/
|
|
+ }
|
|
+#endif
|
|
+
|
|
+ sep->se_family = use_family;
|
|
+ sep->se_socktype = map_word(socket_types, fields[1]);
|
|
+ sep->se_proto = proto;
|
|
+ sep->se_service = fields[0];
|
|
|
|
+ if (strcmp(fields[2], "unix")) {
|
|
if (!strncmp(sep->se_proto, "rpc/", 4)) {
|
|
#ifdef RPC
|
|
s = strchr(sep->se_service, '/');
|
|
@@ -501,7 +428,6 @@
|
|
sep->se_max = TOOMANY;
|
|
}
|
|
sep->se_wait = !strcmp(fields[3], "wait");
|
|
- free(fields[3]);
|
|
|
|
s = strchr(fields[4], '.');
|
|
if (s) {
|
|
@@ -527,6 +453,35 @@
|
|
|
|
/* The rest are argv[]. */
|
|
for (i=6; i<nfields; i++) {
|
|
+#ifdef MULOG
|
|
+ char *arg = fields[i], *colon;
|
|
+ if (i == 6 && (colon = rindex(arg, ':'))) {
|
|
+ while (arg < colon) {
|
|
+ int x;
|
|
+ char *ccp;
|
|
+
|
|
+ switch (*arg++) {
|
|
+ case 'l':
|
|
+ x = 1;
|
|
+ if (isdigit(*arg)) {
|
|
+ x = strtol(arg, &ccp, 0);
|
|
+ if (ccp == arg)
|
|
+ break;
|
|
+ arg = ccp;
|
|
+ }
|
|
+ sep->se_log &= ~MULOG_RFC931;
|
|
+ sep->se_log |= x;
|
|
+ break;
|
|
+ case 'a':
|
|
+ sep->se_log |= MULOG_RFC931;
|
|
+ break;
|
|
+ default:
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ memmove(fields[i], colon+1, strlen(colon+1)+1);
|
|
+ }
|
|
+#endif
|
|
sep->se_argv[i-6] = fields[i];
|
|
}
|
|
|
|
@@ -535,6 +490,8 @@
|
|
sep->se_argv[0] = dostrdup(sep->se_server);
|
|
}
|
|
|
|
+ free(fields[1]);
|
|
+ free(fields[3]);
|
|
return NULL;
|
|
}
|
|
|
|
@@ -604,6 +561,9 @@
|
|
if (errmsg) {
|
|
syslog(LOG_WARNING, "Bad config for %s: %s"
|
|
" (skipped)", fields[0], errmsg);
|
|
+ /* fix memory leak */
|
|
+ while (nfields)
|
|
+ free(fields[--nfields]);
|
|
}
|
|
else {
|
|
sendents(&assm);
|
|
@@ -630,8 +590,6 @@
|
|
}
|
|
}
|
|
|
|
-#endif
|
|
-
|
|
/********* config loading ****************************************/
|
|
|
|
static int
|
|
@@ -725,8 +683,13 @@
|
|
* to key the table by port and protocol, not service name
|
|
* and protocol.
|
|
*/
|
|
+#ifdef INET6
|
|
+ if ((cp->se_family==AF_INET || cp->se_family==AF_INET6) &&
|
|
+ !isrpcservice(cp)) {
|
|
+#else
|
|
if (cp->se_family==AF_INET && !isrpcservice(cp)) {
|
|
- u_short port = htons(atoi(cp->se_service));
|
|
+#endif
|
|
+ u_short port = atoi(cp->se_service);
|
|
|
|
if (!port) {
|
|
struct servent *sp;
|
|
@@ -830,8 +793,17 @@
|
|
setup(sep);
|
|
break;
|
|
case AF_INET:
|
|
- sep->se_ctrladdr_in.sin_family = AF_INET;
|
|
- sep->se_ctrladdr_size = sizeof sep->se_ctrladdr_in;
|
|
+#ifdef INET6
|
|
+ case AF_INET6:
|
|
+#endif
|
|
+ sep->se_family = sep->se_family;
|
|
+#ifdef INET6
|
|
+ sep->se_ctrladdr_size = sep->se_family == AF_INET ?
|
|
+ sizeof(struct sockaddr_in) :
|
|
+ sizeof(struct sockaddr_in6);
|
|
+#else
|
|
+ sep->se_ctrladdr_size = sizeof(struct sockaddr_in);
|
|
+#endif
|
|
if (isrpcservice(sep)) {
|
|
struct rpcent *rp;
|
|
|
|
@@ -852,7 +824,7 @@
|
|
register_rpc(sep);
|
|
}
|
|
else {
|
|
- u_short port = htons(atoi(sep->se_service));
|
|
+ u_short port = atoi(sep->se_service);
|
|
|
|
if (!port) {
|
|
struct servent *sp;
|
|
@@ -864,10 +836,20 @@
|
|
service_name(sep));
|
|
return;
|
|
}
|
|
- port = sp->s_port;
|
|
- }
|
|
- if (port != sep->se_ctrladdr_in.sin_port) {
|
|
- sep->se_ctrladdr_in.sin_port = port;
|
|
+ /* the s_port field of the struct servent
|
|
+ * returned by getservbyname is already in
|
|
+ * network byte order, so there is no need
|
|
+ * to call htons on sp->s_port. */
|
|
+ port = ntohs(sp->s_port);
|
|
+ }
|
|
+ if (port != sockaddr_port(&(sep->se_ctrladdr),
|
|
+ sep->se_ctrladdr_size)) {
|
|
+#ifdef INET6
|
|
+ if (sep->se_family == AF_INET6)
|
|
+ sep->se_ctrladdr_in6.sin6_port = htons(port);
|
|
+ else
|
|
+#endif
|
|
+ sep->se_ctrladdr_in.sin_port = htons(port);
|
|
if (sep->se_fd != -1) {
|
|
closeit(sep);
|
|
}
|
|
@@ -891,13 +873,8 @@
|
|
}
|
|
for (sep = servtab; sep; sep = sep->se_next)
|
|
sep->se_checked = 0;
|
|
-#if 0 /* old version */
|
|
- while ((cp = getconfigent())!=NULL) {
|
|
- loadconfigent(cp);
|
|
- }
|
|
-#else
|
|
+
|
|
loadconfigfile(loadconfigent);
|
|
-#endif
|
|
|
|
endconfig();
|
|
/*
|
|
@@ -934,6 +911,9 @@
|
|
if (sep->se_fd == -1) {
|
|
switch (sep->se_family) {
|
|
case AF_UNIX:
|
|
+#ifdef INET6
|
|
+ case AF_INET6:
|
|
+#endif
|
|
case AF_INET:
|
|
setup(sep);
|
|
if (sep->se_fd != -1 && isrpcservice(sep))
|
|
diff -Nru netkit-base-0.17/inetd/servtab.h netkit-base/inetd/servtab.h
|
|
--- netkit-base-0.17/inetd/servtab.h 1999-08-23 09:22:30.000000000 +0200
|
|
+++ netkit-base/inetd/servtab.h 2001-01-28 02:31:14.000000000 +0100
|
|
@@ -1,3 +1,5 @@
|
|
+/* $USAGI: servtab.h,v 1.6 2001/01/28 01:31:14 yoshfuji Exp $ */
|
|
+
|
|
#define MAXARGV 20
|
|
|
|
struct servtab;
|
|
@@ -31,6 +33,10 @@
|
|
struct sockaddr se_un_ctrladdr;
|
|
struct sockaddr_in se_un_ctrladdr_in;
|
|
struct sockaddr_un se_un_ctrladdr_un;
|
|
+#ifdef INET6
|
|
+ struct sockaddr_in6 se_un_ctrladdr_in6;
|
|
+ struct sockaddr_storage se_un_ctrladdr_storage;
|
|
+#endif
|
|
} se_un; /* bound address */
|
|
int se_ctrladdr_size;
|
|
int se_max; /* max # of instances of this service */
|
|
@@ -40,6 +46,9 @@
|
|
int se_log;
|
|
#define MULOG_RFC931 0x40000000
|
|
#endif
|
|
+#ifdef INET6
|
|
+ int se_sockopt_ipv6_only;
|
|
+#endif
|
|
struct servtab *se_next;
|
|
};
|
|
|
|
@@ -47,6 +56,10 @@
|
|
#define se_ctrladdr_in se_un.se_un_ctrladdr_in
|
|
#define se_ctrladdr_un se_un.se_un_ctrladdr_un
|
|
|
|
+#ifdef INET6
|
|
+#define se_ctrladdr_in6 se_un.se_un_ctrladdr_in6
|
|
+#define se_ctrladdr_storage se_un.se_un_ctrladdr_storage
|
|
+#endif
|
|
|
|
extern struct servtab *servtab;
|
|
|
|
diff -Nru netkit-base-0.17/ping/Makefile netkit-base/ping/Makefile
|
|
--- netkit-base-0.17/ping/Makefile 2000-02-04 10:38:37.000000000 +0100
|
|
+++ netkit-base/ping/Makefile 2001-01-27 06:57:08.000000000 +0100
|
|
@@ -9,7 +9,9 @@
|
|
ping.o: ../version.h pingpack.h
|
|
|
|
install: ping
|
|
+ install -d $(INSTALLROOT)$(ROOTBINDIR)
|
|
install -s -o root -m$(SUIDMODE) ping $(INSTALLROOT)$(ROOTBINDIR)
|
|
+ install -d $(INSTALLROOT)$(MANDIR)/man8
|
|
install -m$(MANMODE) ping.8 $(INSTALLROOT)$(MANDIR)/man8
|
|
|
|
clean:
|