The mkdir module is LGPLv2+, but dragged in some GPL stuff. In addition to the licensing problems this represents, I'm also getting link failures on the gnulib-tests directory of coreutils on cygwin 1.5:
CCLD test-areadlink.exe ../lib/libcoreutils.a(xalloc-die.o): In function `xalloc_die': /home/eblake/coreutils-tmp/lib/xalloc-die.c:34: undefined reference to `_libintl_gettext' ../lib/libcoreutils.a(error.o): In function `print_errno_message': /home/eblake/coreutils-tmp/lib/error.c:127: undefined reference to `_libintl_gettext' collect2: ld returned 1 exit status test-areadlink.c pulled in rpl_mkdir, which in turn exploded into xalloc dependencies, all which seem rather extreme for a simple system call which shouldn't call exit() in the first place. Here's what I'm proposing to fix it. Jim, Paul - are you okay with weakening the license on portions of the dirname and filenamecat modules? Meanwhile, the only reason the rename module was GPL was because of its use of dirname; it fits in the same category as mkdir of a low-level syscall that should be usable anywhere. Eric Blake (5): [1/5] mkdir: make safe for libraries Don't use xstrdup; it can exit(). [2/5] dirname: split into dirname-lgpl I've been threatening this for a while. dirname.h seems like it should be usable in LGPL files (particularly since we now have a lot of syscall wrappers that want to manage trailing slash bugs), but dirname.c calls xalloc which implies GPL. The split seems pretty straightforward, if everyone agrees. [3/5] dirname-lgpl: adjust clients that don't need full dirname Fallout from the split. In particular, test-mkdir and test-rename no longer need libintl. Meanwhile, openat and friends no longer drag in dirname, but still drag in xalloc due to openat-die. [4/5] filenamecat: split into filenamecat-lgpl filenamecat wasn't as pervasive as dirname, but the idea of the split is the same. [5/5] filenamecat-lgpl: adjust clients Fallout from the split. Still to go - LGPL argp still depends on the GPL dirname module, because it uses base_name (which xmallocs). I can switch it to use last_component instead, but will have to audit all clients that used __argp_dir_name to ensure they are still correct. >From edb6f303ff181d6a244a0e8d3fd0367b02260d7f Mon Sep 17 00:00:00 2001 From: Eric Blake <e...@byu.net> Date: Thu, 29 Oct 2009 09:37:42 -0600 Subject: [PATCH 1/5] mkdir: make safe for libraries * modules/mkdir (Depends-on): Drop xalloc. * lib/mkdir.c (rpl_mkdir): Fail with ENOMEM rather than calling exit. Signed-off-by: Eric Blake <e...@byu.net> --- ChangeLog | 5 +++++ lib/mkdir.c | 8 +++++++- modules/mkdir | 1 - 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index bda6fbb..27528cb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2009-10-29 Eric Blake <e...@byu.net> + mkdir: make safe for libraries + * modules/mkdir (Depends-on): Drop xalloc. + * lib/mkdir.c (rpl_mkdir): Fail with ENOMEM rather than calling + exit. + tests: avoid some compiler warnings * tests/test-getaddrinfo.c (simple): Mark static, and allow string literals. diff --git a/lib/mkdir.c b/lib/mkdir.c index 3d9f043..e6dbc78 100644 --- a/lib/mkdir.c +++ b/lib/mkdir.c @@ -56,7 +56,13 @@ rpl_mkdir (char const *dir, mode_t mode maybe_unused) if (len && dir[len - 1] == '/') { - tmp_dir = xstrdup (dir); + tmp_dir = strdup (dir); + if (!tmp_dir) + { + /* Rather than rely on strdup-posix, we set errno ourselves. */ + errno = ENOMEM; + return -1; + } strip_trailing_slashes (tmp_dir); } else diff --git a/modules/mkdir b/modules/mkdir index 59d60fb..fa0931d 100644 --- a/modules/mkdir +++ b/modules/mkdir @@ -7,7 +7,6 @@ m4/mkdir.m4 Depends-on: sys_stat -xalloc dirname configure.ac: -- 1.6.4.2 >From fa022e7adcea017f5569261d04716dc00963db1d Mon Sep 17 00:00:00 2001 From: Eric Blake <e...@byu.net> Date: Thu, 29 Oct 2009 10:43:31 -0600 Subject: [PATCH 2/5] dirname: split into dirname-lgpl * modules/dirname-lgpl: New module. * modules/dirname (Files): Move library-safe files into dirname-lgpl. (Depends-on): Add dirname-lgpl. (configure.ac): Declare witness. * modules/double-slash-root (License): Relax license. * lib/dirname.h (base_name, dir_name): Only declare when using GPL module. * lib/dirname.c (dir_len, mdir_name): Move... * lib/dirname-lgpl.c: ...into new file. * lib/basename.c (last_component, base_len): Move... * lib/basename-lgpl.c: ...into new file. * m4/dirname.m4 (gl_DIRNAME_LGPL): New macro. (gl_DIRNAME): Use it. * MODULES.html.sh (Enhancements for POSIX:2008 functions): Mention new module. * modules/dirname-tests (Depends-on): Add progname. * tests/test-dirname.c (program_name): Delete. Signed-off-by: Eric Blake <e...@byu.net> --- ChangeLog | 20 ++++++++++ MODULES.html.sh | 1 + lib/basename-lgpl.c | 75 +++++++++++++++++++++++++++++++++++++ lib/basename.c | 74 +----------------------------------- lib/{dirname.c => dirname-lgpl.c} | 34 +++++------------ lib/dirname.c | 64 +------------------------------- lib/dirname.h | 5 ++- m4/dirname.m4 | 14 +++++- modules/dirname | 9 +--- modules/{dirname => dirname-lgpl} | 13 +++--- modules/dirname-tests | 1 + modules/double-slash-root | 2 +- tests/test-dirname.c | 2 - 13 files changed, 135 insertions(+), 179 deletions(-) create mode 100644 lib/basename-lgpl.c copy lib/{dirname.c => dirname-lgpl.c} (78%) copy modules/{dirname => dirname-lgpl} (69%) diff --git a/ChangeLog b/ChangeLog index 27528cb..26a0abf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,25 @@ 2009-10-29 Eric Blake <e...@byu.net> + dirname: split into dirname-lgpl + * modules/dirname-lgpl: New module. + * modules/dirname (Files): Move library-safe files into + dirname-lgpl. + (Depends-on): Add dirname-lgpl. + (configure.ac): Declare witness. + * modules/double-slash-root (License): Relax license. + * lib/dirname.h (base_name, dir_name): Only declare when using GPL + module. + * lib/dirname.c (dir_len, mdir_name): Move... + * lib/dirname-lgpl.c: ...into new file. + * lib/basename.c (last_component, base_len): Move... + * lib/basename-lgpl.c: ...into new file. + * m4/dirname.m4 (gl_DIRNAME_LGPL): New macro. + (gl_DIRNAME): Use it. + * MODULES.html.sh (Enhancements for POSIX:2008 functions): + Mention new module. + * modules/dirname-tests (Depends-on): Add progname. + * tests/test-dirname.c (program_name): Delete. + mkdir: make safe for libraries * modules/mkdir (Depends-on): Drop xalloc. * lib/mkdir.c (rpl_mkdir): Fail with ENOMEM rather than calling diff --git a/MODULES.html.sh b/MODULES.html.sh index 62abf0f..d8677e0 100755 --- a/MODULES.html.sh +++ b/MODULES.html.sh @@ -2404,6 +2404,7 @@ func_all_modules () func_module chdir-long func_module dirent-safer func_module dirname + func_module dirname-lgpl func_module getopt func_module iconv_open-utf func_module unistd-safer diff --git a/lib/basename-lgpl.c b/lib/basename-lgpl.c new file mode 100644 index 0000000..444f042 --- /dev/null +++ b/lib/basename-lgpl.c @@ -0,0 +1,75 @@ +/* basename.c -- return the last element in a file name + + Copyright (C) 1990, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, + 2009 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#include <config.h> + +#include "dirname.h" + +#include <string.h> + +/* Return the address of the last file name component of NAME. If + NAME has no relative file name components because it is a file + system root, return the empty string. */ + +char * +last_component (char const *name) +{ + char const *base = name + FILE_SYSTEM_PREFIX_LEN (name); + char const *p; + bool saw_slash = false; + + while (ISSLASH (*base)) + base++; + + for (p = base; *p; p++) + { + if (ISSLASH (*p)) + saw_slash = true; + else if (saw_slash) + { + base = p; + saw_slash = false; + } + } + + return (char *) base; +} + +/* Return the length of the basename NAME. Typically NAME is the + value returned by base_name or last_component. Act like strlen + (NAME), except omit all trailing slashes. */ + +size_t +base_len (char const *name) +{ + size_t len; + size_t prefix_len = FILE_SYSTEM_PREFIX_LEN (name); + + for (len = strlen (name); 1 < len && ISSLASH (name[len - 1]); len--) + continue; + + if (DOUBLE_SLASH_IS_DISTINCT_ROOT && len == 1 + && ISSLASH (name[0]) && ISSLASH (name[1]) && ! name[2]) + return 2; + + if (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE && prefix_len + && len == prefix_len && ISSLASH (name[prefix_len])) + return prefix_len + 1; + + return len; +} diff --git a/lib/basename.c b/lib/basename.c index 426ed40..a6403f5 100644 --- a/lib/basename.c +++ b/lib/basename.c @@ -1,7 +1,7 @@ /* basename.c -- return the last element in a file name - Copyright (C) 1990, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006 Free - Software Foundation, Inc. + Copyright (C) 1990, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, + 2009 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,52 +24,6 @@ #include "xalloc.h" #include "xstrndup.h" -/* Return the address of the last file name component of NAME. If - NAME has no relative file name components because it is a file - system root, return the empty string. */ - -char * -last_component (char const *name) -{ - char const *base = name + FILE_SYSTEM_PREFIX_LEN (name); - char const *p; - bool saw_slash = false; - - while (ISSLASH (*base)) - base++; - - for (p = base; *p; p++) - { - if (ISSLASH (*p)) - saw_slash = true; - else if (saw_slash) - { - base = p; - saw_slash = false; - } - } - - return (char *) base; -} - - -/* In general, we can't use the builtin `basename' function if available, - since it has different meanings in different environments. - In some environments the builtin `basename' modifies its argument. - - Return the last file name component of NAME, allocated with - xmalloc. On systems with drive letters, a leading "./" - distinguishes relative names that would otherwise look like a drive - letter. Unlike POSIX basename(), NAME cannot be NULL, - base_name("") returns "", and the first trailing slash is not - stripped. - - If lstat (NAME) would succeed, then { chdir (dir_name (NAME)); - lstat (base_name (NAME)); } will access the same file. Likewise, - if the sequence { chdir (dir_name (NAME)); - rename (base_name (NAME), "foo"); } succeeds, you have renamed NAME - to "foo" in the same directory NAME was in. */ - char * base_name (char const *name) { @@ -102,27 +56,3 @@ base_name (char const *name) /* Finally, copy the basename. */ return xstrndup (base, length); } - -/* Return the length of the basename NAME. Typically NAME is the - value returned by base_name or last_component. Act like strlen - (NAME), except omit all trailing slashes. */ - -size_t -base_len (char const *name) -{ - size_t len; - size_t prefix_len = FILE_SYSTEM_PREFIX_LEN (name); - - for (len = strlen (name); 1 < len && ISSLASH (name[len - 1]); len--) - continue; - - if (DOUBLE_SLASH_IS_DISTINCT_ROOT && len == 1 - && ISSLASH (name[0]) && ISSLASH (name[1]) && ! name[2]) - return 2; - - if (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE && prefix_len - && len == prefix_len && ISSLASH (name[prefix_len])) - return prefix_len + 1; - - return len; -} diff --git a/lib/dirname.c b/lib/dirname-lgpl.c similarity index 78% copy from lib/dirname.c copy to lib/dirname-lgpl.c index 20dcaf5..79ee0b5 100644 --- a/lib/dirname.c +++ b/lib/dirname-lgpl.c @@ -22,7 +22,6 @@ #include <stdlib.h> #include <string.h> -#include "xalloc.h" /* Return the length of the prefix of FILE that will be used by dir_name. If FILE is in the working directory, this returns zero @@ -37,13 +36,13 @@ dir_len (char const *file) /* Advance prefix_length beyond important leading slashes. */ prefix_length += (prefix_length != 0 - ? (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE - && ISSLASH (file[prefix_length])) - : (ISSLASH (file[0]) - ? ((DOUBLE_SLASH_IS_DISTINCT_ROOT - && ISSLASH (file[1]) && ! ISSLASH (file[2]) - ? 2 : 1)) - : 0)); + ? (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE + && ISSLASH (file[prefix_length])) + : (ISSLASH (file[0]) + ? ((DOUBLE_SLASH_IS_DISTINCT_ROOT + && ISSLASH (file[1]) && ! ISSLASH (file[2]) + ? 2 : 1)) + : 0)); /* Strip the basename and any redundant slashes before it. */ for (length = last_component (file) - file; @@ -73,9 +72,9 @@ mdir_name (char const *file) { size_t length = dir_len (file); bool append_dot = (length == 0 - || (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE - && length == FILE_SYSTEM_PREFIX_LEN (file) - && file[2] != '\0' && ! ISSLASH (file[2]))); + || (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE + && length == FILE_SYSTEM_PREFIX_LEN (file) + && file[2] != '\0' && ! ISSLASH (file[2]))); char *dir = malloc (length + append_dot + 1); if (!dir) return NULL; @@ -85,16 +84,3 @@ mdir_name (char const *file) dir[length] = '\0'; return dir; } - -/* Just like mdir_name, above, except, rather than - returning NULL upon malloc failure, here, we report the - "memory exhausted" condition and exit. */ - -char * -dir_name (char const *file) -{ - char *result = mdir_name (file); - if (!result) - xalloc_die (); - return result; -} diff --git a/lib/dirname.c b/lib/dirname.c index 20dcaf5..d032270 100644 --- a/lib/dirname.c +++ b/lib/dirname.c @@ -24,69 +24,7 @@ #include <string.h> #include "xalloc.h" -/* Return the length of the prefix of FILE that will be used by - dir_name. If FILE is in the working directory, this returns zero - even though `dir_name (FILE)' will return ".". Works properly even - if there are trailing slashes (by effectively ignoring them). */ - -size_t -dir_len (char const *file) -{ - size_t prefix_length = FILE_SYSTEM_PREFIX_LEN (file); - size_t length; - - /* Advance prefix_length beyond important leading slashes. */ - prefix_length += (prefix_length != 0 - ? (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE - && ISSLASH (file[prefix_length])) - : (ISSLASH (file[0]) - ? ((DOUBLE_SLASH_IS_DISTINCT_ROOT - && ISSLASH (file[1]) && ! ISSLASH (file[2]) - ? 2 : 1)) - : 0)); - - /* Strip the basename and any redundant slashes before it. */ - for (length = last_component (file) - file; - prefix_length < length; length--) - if (! ISSLASH (file[length - 1])) - break; - return length; -} - - -/* In general, we can't use the builtin `dirname' function if available, - since it has different meanings in different environments. - In some environments the builtin `dirname' modifies its argument. - - Return the leading directories part of FILE, allocated with malloc. - Works properly even if there are trailing slashes (by effectively - ignoring them). Return NULL on failure. - - If lstat (FILE) would succeed, then { chdir (dir_name (FILE)); - lstat (base_name (FILE)); } will access the same file. Likewise, - if the sequence { chdir (dir_name (FILE)); - rename (base_name (FILE), "foo"); } succeeds, you have renamed FILE - to "foo" in the same directory FILE was in. */ - -char * -mdir_name (char const *file) -{ - size_t length = dir_len (file); - bool append_dot = (length == 0 - || (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE - && length == FILE_SYSTEM_PREFIX_LEN (file) - && file[2] != '\0' && ! ISSLASH (file[2]))); - char *dir = malloc (length + append_dot + 1); - if (!dir) - return NULL; - memcpy (dir, file, length); - if (append_dot) - dir[length++] = '.'; - dir[length] = '\0'; - return dir; -} - -/* Just like mdir_name, above, except, rather than +/* Just like mdir_name (dirname-lgpl.c), except, rather than returning NULL upon malloc failure, here, we report the "memory exhausted" condition and exit. */ diff --git a/lib/dirname.h b/lib/dirname.h index 90a1f0c..df12cca 100644 --- a/lib/dirname.h +++ b/lib/dirname.h @@ -58,9 +58,12 @@ # endif # define IS_RELATIVE_FILE_NAME(F) (! IS_ABSOLUTE_FILE_NAME (F)) +# if GNULIB_DIRNAME char *base_name (char const *file); -char *mdir_name (char const *file); char *dir_name (char const *file); +# endif + +char *mdir_name (char const *file); size_t base_len (char const *file); size_t dir_len (char const *file); char *last_component (char const *file); diff --git a/m4/dirname.m4 b/m4/dirname.m4 index e35da96..4252b62 100644 --- a/m4/dirname.m4 +++ b/m4/dirname.m4 @@ -1,18 +1,26 @@ -#serial 7 -*- autoconf -*- -dnl Copyright (C) 2002-2006 Free Software Foundation, Inc. +#serial 8 -*- autoconf -*- +dnl Copyright (C) 2002-2006, 2009 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_DIRNAME], [ + AC_REQUIRE([gl_DIRNAME_LGPL]) AC_LIBOBJ([basename]) AC_LIBOBJ([dirname]) +]) + +AC_DEFUN([gl_DIRNAME_LGPL], +[ + AC_LIBOBJ([basename-lgpl]) + AC_LIBOBJ([dirname-lgpl]) AC_LIBOBJ([stripslash]) dnl Prerequisites of lib/dirname.h. AC_REQUIRE([gl_AC_DOS]) AC_REQUIRE([gl_DOUBLE_SLASH_ROOT]) - dnl No prerequisites of lib/basename.c, lib/dirname.c, lib/stripslash.c. + dnl No prerequisites of lib/basename-lgpl.c, lib/dirname-lgpl.c, + dnl lib/stripslash.c. ]) diff --git a/modules/dirname b/modules/dirname index 7c405c2..888c8ba 100644 --- a/modules/dirname +++ b/modules/dirname @@ -2,21 +2,18 @@ Description: Extract specific portions of filenames. Files: -lib/dirname.h lib/dirname.c lib/basename.c lib/stripslash.c -m4/dirname.m4 -m4/dos.m4 Depends-on: -double-slash-root -stdbool +dirname-lgpl xalloc xstrndup configure.ac: gl_DIRNAME +gl_MODULE_INDICATOR([dirname]) Makefile.am: @@ -27,4 +24,4 @@ License: GPL Maintainer: -Jim Meyering +Jim Meyering, Eric Blake diff --git a/modules/dirname b/modules/dirname-lgpl similarity index 69% copy from modules/dirname copy to modules/dirname-lgpl index 7c405c2..38f779a 100644 --- a/modules/dirname +++ b/modules/dirname-lgpl @@ -3,20 +3,19 @@ Extract specific portions of filenames. Files: lib/dirname.h -lib/dirname.c -lib/basename.c +lib/dirname-lgpl.c +lib/basename-lgpl.c lib/stripslash.c m4/dirname.m4 m4/dos.m4 Depends-on: double-slash-root +malloc-posix stdbool -xalloc -xstrndup configure.ac: -gl_DIRNAME +gl_DIRNAME_LGPL Makefile.am: @@ -24,7 +23,7 @@ Include: "dirname.h" License: -GPL +LGPLv2+ Maintainer: -Jim Meyering +Jim Meyering, Eric Blake diff --git a/modules/dirname-tests b/modules/dirname-tests index e2e86e6..49eeb59 100644 --- a/modules/dirname-tests +++ b/modules/dirname-tests @@ -2,6 +2,7 @@ Files: tests/test-dirname.c Depends-on: +progname strdup configure.ac: diff --git a/modules/double-slash-root b/modules/double-slash-root index 6b809d0..af78f26 100644 --- a/modules/double-slash-root +++ b/modules/double-slash-root @@ -14,7 +14,7 @@ Makefile.am: Include: License: -LGPL +LGPLv2+ Maintainer: Eric Blake, Paul Eggert, Jim Meyering diff --git a/tests/test-dirname.c b/tests/test-dirname.c index bd75020..debda3f 100644 --- a/tests/test-dirname.c +++ b/tests/test-dirname.c @@ -23,8 +23,6 @@ #include <stdlib.h> #include <string.h> -const char *program_name = "test-dirname"; - struct test { const char *name; /* Name under test. */ const char *dir; /* dir_name (name). */ -- 1.6.4.2 >From 76cc537225364be7ba4ae775866f9e7f0be82fc4 Mon Sep 17 00:00:00 2001 From: Eric Blake <e...@byu.net> Date: Thu, 29 Oct 2009 11:44:12 -0600 Subject: [PATCH 3/5] dirname-lgpl: adjust clients that don't need full dirname * modules/backupfile (Depends-on): Use dirname-lgpl, not dirname. * modules/filenamecat (Depends-on): Likewise. * modules/linkat (Depends-on): Likewise. * modules/mkancesdirs (Depends-on): Likewise. * modules/mkdir (Depends-on): Likewise. * modules/openat (Depends-on): Likewise. * modules/savewd (Depends-on): Likewise. * modules/rename (Depends-on): Likewise. (License): Relax license. * modules/mkdir-tests (Depends-on): Drop progname. (Makefile.am): Delete unneeded LDADD. * modules/rename-tests (Depends-on, Makefile.am): Likewise. Signed-off-by: Eric Blake <e...@byu.net> --- ChangeLog | 14 ++++++++++++++ modules/backupfile | 2 +- modules/filenamecat | 2 +- modules/linkat | 2 +- modules/mkancesdirs | 2 +- modules/mkdir | 2 +- modules/mkdir-tests | 2 -- modules/openat | 2 +- modules/rename | 4 ++-- modules/rename-tests | 2 -- modules/savewd | 2 +- 11 files changed, 23 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index 26a0abf..73d4a06 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,19 @@ 2009-10-29 Eric Blake <e...@byu.net> + dirname-lgpl: adjust clients that don't need full dirname + * modules/backupfile (Depends-on): Use dirname-lgpl, not dirname. + * modules/filenamecat (Depends-on): Likewise. + * modules/linkat (Depends-on): Likewise. + * modules/mkancesdirs (Depends-on): Likewise. + * modules/mkdir (Depends-on): Likewise. + * modules/openat (Depends-on): Likewise. + * modules/savewd (Depends-on): Likewise. + * modules/rename (Depends-on): Likewise. + (License): Relax license. + * modules/mkdir-tests (Depends-on): Drop progname. + (Makefile.am): Delete unneeded LDADD. + * modules/rename-tests (Depends-on, Makefile.am): Likewise. + dirname: split into dirname-lgpl * modules/dirname-lgpl: New module. * modules/dirname (Files): Move library-safe files into diff --git a/modules/backupfile b/modules/backupfile index aaf20f3..fcfcce6 100644 --- a/modules/backupfile +++ b/modules/backupfile @@ -12,7 +12,7 @@ Depends-on: argmatch d-ino dirent-safer -dirname +dirname-lgpl memcmp stdbool diff --git a/modules/filenamecat b/modules/filenamecat index fb1786b..3008f35 100644 --- a/modules/filenamecat +++ b/modules/filenamecat @@ -9,7 +9,7 @@ m4/filenamecat.m4 Depends-on: xalloc -dirname +dirname-lgpl configure.ac: gl_FILE_NAME_CONCAT diff --git a/modules/linkat b/modules/linkat index 0c94227..7affdbf 100644 --- a/modules/linkat +++ b/modules/linkat @@ -9,7 +9,7 @@ m4/linkat.m4 Depends-on: areadlink areadlinkat -dirname +dirname-lgpl errno extensions fcntl-h diff --git a/modules/mkancesdirs b/modules/mkancesdirs index 5a5c66a..bff63e1 100644 --- a/modules/mkancesdirs +++ b/modules/mkancesdirs @@ -7,7 +7,7 @@ lib/mkancesdirs.h m4/mkancesdirs.m4 Depends-on: -dirname +dirname-lgpl fcntl-h savewd stat-macros diff --git a/modules/mkdir b/modules/mkdir index fa0931d..08089d0 100644 --- a/modules/mkdir +++ b/modules/mkdir @@ -6,8 +6,8 @@ lib/mkdir.c m4/mkdir.m4 Depends-on: +dirname-lgpl sys_stat -dirname configure.ac: gl_FUNC_MKDIR diff --git a/modules/mkdir-tests b/modules/mkdir-tests index cff0a5b..4d5a9c2 100644 --- a/modules/mkdir-tests +++ b/modules/mkdir-tests @@ -3,7 +3,6 @@ tests/test-mkdir.h tests/test-mkdir.c Depends-on: -progname stdbool symlink @@ -12,4 +11,3 @@ configure.ac: Makefile.am: TESTS += test-mkdir check_PROGRAMS += test-mkdir -test_mkdir_LDADD = $(LDADD) @LIBINTL@ diff --git a/modules/openat b/modules/openat index 77a7870..fc21367 100644 --- a/modules/openat +++ b/modules/openat @@ -16,7 +16,7 @@ m4/openat.m4 m4/mode_t.m4 Depends-on: -dirname +dirname-lgpl errno extensions fchdir diff --git a/modules/rename b/modules/rename index fbd081c..e553a12 100644 --- a/modules/rename +++ b/modules/rename @@ -7,7 +7,7 @@ m4/rename.m4 Depends-on: canonicalize-lgpl -dirname +dirname-lgpl lstat rmdir same-inode @@ -25,7 +25,7 @@ Include: <stdio.h> License: -GPL +LGPL Maintainer: Jim Meyering diff --git a/modules/rename-tests b/modules/rename-tests index 9929faf..be1b423 100644 --- a/modules/rename-tests +++ b/modules/rename-tests @@ -5,7 +5,6 @@ tests/test-rename.c Depends-on: errno link -progname stdbool symlink sys_stat @@ -15,4 +14,3 @@ configure.ac: Makefile.am: TESTS += test-rename check_PROGRAMS += test-rename -test_rename_LDADD = $(LDADD) @LIBINTL@ diff --git a/modules/savewd b/modules/savewd index 6d655c1..41f51e3 100644 --- a/modules/savewd +++ b/modules/savewd @@ -7,7 +7,7 @@ lib/savewd.c m4/savewd.m4 Depends-on: -dirname +dirname-lgpl errno exit fchdir -- 1.6.4.2 >From 7f1e8a89884b8dc79c5f4fd75473b10b20e5ed40 Mon Sep 17 00:00:00 2001 From: Eric Blake <e...@byu.net> Date: Thu, 29 Oct 2009 12:00:03 -0600 Subject: [PATCH 4/5] filenamecat: split into filenamecat-lgpl * modules/filenamecat-lgpl: New module. * modules/filenamecat (Files): Move library-safe files into filenamecat-lgpl. (Depends-on): Add filenamecat-lgpl. (configure.ac): Declare witness. * lib/filenamecat.h (file_name_concat): Only declare when using GPL module. * lib/filenamecat.c (longest_relative_suffix, mfile_name_concat): Move... * lib/filenamecat-lgpl.c: ...into new file. * m4/filenamecat.m4 (gl_FILE_NAME_CONCAT_LGPL): New macro. (gl_FILE_NAME_CONCAT): Use it. * MODULES.html.sh (File system functions): Mention new module. Signed-off-by: Eric Blake <e...@byu.net> --- ChangeLog | 15 +++++++ MODULES.html.sh | 1 + lib/{filenamecat.c => filenamecat-lgpl.c} | 16 +------- lib/filenamecat.c | 65 +---------------------------- lib/filenamecat.h | 5 ++- m4/filenamecat.m4 | 10 ++++- modules/filenamecat | 6 +- modules/{filenamecat => filenamecat-lgpl} | 6 +-- 8 files changed, 36 insertions(+), 88 deletions(-) copy lib/{filenamecat.c => filenamecat-lgpl.c} (86%) copy modules/{filenamecat => filenamecat-lgpl} (79%) diff --git a/ChangeLog b/ChangeLog index 73d4a06..a10acdc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,20 @@ 2009-10-29 Eric Blake <e...@byu.net> + filenamecat: split into filenamecat-lgpl + * modules/filenamecat-lgpl: New module. + * modules/filenamecat (Files): Move library-safe files into + filenamecat-lgpl. + (Depends-on): Add filenamecat-lgpl. + (configure.ac): Declare witness. + * lib/filenamecat.h (file_name_concat): Only declare when using + GPL module. + * lib/filenamecat.c (longest_relative_suffix, mfile_name_concat): + Move... + * lib/filenamecat-lgpl.c: ...into new file. + * m4/filenamecat.m4 (gl_FILE_NAME_CONCAT_LGPL): New macro. + (gl_FILE_NAME_CONCAT): Use it. + * MODULES.html.sh (File system functions): Mention new module. + dirname-lgpl: adjust clients that don't need full dirname * modules/backupfile (Depends-on): Use dirname-lgpl, not dirname. * modules/filenamecat (Depends-on): Likewise. diff --git a/MODULES.html.sh b/MODULES.html.sh index d8677e0..2908890 100755 --- a/MODULES.html.sh +++ b/MODULES.html.sh @@ -2471,6 +2471,7 @@ func_all_modules () func_module filemode func_module filename func_module filenamecat + func_module filenamecat-lgpl func_module fts func_module fts-lgpl func_module isdir diff --git a/lib/filenamecat.c b/lib/filenamecat-lgpl.c similarity index 86% copy from lib/filenamecat.c copy to lib/filenamecat-lgpl.c index ef46de2..b22f0f7 100644 --- a/lib/filenamecat.c +++ b/lib/filenamecat-lgpl.c @@ -1,6 +1,6 @@ /* Concatenate two arbitrary file names. - Copyright (C) 1996-2007 Free Software Foundation, Inc. + Copyright (C) 1996-2007, 2009 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,7 +26,6 @@ #include <string.h> #include "dirname.h" -#include "xalloc.h" #if ! HAVE_MEMPCPY && ! defined mempcpy # define mempcpy(D, S, N) ((void *) ((char *) memcpy (D, S, N) + (N))) @@ -87,16 +86,3 @@ mfile_name_concat (char const *dir, char const *abase, char **base_in_result) return p_concat; } - -/* Just like mfile_name_concat, above, except, rather than - returning NULL upon malloc failure, here, we report the - "memory exhausted" condition and exit. */ - -char * -file_name_concat (char const *dir, char const *abase, char **base_in_result) -{ - char *p = mfile_name_concat (dir, abase, base_in_result); - if (p == NULL) - xalloc_die (); - return p; -} diff --git a/lib/filenamecat.c b/lib/filenamecat.c index ef46de2..eed4a2c 100644 --- a/lib/filenamecat.c +++ b/lib/filenamecat.c @@ -1,6 +1,6 @@ /* Concatenate two arbitrary file names. - Copyright (C) 1996-2007 Free Software Foundation, Inc. + Copyright (C) 1996-2007, 2009 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,70 +25,9 @@ #include <stdlib.h> #include <string.h> -#include "dirname.h" #include "xalloc.h" -#if ! HAVE_MEMPCPY && ! defined mempcpy -# define mempcpy(D, S, N) ((void *) ((char *) memcpy (D, S, N) + (N))) -#endif - -/* Return the longest suffix of F that is a relative file name. - If it has no such suffix, return the empty string. */ - -static char const * -longest_relative_suffix (char const *f) -{ - for (f += FILE_SYSTEM_PREFIX_LEN (f); ISSLASH (*f); f++) - continue; - return f; -} - -/* Concatenate two file name components, DIR and ABASE, in - newly-allocated storage and return the result. - The resulting file name F is such that the commands "ls F" and "(cd - DIR; ls BASE)" refer to the same file, where BASE is ABASE with any - file system prefixes and leading separators removed. - Arrange for a directory separator if necessary between DIR and BASE - in the result, removing any redundant separators. - In any case, if BASE_IN_RESULT is non-NULL, set - *BASE_IN_RESULT to point to the copy of ABASE in the returned - concatenation. However, if ABASE begins with more than one slash, - set *BASE_IN_RESULT to point to the sole corresponding slash that - is copied into the result buffer. - - Return NULL if malloc fails. */ - -char * -mfile_name_concat (char const *dir, char const *abase, char **base_in_result) -{ - char const *dirbase = last_component (dir); - size_t dirbaselen = base_len (dirbase); - size_t dirlen = dirbase - dir + dirbaselen; - size_t needs_separator = (dirbaselen && ! ISSLASH (dirbase[dirbaselen - 1])); - - char const *base = longest_relative_suffix (abase); - size_t baselen = strlen (base); - - char *p_concat = malloc (dirlen + needs_separator + baselen + 1); - char *p; - - if (p_concat == NULL) - return NULL; - - p = mempcpy (p_concat, dir, dirlen); - *p = DIRECTORY_SEPARATOR; - p += needs_separator; - - if (base_in_result) - *base_in_result = p - IS_ABSOLUTE_FILE_NAME (abase); - - p = mempcpy (p, base, baselen); - *p = '\0'; - - return p_concat; -} - -/* Just like mfile_name_concat, above, except, rather than +/* Just like mfile_name_concat (filenamecat-lgpl.c), except, rather than returning NULL upon malloc failure, here, we report the "memory exhausted" condition and exit. */ diff --git a/lib/filenamecat.h b/lib/filenamecat.h index 334c887..df5360b 100644 --- a/lib/filenamecat.h +++ b/lib/filenamecat.h @@ -1,6 +1,7 @@ /* Concatenate two arbitrary file names. - Copyright (C) 1996, 1997, 2003, 2005, 2007 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 2003, 2005, 2007, 2009 Free Software + Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,8 +18,10 @@ /* Written by Jim Meyering. */ +#if GNULIB_FILENAMECAT char *file_name_concat (char const *dir, char const *base, char **base_in_result); +#endif char *mfile_name_concat (char const *dir, char const *base, char **base_in_result); diff --git a/m4/filenamecat.m4 b/m4/filenamecat.m4 index 77a3b6a..c32283c 100644 --- a/m4/filenamecat.m4 +++ b/m4/filenamecat.m4 @@ -1,4 +1,4 @@ -# filenamecat.m4 serial 9 +# filenamecat.m4 serial 10 dnl Copyright (C) 2002-2006, 2009 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -6,8 +6,14 @@ dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FILE_NAME_CONCAT], [ + AC_REQUIRE([gl_FILE_NAME_CONCAT_LGPL]) AC_LIBOBJ([filenamecat]) +]) + +AC_DEFUN([gl_FILE_NAME_CONCAT_LGPL], +[ + AC_LIBOBJ([filenamecat-lgpl]) - dnl Prerequisites of lib/filenamecat.c. + dnl Prerequisites of lib/filenamecat-lgpl.c. AC_CHECK_FUNCS_ONCE([mempcpy]) ]) diff --git a/modules/filenamecat b/modules/filenamecat index 3008f35..df90c2f 100644 --- a/modules/filenamecat +++ b/modules/filenamecat @@ -2,17 +2,17 @@ Description: Concatenate two arbitrary file names. Files: -lib/filenamecat.h lib/filenamecat.c -m4/dos.m4 m4/filenamecat.m4 Depends-on: -xalloc dirname-lgpl +filenamecat-lgpl +xalloc configure.ac: gl_FILE_NAME_CONCAT +gl_MODULE_INDICATOR([filenamecat]) Makefile.am: diff --git a/modules/filenamecat b/modules/filenamecat-lgpl similarity index 79% copy from modules/filenamecat copy to modules/filenamecat-lgpl index 3008f35..a744933 100644 --- a/modules/filenamecat +++ b/modules/filenamecat-lgpl @@ -3,16 +3,14 @@ Concatenate two arbitrary file names. Files: lib/filenamecat.h -lib/filenamecat.c -m4/dos.m4 +lib/filenamecat-lgpl.c m4/filenamecat.m4 Depends-on: -xalloc dirname-lgpl configure.ac: -gl_FILE_NAME_CONCAT +gl_FILE_NAME_CONCAT_LGPL Makefile.am: -- 1.6.4.2 >From 5675e68a5fa2bad2e8d3a589768dcb9f0abb66ac Mon Sep 17 00:00:00 2001 From: Eric Blake <e...@byu.net> Date: Thu, 29 Oct 2009 12:09:48 -0600 Subject: [PATCH 5/5] filenamecat-lgpl: adjust clients * modules/linkat (Depends-on): Use filenamecat-lgpl, not filenamecat. * modules/renameat (Depends-on): Likewise. Signed-off-by: Eric Blake <e...@byu.net> --- ChangeLog | 5 +++++ modules/linkat | 2 +- modules/renameat | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index a10acdc..4396617 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2009-10-29 Eric Blake <e...@byu.net> + filenamecat-lgpl: adjust clients + * modules/linkat (Depends-on): Use filenamecat-lgpl, not + filenamecat. + * modules/renameat (Depends-on): Likewise. + filenamecat: split into filenamecat-lgpl * modules/filenamecat-lgpl: New module. * modules/filenamecat (Files): Move library-safe files into diff --git a/modules/linkat b/modules/linkat index 7affdbf..d0e4771 100644 --- a/modules/linkat +++ b/modules/linkat @@ -13,7 +13,7 @@ dirname-lgpl errno extensions fcntl-h -filenamecat +filenamecat-lgpl openat link link-follow diff --git a/modules/renameat b/modules/renameat index efe4a0f..d370279 100644 --- a/modules/renameat +++ b/modules/renameat @@ -9,7 +9,7 @@ m4/renameat.m4 Depends-on: extensions fcntl-h -filenamecat +filenamecat-lgpl openat rename same-inode -- 1.6.4.2