Mercurial > hg > octave-jordi > gnulib-hg
view lib/unlinkat.c @ 14393:9f47f8c334f2
dirname: move m4/dos.m4 functionality into lib/dosname.h
m4/dos.m4 needs to go. It laboriously invokes the C compiler, and
extracts symbols from it, puts them into config.h; but it's much
easier to use the symbols directly. filename.h already does this,
but it disagrees with dos.m4 in some respects. This patch
introduces a different include file dosname.h that packages up
dos.m4, and then later we can work on merging filename.h and
dosname.h. Applications that need only the easy-to-configure
symbols should consider including dosname.h rather than dirname.h.
* NEWS: Mention incompatible changes.
* m4/dos.m4: Remove.
* lib/dosname.h, modules/dosname: New files.
* lib/dirname.h (ISSLASH, FILE_SYSTEM_PREFIX_LEN):
(FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE):
(IS_ABSOLUTE_FILE_NAME, IS_RELATIVE_FILE_NAME): Move to lib/dosname.h.
* lib/at-func.c, lib/at-func2.c, lib/openat.c, lib/savewd.c:
Include dosname.h, not dirname.h.
* lib/rmdir.c, lib/stat.c, lib/unlink.c, lib/unlinkat.c:
Include dosname.h, for definitions of symbols like ISSLASH
that used to be in config.h.
* m4/dirname.m4 (gl_DIRNAME_LGPL): Do not require gl_AC_DOS.
* m4/rmdir.m4 (gl_FUNC_RMDIR): Likewise.
* m4/stat.m4 (gl_FUNC_STAT): Likewise.
* m4/unlink.m4 (gl_FUNC_UNLINK): Likewise.
* modules/dirname-lgpl (Files): Omit m4/dos.m4.
* modules/rmdir (Files): Likewise.
* modules/stat (Files): Likewise.
* modules/unlink (Files): Likewise.
* modules/dirname-lgpl (Depends-on): Add dosname.
* modules/lstat (Depends-on): Likewise.
* modules/openat (Depends-on): Likewise.
* modules/rmdir (Depends-on): Likewise.
* modules/savewd (Depends-on): Likewise.
* modules/stat (Depends-on): Likewise.
* modules/unlink (Depends-on): Likewise.
* modules/openat (Depends-on): Remove dirname-lgpl.
* modules/savewd (Depends-on): Likewise.
* tests/test-dirname.c: Do not use removed symbols like
FILE_SYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR. Instead, use
the remaining symbols, e.g., ISSLASH ('\\').
author | Paul Eggert <eggert@cs.ucla.edu> |
---|---|
date | Fri, 25 Feb 2011 10:52:37 -0800 |
parents | 97fc9a21a8fb |
children | 399fbe0ffbc2 |
line wrap: on
line source
/* Work around unlinkat bugs on Solaris 9. Copyright (C) 2009-2011 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/>. */ /* Written by Eric Blake. */ #include <config.h> #include <unistd.h> #include <errno.h> #include <fcntl.h> #include <string.h> #include <sys/stat.h> #include "dosname.h" #include "openat.h" #if HAVE_UNLINKAT # undef unlinkat /* unlinkat without AT_REMOVEDIR does not honor trailing / on Solaris 9. Solve it in a similar manner to unlink. */ int rpl_unlinkat (int fd, char const *name, int flag) { size_t len; int result = 0; /* rmdir behavior has no problems with trailing slash. */ if (flag & AT_REMOVEDIR) return unlinkat (fd, name, flag); len = strlen (name); if (len && ISSLASH (name[len - 1])) { /* See the lengthy comment in unlink.c why we disobey the POSIX rule of letting unlink("link-to-dir/") attempt to unlink a directory. */ struct stat st; result = lstatat (fd, name, &st); if (result == 0) { /* Trailing NUL will overwrite the trailing slash. */ char *short_name = malloc (len); if (!short_name) { errno = EPERM; return -1; } memcpy (short_name, name, len); while (len && ISSLASH (short_name[len - 1])) short_name[--len] = '\0'; if (len && (lstatat (fd, short_name, &st) || S_ISLNK (st.st_mode))) { free (short_name); errno = EPERM; return -1; } free (short_name); } } if (!result) result = unlinkat (fd, name, flag); return result; } #else /* !HAVE_UNLINKAT */ /* Replacement for Solaris' function by the same name. <http://www.google.com/search?q=unlinkat+site:docs.sun.com> First, try to simulate it via (unlink|rmdir) ("/proc/self/fd/FD/FILE"). Failing that, simulate it via save_cwd/fchdir/(unlink|rmdir)/restore_cwd. If either the save_cwd or the restore_cwd fails (relatively unlikely), then give a diagnostic and exit nonzero. Otherwise, this function works just like Solaris' unlinkat. */ # define AT_FUNC_NAME unlinkat # define AT_FUNC_F1 rmdir # define AT_FUNC_F2 unlink # define AT_FUNC_USE_F1_COND AT_REMOVEDIR # define AT_FUNC_POST_FILE_PARAM_DECLS , int flag # define AT_FUNC_POST_FILE_ARGS /* empty */ # include "at-func.c" # undef AT_FUNC_NAME # undef AT_FUNC_F1 # undef AT_FUNC_F2 # undef AT_FUNC_USE_F1_COND # undef AT_FUNC_POST_FILE_PARAM_DECLS # undef AT_FUNC_POST_FILE_ARGS #endif /* !HAVE_UNLINKAT */