LCOV - code coverage report
Current view: top level - lib - write-any-file.c (source / functions) Hit Total Coverage
Test: coreutils.info Lines: 7 7 100.0 %
Date: 2018-01-30 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /* Determine whether we can write any file.
       2             : 
       3             :    Copyright (C) 2007 Free Software Foundation, Inc.
       4             : 
       5             :    This program is free software: you can redistribute it and/or modify
       6             :    it under the terms of the GNU General Public License as published by
       7             :    the Free Software Foundation; either version 3 of the License, or
       8             :    (at your option) any later version.
       9             : 
      10             :    This program is distributed in the hope that it will be useful,
      11             :    but WITHOUT ANY WARRANTY; without even the implied warranty of
      12             :    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      13             :    GNU General Public License for more details.
      14             : 
      15             :    You should have received a copy of the GNU General Public License
      16             :    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
      17             : 
      18             : /* Written by Paul Eggert.  */
      19             : 
      20             : #include <config.h>
      21             : 
      22             : #include "write-any-file.h"
      23             : 
      24             : #if HAVE_PRIV_H
      25             : # include <priv.h>
      26             : #endif
      27             : #include <unistd.h>
      28             : 
      29             : /* Return true if we know that we can write any file, including
      30             :    writing directories.  */
      31             : 
      32             : bool
      33          57 : can_write_any_file (void)
      34             : {
      35             :   static bool initialized;
      36             :   static bool can_write;
      37             : 
      38          57 :   if (! initialized)
      39             :     {
      40          39 :       bool can = false;
      41             : #if defined PRIV_EFFECTIVE && defined PRIV_FILE_DAC_WRITE
      42             :       priv_set_t *pset = priv_allocset ();
      43             :       if (pset)
      44             :         {
      45             :           can =
      46             :             (getppriv (PRIV_EFFECTIVE, pset) == 0
      47             :              && priv_ismember (pset, PRIV_FILE_DAC_WRITE));
      48             :           priv_freeset (pset);
      49             :         }
      50             : #else
      51             :       /* In traditional Unix, only root can unlink directories.  */
      52          39 :       can = (geteuid () == 0);
      53             : #endif
      54          39 :       can_write = can;
      55          39 :       initialized = true;
      56             :     }
      57             : 
      58          57 :   return can_write;
      59             : }

Generated by: LCOV version 1.10