From 6bfbb0d1d8f2818625bbf0cd3c4010f9c6d53ebd Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Fri, 23 Mar 2007 17:33:07 +0000 Subject: [PATCH] * MODULES.html.sh (File system functions): New module write-any-file. * modules/write-any-file, lib/write-any-file.c, lib/write-any-file.h: * m4/write-any-file.m4: New files. --- ChangeLog | 6 +++++ MODULES.html.sh | 1 + lib/write-any-file.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++ lib/write-any-file.h | 2 ++ m4/write-any-file.m4 | 15 +++++++++++++ modules/write-any-file | 24 ++++++++++++++++++++ 6 files changed, 107 insertions(+) create mode 100644 lib/write-any-file.c create mode 100644 lib/write-any-file.h create mode 100644 m4/write-any-file.m4 create mode 100644 modules/write-any-file diff --git a/ChangeLog b/ChangeLog index 21a75df03..b608a7cf1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2007-03-23 Paul Eggert + + * MODULES.html.sh (File system functions): New module write-any-file. + * modules/write-any-file, lib/write-any-file.c, lib/write-any-file.h: + * m4/write-any-file.m4: New files. + 2007-03-23 Eric Blake * gnulib-tool: Rearrange space-tab sequences, since some editors diff --git a/MODULES.html.sh b/MODULES.html.sh index b7001db70..965695e91 100755 --- a/MODULES.html.sh +++ b/MODULES.html.sh @@ -2072,6 +2072,7 @@ func_all_modules () func_module unlinkdir func_module utimecmp func_module utimens + func_module write-any-file func_module xgetcwd func_module xreadlink func_module xreadlink-with-size diff --git a/lib/write-any-file.c b/lib/write-any-file.c new file mode 100644 index 000000000..d0161777c --- /dev/null +++ b/lib/write-any-file.c @@ -0,0 +1,59 @@ +/* Determine whether we can write any file. + + Copyright (C) 2007 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 2, 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Written by Paul Eggert. */ + +#include + +#include "write-any-file.h" + +#if HAVE_PRIV_H +# include +#endif +#include + +/* Return true if we know that we can write any file, including + writing directories. */ + +bool +can_write_any_file (void) +{ + static bool initialized; + static bool can; + + if (! initialized) + { +#if defined PRIV_EFFECTIVE && defined PRIV_FILE_DAC_WRITE + priv_set_t *pset = priv_allocset (); + if (pset) + { + can = + (getppriv (PRIV_EFFECTIVE, pset) == 0 + && priv_ismember (pset, PRIV_FILE_DAC_WRITE)); + priv_freeset (pset); + } + else +#else + /* In traditional Unix, only root can unlink directories. */ + can = (geteuid () == 0); +#endif + initialized = true; + } + + return can; +} diff --git a/lib/write-any-file.h b/lib/write-any-file.h new file mode 100644 index 000000000..3930d4dcc --- /dev/null +++ b/lib/write-any-file.h @@ -0,0 +1,2 @@ +#include +bool can_write_any_file (void); diff --git a/m4/write-any-file.m4 b/m4/write-any-file.m4 new file mode 100644 index 000000000..26c6ce05d --- /dev/null +++ b/m4/write-any-file.m4 @@ -0,0 +1,15 @@ +# Determine whether we can write any file. + +# Copyright (C) 2007 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Written by Paul Eggert. + +AC_DEFUN([gl_WRITE_ANY_FILE], +[ + AC_CHECK_HEADERS_ONCE(priv.h) + AC_LIBOBJ([write-any-file]) +]) diff --git a/modules/write-any-file b/modules/write-any-file new file mode 100644 index 000000000..3136510d1 --- /dev/null +++ b/modules/write-any-file @@ -0,0 +1,24 @@ +Description: +Determine whether we can write any file. + +Files: +lib/write-any-file.h +lib/write-any-file.c +m4/write-any-file.m4 + +Depends-on: +stdbool + +configure.ac: +gl_WRITE_ANY_FILE + +Makefile.am: + +Include: +"write-any-file.h" + +License: +GPL + +Maintainer: +Paul Eggert, Jim Meyering -- 2.11.0