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@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@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;
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to