[Picking this up again after a month:] Our basename(3) and dirname(3) take a const argument:
char *basename(const char *); char *dirname(const char *); POSIX says otherwise... char *basename(char *path); char *dirname(char *path); ... and explicitly says the functions may modify the input string. Our functions were const-ified in 1999 by espie@: proper const semantics for dirname & basename. (this follows FreeBSD and Linux. Single Unix 2 is still illogical) Well, four years ago, FreeBSD finally switched to the POSIX prototypes https://svnweb.freebsd.org/base/head/include/libgen.h?revision=303451&view=markup and in fact now has an implementation that modifies the string. Linux (GNU libc) has a bizarro solution where you get a const basename() and no dirname() if you just include <string.h>, but POSIX basename() and dirname() if you instead or also include <libgen.h>. This is a portability trap. Code written on OpenBSD may not be prepared for basename() or dirname() to splat a '\0' into the input string, despite the warning in the man page. This is not hypothetical. Both Got and OpenCVS have fallen victim to the unportable assumption. The patch below aligns the function prototypes with POSIX. All resulting warnings "passing 'const char *' to parameter of type 'char *' discards qualifiers" in the base system have been cleaned up. It successfully passes "make release". For good measure I'm also running a package bulk build with it as we speak. OK? Index: include/libgen.h =================================================================== RCS file: /cvs/src/include/libgen.h,v retrieving revision 1.9 diff -u -p -r1.9 libgen.h --- include/libgen.h 25 Jan 2019 00:19:25 -0000 1.9 +++ include/libgen.h 11 Sep 2020 20:41:34 -0000 @@ -22,8 +22,8 @@ #include <sys/cdefs.h> __BEGIN_DECLS -char *basename(const char *); -char *dirname(const char *); +char *basename(char *); +char *dirname(char *); __END_DECLS #endif /* _LIBGEN_H_ */ Index: lib/libc/gen/basename.3 =================================================================== RCS file: /cvs/src/lib/libc/gen/basename.3,v retrieving revision 1.24 diff -u -p -r1.24 basename.3 --- lib/libc/gen/basename.3 25 Jan 2019 00:19:25 -0000 1.24 +++ lib/libc/gen/basename.3 11 Sep 2020 20:46:30 -0000 @@ -23,7 +23,7 @@ .Sh SYNOPSIS .In libgen.h .Ft char * -.Fn basename "const char *path" +.Fn basename "char *path" .Sh DESCRIPTION The .Fn basename Index: lib/libc/gen/basename.c =================================================================== RCS file: /cvs/src/lib/libc/gen/basename.c,v retrieving revision 1.16 diff -u -p -r1.16 basename.c --- lib/libc/gen/basename.c 25 Jan 2019 00:19:25 -0000 1.16 +++ lib/libc/gen/basename.c 11 Sep 2020 20:43:13 -0000 @@ -22,7 +22,7 @@ #include <string.h> char * -basename(const char *path) +basename(char *path) { static char bname[PATH_MAX]; size_t len; Index: lib/libc/gen/dirname.3 =================================================================== RCS file: /cvs/src/lib/libc/gen/dirname.3,v retrieving revision 1.23 diff -u -p -r1.23 dirname.3 --- lib/libc/gen/dirname.3 8 Mar 2019 17:33:23 -0000 1.23 +++ lib/libc/gen/dirname.3 11 Sep 2020 20:47:08 -0000 @@ -23,7 +23,7 @@ .Sh SYNOPSIS .In libgen.h .Ft char * -.Fn dirname "const char *path" +.Fn dirname "char *path" .Sh DESCRIPTION The .Fn dirname Index: lib/libc/gen/dirname.c =================================================================== RCS file: /cvs/src/lib/libc/gen/dirname.c,v retrieving revision 1.16 diff -u -p -r1.16 dirname.c --- lib/libc/gen/dirname.c 25 Jan 2019 00:19:25 -0000 1.16 +++ lib/libc/gen/dirname.c 11 Sep 2020 20:43:34 -0000 @@ -24,7 +24,7 @@ /* A slightly modified copy of this file exists in libexec/ld.so */ char * -dirname(const char *path) +dirname(char *path) { static char dname[PATH_MAX]; size_t len; -- Christian "naddy" Weisgerber [email protected]
