Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 24 Aug 2016 21:49:29 +0200
From:      Ed Schouten <ed@nuxi.nl>
To:        Bryan Drewery <bdrewery@freebsd.org>
Cc:        svn-src-head@freebsd.org, jilles@freebsd.org, svn-src-all@freebsd.org,  src-committers <src-committers@freebsd.org>, Ed Schouten <ed@freebsd.org>
Subject:   Re: svn commit: r303988 - head/lib/libc/gen
Message-ID:  <CABh_MKm_YQ3bJD19Cz1vBCGr=YxuzctXV6F1iqMASkSx-PsVMw@mail.gmail.com>
In-Reply-To: <2632f5f8-d765-3df7-74d7-da878eb4b7a8@FreeBSD.org>
References:  <201608120703.u7C73whf007189@repo.freebsd.org> <d23b295a-1902-193c-dee6-ba49ebd77280@FreeBSD.org> <9ae1c2eb-02ad-b8fe-6aff-7e17e955607a@FreeBSD.org> <CABh_MKkxD3OTF7VO9Rq_eZyqHPN%2BxVws3q3dsH2R3DfZ343kFw@mail.gmail.com> <2632f5f8-d765-3df7-74d7-da878eb4b7a8@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]
2016-08-24 20:30 GMT+02:00 Bryan Drewery <bdrewery@freebsd.org>:
> That would only fix stable/11, stable/10, stable/9, releng/11.0.
>
> It won't fix releng/10.3, releng/10.2, releng/10.1, releng/9.3, etc...
> without an EN.
>
> It won't fix stable/11 - 1, stable/10 - 1, etc.
>
> It will never fix releng/8.4 (unsupported releases) since so@ won't EN
> to those.  People do sometimes need to build these older releases still.
>
> It creates a line in the sand where we can never build checkouts older
> than where the fix was at.  So I don't think it is the appropriate fix.

Good point!

Just for the record: Bryan and I just discussed this matter in more
detail on IRC. We came up with a workaround that should be pretty
good.

Attached is a patch for <libgen.h> that adds some extra logic, so that
any calls to basename() and dirname() will expand to calls to
__old_basename() and __old_dirname(). Using __sym_compat(), these will
cause the compiler to generate calls to basename@FBSD_1.0 and
dirname@FBSD_1.0.

According to Bryan, this fixes the problems he was experiencing.

-- 
Ed Schouten <ed@nuxi.nl>
Nuxi, 's-Hertogenbosch, the Netherlands
KvK-nr.: 62051717

[-- Attachment #2 --]
Index: include/libgen.h
===================================================================
--- include/libgen.h	(revision 304750)
+++ include/libgen.h	(working copy)
@@ -39,4 +39,26 @@
 char	*dirname(char *);
 __END_DECLS
 
+/*
+ * In FreeBSD 12, the prototype of basename() and dirname() was modified
+ * to comply to POSIX. These functions may now modify their input.
+ * Unfortunately, our copy of xinstall(8) shipped with previous versions
+ * of FreeBSD is built using the host headers and libc during the
+ * bootstrapping phase and depends on the old behavior.
+ *
+ * Apply a workaround where we explicitly link against basename@FBSD_1.0
+ * and dirname@FBSD_1.0 in case these functions are called on constant
+ * strings, instead of making the build fail.
+ */
+#if defined(__generic) && !defined(__cplusplus)
+__BEGIN_DECLS
+char	*__old_basename(const char *);
+char	*__old_dirname(const char *);
+__END_DECLS
+__sym_compat(basename, __old_basename, FBSD_1.0);
+__sym_compat(dirname, __old_dirname, FBSD_1.0);
+#define	basename(x)	__generic(x, const char *, __old_basename, basename)(x)
+#define	dirname(x)	__generic(x, const char *, __old_dirname, dirname)(x)
+#endif
+
 #endif /* !_LIBGEN_H_ */
Index: lib/libc/gen/basename.c
===================================================================
--- lib/libc/gen/basename.c	(revision 304750)
+++ lib/libc/gen/basename.c	(working copy)
@@ -66,7 +66,7 @@
 }
 
 char *
-basename(char *path)
+(basename)(char *path)
 {
 	static char *bname = NULL;
 
Index: lib/libc/gen/dirname.c
===================================================================
--- lib/libc/gen/dirname.c	(revision 304750)
+++ lib/libc/gen/dirname.c	(working copy)
@@ -31,7 +31,7 @@
 #include <string.h>
 
 char *
-dirname(char *path)
+(dirname)(char *path)
 {
 	const char *in, *prev, *begin, *end;
 	char *out;

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CABh_MKm_YQ3bJD19Cz1vBCGr=YxuzctXV6F1iqMASkSx-PsVMw>