LCOV - code coverage report
Current view: top level - lib - filemode.c (source / functions) Hit Total Coverage
Test: coreutils.info Lines: 33 39 84.6 %
Date: 2018-01-30 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /* filemode.c -- make a string describing file modes
       2             : 
       3             :    Copyright (C) 1985, 1990, 1993, 1998-2000, 2004, 2006 Free Software
       4             :    Foundation, Inc.
       5             : 
       6             :    This program is free software: you can redistribute it and/or modify
       7             :    it under the terms of the GNU General Public License as published by
       8             :    the Free Software Foundation; either version 3 of the License, or
       9             :    (at your option) any later version.
      10             : 
      11             :    This program is distributed in the hope that it will be useful,
      12             :    but WITHOUT ANY WARRANTY; without even the implied warranty of
      13             :    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14             :    GNU General Public License for more details.
      15             : 
      16             :    You should have received a copy of the GNU General Public License
      17             :    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
      18             : 
      19             : #include <config.h>
      20             : 
      21             : #include "filemode.h"
      22             : 
      23             : /* The following is for Cray DMF (Data Migration Facility), which is a
      24             :    HSM file system.  A migrated file has a `st_dm_mode' that is
      25             :    different from the normal `st_mode', so any tests for migrated
      26             :    files should use the former.  */
      27             : #if HAVE_ST_DM_MODE
      28             : # define IS_MIGRATED_FILE(statp) \
      29             :     (S_ISOFD (statp->st_dm_mode) || S_ISOFL (statp->st_dm_mode))
      30             : #else
      31             : # define IS_MIGRATED_FILE(statp) 0
      32             : #endif
      33             : 
      34             : #if ! HAVE_DECL_STRMODE
      35             : 
      36             : /* Return a character indicating the type of file described by
      37             :    file mode BITS:
      38             :    '-' regular file
      39             :    'b' block special file
      40             :    'c' character special file
      41             :    'C' high performance ("contiguous data") file
      42             :    'd' directory
      43             :    'D' door
      44             :    'l' symbolic link
      45             :    'm' multiplexed file (7th edition Unix; obsolete)
      46             :    'n' network special file (HP-UX)
      47             :    'p' fifo (named pipe)
      48             :    'P' port
      49             :    's' socket
      50             :    'w' whiteout (4.4BSD)
      51             :    '?' some other file type  */
      52             : 
      53             : static char
      54          43 : ftypelet (mode_t bits)
      55             : {
      56             :   /* These are the most common, so test for them first.  */
      57          43 :   if (S_ISREG (bits))
      58          29 :     return '-';
      59          14 :   if (S_ISDIR (bits))
      60           4 :     return 'd';
      61             : 
      62             :   /* Other letters standardized by POSIX 1003.1-2004.  */
      63          10 :   if (S_ISBLK (bits))
      64           0 :     return 'b';
      65          10 :   if (S_ISCHR (bits))
      66           0 :     return 'c';
      67          10 :   if (S_ISLNK (bits))
      68           3 :     return 'l';
      69           7 :   if (S_ISFIFO (bits))
      70           0 :     return 'p';
      71             : 
      72             :   /* Other file types (though not letters) standardized by POSIX.  */
      73           7 :   if (S_ISSOCK (bits))
      74           0 :     return 's';
      75             : 
      76             :   /* Nonstandard file types.  */
      77             :   if (S_ISCTG (bits))
      78             :     return 'C';
      79             :   if (S_ISDOOR (bits))
      80             :     return 'D';
      81             :   if (S_ISMPB (bits) || S_ISMPC (bits))
      82             :     return 'm';
      83             :   if (S_ISNWK (bits))
      84             :     return 'n';
      85             :   if (S_ISPORT (bits))
      86             :     return 'P';
      87             :   if (S_ISWHT (bits))
      88             :     return 'w';
      89             : 
      90           7 :   return '?';
      91             : }
      92             : 
      93             : /* Like filemodestring, but rely only on MODE.  */
      94             : 
      95             : void
      96          43 : strmode (mode_t mode, char *str)
      97             : {
      98          43 :   str[0] = ftypelet (mode);
      99          43 :   str[1] = mode & S_IRUSR ? 'r' : '-';
     100          43 :   str[2] = mode & S_IWUSR ? 'w' : '-';
     101          86 :   str[3] = (mode & S_ISUID
     102           0 :             ? (mode & S_IXUSR ? 's' : 'S')
     103          43 :             : (mode & S_IXUSR ? 'x' : '-'));
     104          43 :   str[4] = mode & S_IRGRP ? 'r' : '-';
     105          43 :   str[5] = mode & S_IWGRP ? 'w' : '-';
     106          86 :   str[6] = (mode & S_ISGID
     107           0 :             ? (mode & S_IXGRP ? 's' : 'S')
     108          43 :             : (mode & S_IXGRP ? 'x' : '-'));
     109          43 :   str[7] = mode & S_IROTH ? 'r' : '-';
     110          43 :   str[8] = mode & S_IWOTH ? 'w' : '-';
     111          86 :   str[9] = (mode & S_ISVTX
     112           2 :             ? (mode & S_IXOTH ? 't' : 'T')
     113          41 :             : (mode & S_IXOTH ? 'x' : '-'));
     114          43 :   str[10] = ' ';
     115          43 :   str[11] = '\0';
     116          43 : }
     117             : 
     118             : #endif /* ! HAVE_DECL_STRMODE */
     119             : 
     120             : /* filemodestring - fill in string STR with an ls-style ASCII
     121             :    representation of the st_mode field of file stats block STATP.
     122             :    12 characters are stored in STR.
     123             :    The characters stored in STR are:
     124             : 
     125             :    0    File type, as in ftypelet above, except that other letters are used
     126             :         for files whose type cannot be determined solely from st_mode:
     127             : 
     128             :             'F' semaphore
     129             :             'M' migrated file (Cray DMF)
     130             :             'Q' message queue
     131             :             'S' shared memory object
     132             :             'T' typed memory object
     133             : 
     134             :    1    'r' if the owner may read, '-' otherwise.
     135             : 
     136             :    2    'w' if the owner may write, '-' otherwise.
     137             : 
     138             :    3    'x' if the owner may execute, 's' if the file is
     139             :         set-user-id, '-' otherwise.
     140             :         'S' if the file is set-user-id, but the execute
     141             :         bit isn't set.
     142             : 
     143             :    4    'r' if group members may read, '-' otherwise.
     144             : 
     145             :    5    'w' if group members may write, '-' otherwise.
     146             : 
     147             :    6    'x' if group members may execute, 's' if the file is
     148             :         set-group-id, '-' otherwise.
     149             :         'S' if it is set-group-id but not executable.
     150             : 
     151             :    7    'r' if any user may read, '-' otherwise.
     152             : 
     153             :    8    'w' if any user may write, '-' otherwise.
     154             : 
     155             :    9    'x' if any user may execute, 't' if the file is "sticky"
     156             :         (will be retained in swap space after execution), '-'
     157             :         otherwise.
     158             :         'T' if the file is sticky but not executable.
     159             : 
     160             :    10   ' ' for compatibility with 4.4BSD strmode,
     161             :         since this interface does not support ACLs.
     162             : 
     163             :    11   '\0'.  */
     164             : 
     165             : void
     166          36 : filemodestring (struct stat const *statp, char *str)
     167             : {
     168          36 :   strmode (statp->st_mode, str);
     169             : 
     170             :   if (S_TYPEISSEM (statp))
     171             :     str[0] = 'F';
     172             :   else if (IS_MIGRATED_FILE (statp))
     173             :     str[0] = 'M';
     174             :   else if (S_TYPEISMQ (statp))
     175             :     str[0] = 'Q';
     176             :   else if (S_TYPEISSHM (statp))
     177             :     str[0] = 'S';
     178             :   else if (S_TYPEISTMO (statp))
     179             :     str[0] = 'T';
     180          36 : }

Generated by: LCOV version 1.10