svn commit: r304860 - in head: include lib/libc/gen
Ed Schouten
ed at FreeBSD.org
Fri Aug 26 20:23:11 UTC 2016
Author: ed
Date: Fri Aug 26 20:23:10 2016
New Revision: 304860
URL: https://svnweb.freebsd.org/changeset/base/304860
Log:
Improve compatibility of calls to dirname() on constant strings.
As the xinstall(8) utility had to be patched up to work with the POSIXly
correct basename()/dirname() prototypes, we make it pretty hard to build
previous versions of FreeBSD on HEAD. xinstall(8) is part of the
bootstrap tools.
Add some logic to <libgen.h> to automatically detect bad calls to
dirname() based on the type of the argument. If the argument is of type
'const char *', we simply fall back to calling into dirname at FBSD_1.0
directly.
I'll also give basename() similar treatment when importing the
thread-safe version of that function.
Tested by: bdrewery, madpilot (thanks!)
Modified:
head/include/libgen.h
head/lib/libc/gen/dirname.c
Modified: head/include/libgen.h
==============================================================================
--- head/include/libgen.h Fri Aug 26 20:16:02 2016 (r304859)
+++ head/include/libgen.h Fri Aug 26 20:23:10 2016 (r304860)
@@ -39,4 +39,23 @@ char *basename_r(const char *, char *);
char *dirname(char *);
__END_DECLS
+/*
+ * In FreeBSD 12, the prototype of dirname() was modified to comply to
+ * POSIX. This function may now modify its 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 dirname at FBSD_1.0
+ * in case this function is called on constant strings, instead of
+ * making the build fail.
+ */
+#if defined(__generic) && !defined(__cplusplus)
+__BEGIN_DECLS
+char *__old_dirname(const char *);
+__END_DECLS
+__sym_compat(dirname, __old_dirname, FBSD_1.0);
+#define dirname(x) __generic(x, const char *, __old_dirname, dirname)(x)
+#endif
+
#endif /* !_LIBGEN_H_ */
Modified: head/lib/libc/gen/dirname.c
==============================================================================
--- head/lib/libc/gen/dirname.c Fri Aug 26 20:16:02 2016 (r304859)
+++ head/lib/libc/gen/dirname.c Fri Aug 26 20:23:10 2016 (r304860)
@@ -31,7 +31,7 @@ __FBSDID("$FreeBSD$");
#include <string.h>
char *
-dirname(char *path)
+(dirname)(char *path)
{
const char *in, *prev, *begin, *end;
char *out;
More information about the svn-src-head
mailing list