annotate lib/unlinkdir.c @ 8623:27cfd50b8f6c

Fix missing escape.
author Bruno Haible <bruno@clisp.org>
date Tue, 03 Apr 2007 22:45:13 +0000
parents 8a1a9361108c
children bbbbbf4cd1c5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5852
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
1 /* unlinkdir.c - determine (and maybe change) whether we can unlink directories
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
2
7302
8a1a9361108c * _fpending.c: Include <config.h> unconditionally, since we no
Paul Eggert <eggert@cs.ucla.edu>
parents: 6275
diff changeset
3 Copyright (C) 2005, 2006 Free Software Foundation, Inc.
5852
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
4
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
5 This program is free software; you can redistribute it and/or modify
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
6 it under the terms of the GNU General Public License as published by
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
7 the Free Software Foundation; either version 2, or (at your option)
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
8 any later version.
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
9
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
10 This program is distributed in the hope that it will be useful,
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
13 GNU General Public License for more details.
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
14
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
16 along with this program; if not, write to the Free Software Foundation,
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
17 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
18
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
19 /* Written by Paul Eggert and Jim Meyering. */
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
20
7302
8a1a9361108c * _fpending.c: Include <config.h> unconditionally, since we no
Paul Eggert <eggert@cs.ucla.edu>
parents: 6275
diff changeset
21 #include <config.h>
5852
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
22
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
23 #include "unlinkdir.h"
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
24
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
25 #if HAVE_PRIV_H
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
26 # include <priv.h>
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
27 #endif
6275
fd0ccce602e4 Sync from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 6259
diff changeset
28 #include <unistd.h>
5852
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
29
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
30 #if ! UNLINK_CANNOT_UNLINK_DIR
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
31
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
32 /* Return true if we cannot unlink directories, false if we might be
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
33 able to unlink directories. If possible, tell the kernel we don't
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
34 want to be able to unlink directories, so that we can return true. */
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
35
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
36 bool
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
37 cannot_unlink_dir (void)
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
38 {
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
39 static bool initialized;
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
40 static bool cannot;
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
41
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
42 if (! initialized)
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
43 {
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
44 # if defined PRIV_EFFECTIVE && defined PRIV_SYS_LINKDIR
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
45 /* We might be able to unlink directories if we cannot
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
46 determine our privileges, or if we have the
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
47 PRIV_SYS_LINKDIR privilege and cannot delete it. */
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
48 priv_set_t *pset = priv_allocset ();
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
49 if (pset)
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
50 {
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
51 cannot =
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
52 (getppriv (PRIV_EFFECTIVE, pset) == 0
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
53 && (! priv_ismember (pset, PRIV_SYS_LINKDIR)
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
54 || (priv_delset (pset, PRIV_SYS_LINKDIR) == 0
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
55 && setppriv (PRIV_SET, PRIV_EFFECTIVE, pset) == 0)));
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
56 priv_freeset (pset);
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
57 }
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
58 # else
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
59 /* In traditional Unix, only root can unlink directories. */
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
60 cannot = (geteuid () != 0);
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
61 # endif
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
62 initialized = true;
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
63 }
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
64
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
65 return cannot;
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
66 }
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
67
995d030c6a1f New unlinkdir module.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff changeset
68 #endif