Request 299 was acted upon.
This is a comment. It is not sent to the Requestor(s).
_________________________________________________________________________
URL: https://rt.openpkg.org/id/299
Ticket: [OpenPKG #299]
Subject: Can't compile tcpwrappers-7.6k-20031021.src.rpm on Solaris 9
Requestors: [EMAIL PROTECTED]
Queue: openpkg
Owner: Nobody
Status: new
Transaction: Comentarios aÃadidos por ms
Time: Mie. Dic. 03 12:47:12 2003
_________________________________________________________________________
More helpful code from Matthias KURZ follows, as found on
http://www.mail-archive.com/openpkg-dev%40openpkg.org/msg11251.html
--
Michael Schloh v. Bennewitz
OpenPKG Developer
[EMAIL PROTECTED]
tcpwrappers
-----------
- changes to make it compile under Solaris
- changes to let it run on machines that do not have IPv6 enabled
I did not know how to test the TLI part, because i have no test case.
The whole thing (with or without my patches) will not run on Solaris
versions before Solaris 8, i think.
Index: Makefile
===================================================================
RCS file: /cvs/opkg/vendor_stuff/tcpwrappers/Makefile,v
retrieving revision 1.1.1.1
diff -u -u -r1.1.1.1 Makefile
--- Makefile 3 Jan 2003 18:52:40 -0000 1.1.1.1
+++ Makefile 11 Nov 2003 00:18:26 -0000
@@ -128,12 +128,12 @@
386bsd netbsd bsdos:
@make REAL_DAEMON_DIR=$(REAL_DAEMON_DIR) STYLE=$(STYLE) \
LIBS= RANLIB=ranlib ARFLAGS=rv AUX_OBJ= NETGROUP= TLI= \
- EXTRA_CFLAGS=VSYSLOG= all
+ EXTRA_CFLAGS= VSYSLOG= all
freebsd:
@make REAL_DAEMON_DIR=$(REAL_DAEMON_DIR) STYLE=$(STYLE) \
LIBS= RANLIB=ranlib ARFLAGS=rv AUX_OBJ= NETGROUP= TLI= \
- EXTRA_CFLAGS=VSYSLOG= all
+ EXTRA_CFLAGS=-I. VSYSLOG= all
linux:
@make REAL_DAEMON_DIR=$(REAL_DAEMON_DIR) STYLE=$(STYLE) \
@@ -183,11 +183,15 @@
# SunOS 5.x is another SYSV4 variant.
sunos5:
- @make REAL_DAEMON_DIR=$(REAL_DAEMON_DIR) STYLE=$(STYLE) \
- LIBS="-lsocket -lnsl" RANLIB=echo ARFLAGS=rv VSYSLOG= \
+ @case `uname -r` in \
+ 5.6) RTLIB="-lposix4";; \
+ *) RTLIB="-lrt";; \
+ esac; \
+ make REAL_DAEMON_DIR=$(REAL_DAEMON_DIR) STYLE=$(STYLE) \
+ LIBS="-lsocket -lnsl $$RTLIB" RANLIB=echo ARFLAGS=rv VSYSLOG= \
NETGROUP=-DNETGROUP AUX_OBJ=setenv.o TLI=-DTLI \
BUGS="$(BUGS)" all \
- EXTRA_CFLAGS=-DNEED_SETENV
+ EXTRA_CFLAGS="-DNEED_SETENV -DNEED_GETOPT"
# Generic SYSV40
esix sysv4:
Index: fix_options.c
===================================================================
RCS file: /cvs/opkg/vendor_stuff/tcpwrappers/fix_options.c,v
retrieving revision 1.1.1.1
diff -u -u -r1.1.1.1 fix_options.c
--- fix_options.c 5 Jan 2003 01:27:10 -0000 1.1.1.1
+++ fix_options.c 11 Nov 2003 00:18:26 -0000
@@ -47,7 +47,14 @@
clean_exit(request);
}
if (ADDR_FAM(&ss) == AF_INET) {
+#if defined(__FreeBSD__) || defined(__sun__)
+ unsigned char optbuf[BUFFER_SIZE / 3];
+ int optlen;
+ struct in_addr dummy;
+ unsigned char *ucp;
+#else
struct ip_opts optbuf;
+#endif
char lbuf[BUFFER_SIZE], *lp, *cp;
struct protoent *ip;
int optsize = sizeof(optbuf);
@@ -65,9 +72,15 @@
* here was wrong.
*/
+#if defined(__FreeBSD__) || defined(__sun__)
+#define ADDR_LEN sizeof(dummy.s_addr)
+ for (ucp = optbuf + ADDR_LEN; ucp < optbuf + optsize; ucp += optlen) {
+ u_char c = ucp[IPOPT_OPTVAL];
+#else
for (i = 0; (void *)&optbuf.ip_opts[i] - (void *)&optbuf <
optsize; ) {
u_char c = (u_char)optbuf.ip_opts[i];
+#endif
if (c == IPOPT_LSRR || c == IPOPT_SSRR) {
syslog(LOG_WARNING,
"refused connect from %s with IP source routing options",
@@ -77,7 +90,17 @@
}
if (c == IPOPT_EOL)
break;
+#if defined(__FreeBSD__) || defined(__sun__)
+ if (c == IPOPT_NOP)
+ optlen = 1;
+ else {
+ optlen = cp[IPOPT_OLEN];
+ if (optlen <= 0) /* Do not loop! */
+ break;
+ }
+#else
i += (c == IPOPT_NOP) ? 1 : (u_char)optbuf.ip_opts[i+1];
+#endif
}
lp = lbuf;
Index: internal.h
===================================================================
RCS file: /cvs/opkg/vendor_stuff/tcpwrappers/internal.h,v
retrieving revision 1.1.1.1
diff -u -u -r1.1.1.1 internal.h
--- internal.h 4 Jan 2003 23:37:53 -0000 1.1.1.1
+++ internal.h 11 Nov 2003 00:18:26 -0000
@@ -7,6 +7,7 @@
#ifndef IMPL_HEADER
#define IMPL_HEADER
+#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
@@ -20,6 +21,12 @@
#define SAIN6( p ) ( (struct sockaddr_in6 *) (p) )
#define ADDR_FAM( p ) ( (p)->sa.sa_family )
+/* Convert IPv4 address that was mapped to an IPv6 address back to IPv4 */
+#ifndef IN6_V4MAPPED_TO_INADDR
+#define IN6_V4MAPPED_TO_INADDR(v6, v4) \
+ memcpy(v4, ((char *)v6) + 12, sizeof(struct in_addr));
+#endif
+
/* Common string operations. Less clutter should be more readable. */
#define STRN_CPY(d,s,l) { strncpy((d),(s),(l)); (d)[(l)-1] = 0; }
Index: setenv.c
===================================================================
RCS file: /cvs/opkg/vendor_stuff/tcpwrappers/setenv.c,v
retrieving revision 1.1.1.1
diff -u -u -r1.1.1.1 setenv.c
--- setenv.c 31 Aug 2002 16:40:34 -0000 1.1.1.1
+++ setenv.c 11 Nov 2003 00:18:26 -0000
@@ -20,7 +20,7 @@
/* setenv - update or insert environment (name,value) pair */
-int my_setenv(const char *name, const char *value, int clobber)
+int setenv(const char *name, const char *value, int clobber)
{
char *cp;
Index: socket.c
===================================================================
RCS file: /cvs/opkg/vendor_stuff/tcpwrappers/socket.c,v
retrieving revision 1.1.1.1
diff -u -u -r1.1.1.1 socket.c
--- socket.c 10 Mar 2003 16:05:21 -0000 1.1.1.1
+++ socket.c 11 Nov 2003 00:18:26 -0000
@@ -135,17 +135,31 @@
sizeof(host->name), 0, 0, NI_NAMEREQD | NI_NOFQDN) == 0)
{
struct addrinfo hints, *res, *ressave;
+ struct in_addr v4addr;
int ret_val;
memset(&hints, 0, sizeof(hints));
hints.ai_flags = AI_CANONNAME;
hints.ai_socktype = SOCK_STREAM;
- hints.ai_family = ADDR_FAM(tsa);
+ if (ADDR_FAM(tsa) == AF_INET)
+ {
+ hints.ai_family = AF_INET;
+ memcpy(&v4addr, &SAIN(tsa)->sin_addr, sizeof(struct in_addr));
+ }
+ else /* only AF_INET6 left, currently */
+ {
+ if (IN6_IS_ADDR_V4MAPPED(&tsa->sa_in6.sin6_addr)) {
+ IN6_V4MAPPED_TO_INADDR(&tsa->sa_in6.sin6_addr, &v4addr);
+ hints.ai_family = AF_INET;
+ }
+ else
+ hints.ai_family = AF_INET6;
+ }
/*
* And then a forward lookup on what was returned.
*/
- if( (ret_val = getaddrinfo(host->name, NULL, &hints, &res)) < 0 )
+ if( (ret_val = getaddrinfo(host->name, NULL, &hints, &res)) != 0 )
{
tcpd_warn("can't verify hostname: getaddrinfo(%s) failed - %s",
host->name, gai_strerror(ret_val));
@@ -185,11 +199,14 @@
*/
while (res)
{
- if (tsa->sa.sa_family != res->ai_family)
- continue;
+ if (res->ai_family != hints.ai_family) {
+ /* can this happen ??? */
+ res = res->ai_next;
+ continue;
+ }
if (res->ai_family == AF_INET)
{
- if (memcmp(&SAIN(tsa)->sin_addr,
+ if (memcmp(&v4addr,
&SAIN(res->ai_addr)->sin_addr,
sizeof(struct in_addr)) == 0)
{
Index: tcpd.c
===================================================================
RCS file: /cvs/opkg/vendor_stuff/tcpwrappers/tcpd.c,v
retrieving revision 1.1.1.1
diff -u -u -r1.1.1.1 tcpd.c
--- tcpd.c 5 Jan 2003 01:20:42 -0000 1.1.1.1
+++ tcpd.c 11 Nov 2003 00:18:26 -0000
@@ -44,11 +44,28 @@
int allow_severity = SEVERITY; /* run-time adjustable */
int deny_severity = LOG_WARNING; /* ditto */
+
+int goon = 0;
+
+static
+void wait_attach()
+{
+ while (goon == 0) sleep(1);
+}
+
+
int main(int argc, char *argv[])
{
struct request_info request;
char *path, path_buffer[MAXPATHNAMELEN];
+
+ /*
+ * debugging aid
+ wait_attach();
+ */
+
+
/* Attempt to prevent the creation of world-writable files. */
#ifdef DAEMON_UMASK
Index: tcpd.h
===================================================================
RCS file: /cvs/opkg/vendor_stuff/tcpwrappers/tcpd.h,v
retrieving revision 1.1.1.1
diff -u -u -r1.1.1.1 tcpd.h
--- tcpd.h 5 Jan 2003 01:15:59 -0000 1.1.1.1
+++ tcpd.h 11 Nov 2003 00:18:26 -0000
@@ -7,6 +7,8 @@
#ifndef TCP_WRAPPERS_HEADER
#define TCP_WRAPPERS_HEADER
+#include <sys/types.h>
+#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
Index: tli.c
===================================================================
RCS file: /cvs/opkg/vendor_stuff/tcpwrappers/tli.c,v
retrieving revision 1.1.1.1
diff -u -u -r1.1.1.1 tli.c
--- tli.c 2 Sep 2002 12:47:03 -0000 1.1.1.1
+++ tli.c 11 Nov 2003 00:18:26 -0000
@@ -77,13 +77,13 @@
tli_endpoints(request);
if ((request->config = tli_transport(request->fd)) != 0
&& STR_EQ(request->config->nc_protofmly, "inet")) {
- if (request->client->unit != 0) {
- client = *(struct sockaddr_in *) request->client->unit->addr.buf;
- request->client->sin = &client;
+ if (request->client.unit != 0) {
+ client = *(struct sockaddr_in *) request->client.unit->addr.buf;
+ request->client.au.sa_in = client;
}
- if (request->server->unit != 0) {
- server = *(struct sockaddr_in *) request->server->unit->addr.buf;
- request->server->sin = &server;
+ if (request->server.unit != 0) {
+ server = *(struct sockaddr_in *) request->server.unit->addr.buf;
+ request->server.au.sa_in = server;
}
tli_cleanup(request);
sock_methods(request);
@@ -100,10 +100,10 @@
{
if (request->config != 0)
freenetconfigent(request->config);
- if (request->client->unit != 0)
- t_free((char *) request->client->unit, T_UNITDATA);
- if (request->server->unit != 0)
- t_free((char *) request->server->unit, T_UNITDATA);
+ if (request->client.unit != 0)
+ t_free((char *) request->client.unit, T_UNITDATA);
+ if (request->server.unit != 0)
+ t_free((char *) request->server.unit, T_UNITDATA);
}
/* tli_endpoints - determine TLI client and server endpoint information */
@@ -140,7 +140,7 @@
return;
}
}
- request->client->unit = client;
+ request->client.unit = client;
/*
* Look up the server endpoint address. This can be used for filtering on
@@ -156,7 +156,7 @@
t_free((void *) server, T_UNITDATA);
return;
}
- request->server->unit = server;
+ request->server.unit = server;
}
/* tli_transport - find out TLI transport type */
______________________________________________________________________
The OpenPKG Project www.openpkg.org
Developer Communication List [EMAIL PROTECTED]