pkgsrc-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
pkg/39804: net/mtftpd compilation problems (NetBSD 3.0) & weirdness (everywhere) (+FIX)
>Number: 39804
>Category: pkg
>Synopsis: net/mtftpd compilation problems (NetBSD 3.0) & weirdness
>(everywhere) (+FIX)
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: pkg-manager
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Sun Oct 26 07:30:01 +0000 2008
>Originator: Robert Elz
>Release: NetBSD 4.0_STABLE (pkgsrc current today)
>Organization:
Prince of Songkla University
>Environment:
System: NetBSD jade.coe.psu.ac.th 4.0_STABLE NetBSD 4.0_STABLE
(JADE-1.696-20080517) #9: Fri May 23 18:55:13 ICT 2008
kre%jade.coe.psu.ac.th@localhost:/usr/obj/4/kernels/JADE i386
Architecture: i386
Machine: i386
>Description:
net/mtftpd tries to be portable, but fails for old versions
of NetBSd (ie: it assumes that all NetBSD's have proplib and
the strl*() functions built in). That's a trivial Makefile
change to corrrect.
Much weirder, net/mtftpd doesn't support IPv6 (pity, it should
be easy, but that's neither the bug nor the weirdness), but
requires a system with IPv6 installed and enabled (as in,
USE_INET6=true or whatever is the current way) in order to
compile, and what's more, even that works only on newer NetBSD
(no idea about non-NetBSD systems). That's the weirdness.
The reason is that the code uses SOCK_DGRAM and PF_INET but
nowhere directly includes <sys/socket.h>
On newer NetBSD's (with IPv6 included) it all flukes to work,
because net/mtftpd does include netinet/in.h and if IPv6
is enabled, that includes netinet6/in6.h and on newer NetBSD's
that one includes <sys/socket.h>
On NetBSD 3 netinet6/in6.h doesn't include sys/socket.h
so socket.h never gets included at all (that's the bug.)
>How-To-Repeat:
I use pkg_comp with NetBSD 3.0 release sets (and libkver)
to simulate a NetBSD 3.0 enviroronment.
Repeat that (or use genuine NetBSD 3 (anything up to a middling
late 3.99 should suffice for this, not just 3.0) and expect
to see (approximately) ...
PKG_COMP ==> Mounting sandboxed filesystems
PKG_COMP ==> Checking if pkg_install is up to date
PKG_COMP ==> Building and installing net/mtftpd
===> Binary install for mtftpd-20080229
=> Installing mtftpd-20080229 from /pkg_comp/packages/All
pkg_add: no pkg found for 'mtftpd-20080229', sorry.
pkg_add: 1 package addition failed
=> No binary package found for mtftpd-20080229; installing from source.
=> Bootstrap dependency digest>=20010302: found digest-20080510
=> Checksum SHA1 OK for mtftpd-20080229.tar.gz
=> Checksum RMD160 OK for mtftpd-20080229.tar.gz
===> Installing dependencies for mtftpd-20080229
=> Build dependency checkperms>=1.1: found checkperms-1.10
===> Overriding tools for mtftpd-20080229
===> Extracting for mtftpd-20080229
===> Patching for mtftpd-20080229
=> Applying pkgsrc patches for mtftpd-20080229
===> Creating toolchain wrappers for mtftpd-20080229
===> Configuring for mtftpd-20080229
=> Checking for portability problems in extracted files
===> Building for mtftpd-20080229
rm -f .gdbinit
touch .gdbinit
# compile mtftpd/mtftpd.o
cc -O2 -DPKG_SYSCONFDIR=\"/etc/conf\" -Werror -c mtftpd.c
In file included from mtftpd.c:60:
conf.h:41:26: prop/proplib.h: No such file or directory
mtftpd.c: In function `mtftpd_listen':
mtftpd.c:158: error: `PF_INET' undeclared (first use in this function)
mtftpd.c:158: error: (Each undeclared identifier is reported only once
mtftpd.c:158: error: for each function it appears in.)
mtftpd.c:158: error: `SOCK_DGRAM' undeclared (first use in this function)
mtftpd.c:165: error: `AF_INET' undeclared (first use in this function)
*** Error code 1
Stop.
make: stopped in /pkg_comp/obj/pkgsrc/net/mtftpd/default/mtftpd
*** Error code 1
Stop.
make: stopped in /usr/pkgsrc/net/mtftpd
*** Error code 1
>Fix:
Unpack the appended shar file in net/mtftpd
It will create patches/patch-ab and patches/patch-ac
"make distinfo" (after cvs add etc so the $NetBSD$ lines on the
patches get expanded) and for me it all works (ie: compiles) on
both NetBSD 3 and NetBSd 4 systems.
patch-ab is the Makefile correction (and note: uses /etc/release
to work out the NetBSD version present, not uname -r, as the former
tells what userland is installed, uname -r tells which kernel,
and proplib etc depend upon userland, they don't magically appear
because someone is running a new kernel).
patch-ac is a crock ... that one adds an include of sys/socket.h
to porting.h. That's not really the right way (it works though.)
Better would be to simply include sys/socket.h in the source files
of the distributiobn (the ones that need it) and discard patch-ac
(There's nothing non-portable about includiung sys/socket.h)
Given the author/maintainer of this software, I suspect that's
reasonable to expect to happen "upstream"...
But I'm a lazy bastard, so I did it the easy way...
ps: I'm not sure that a Makefile that ends .include "bsd.prog.mk"
counts as "portable software", but that's not my problem...
# This is a shell archive. Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file". Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
# patches/patch-ab
# patches/patch-ac
#
echo x - patches/patch-ab
sed 's/^X//' >patches/patch-ab << 'END-of-patches/patch-ab'
X$NetBSD$
X
X--- Makefile.ORIG 2008-03-01 01:25:59.000000000 +0700
X+++ Makefile 2008-10-26 13:26:28.000000000 +0700
X@@ -8,6 +8,12 @@
X OPSYS!= uname -s
X
X .if ${OPSYS} == "NetBSD"
X+OPREL!= test -f /etc/release && sed -e 's/ /_/' -e 1q /etc/release || echo
NetBSD_0
X+.else
X+OPREL= who_cares
X+.endif
X+
X+.if ${OPSYS} == "NetBSD" && ${OPREL:MNetBSD_[0123]*} == ""
X LDADD+= -lprop
X .else
X CFLAGS+= -Idist/include
END-of-patches/patch-ab
echo x - patches/patch-ac
sed 's/^X//' >patches/patch-ac << 'END-of-patches/patch-ac'
X$NetBSD$
X
X--- porting.h_ORIG 2008-03-01 01:25:59.000000000 +0700
X+++ porting.h 2008-10-26 13:19:14.000000000 +0700
X@@ -36,6 +36,7 @@
X #define _MTFTPD_PORTING_H
X
X #include <sys/cdefs.h>
X+#include <sys/socket.h>
X
X #ifndef __RCSID
X #define __RCSID(__s) static const char *__rcsid = (__s)
END-of-patches/patch-ac
exit
Home |
Main Index |
Thread Index |
Old Index