Blame lib/udf/filemode.c

Packit dd8086
/*
Packit dd8086
  filemode.c -- make a string describing file modes
Packit dd8086
Packit dd8086
  Copyright (C) 2005, 2008, 2011, 2012 Rocky Bernstein <rocky@gnu.org>
Packit dd8086
  Copyright (C) 1985, 1990, 1993, 1998-2000 Free Software Foundation, Inc.
Packit dd8086
Packit dd8086
  This program is free software: you can redistribute it and/or modify
Packit dd8086
  it under the terms of the GNU General Public License as published by
Packit dd8086
  the Free Software Foundation, either version 3 of the License, or
Packit dd8086
  (at your option) any later version.
Packit dd8086
Packit dd8086
  This program is distributed in the hope that it will be useful,
Packit dd8086
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit dd8086
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit dd8086
  GNU General Public License for more details.
Packit dd8086
Packit dd8086
  You should have received a copy of the GNU General Public License
Packit dd8086
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit dd8086
*/
Packit dd8086
Packit dd8086
#if HAVE_CONFIG_H
Packit dd8086
# include <config.h>
Packit dd8086
# define __CDIO_CONFIG_H__ 1
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#ifdef HAVE_SYS_STAT_H
Packit dd8086
#include <sys/stat.h>
Packit dd8086
#endif 
Packit dd8086
Packit dd8086
#include <cdio/udf.h>
Packit dd8086
#include "filemode.h"
Packit dd8086
Packit dd8086
Packit dd8086
/* Set the 's' and 't' flags in file attributes string CHARS,
Packit dd8086
   according to the file mode BITS.  */
Packit dd8086
Packit dd8086
static void
Packit dd8086
setst (mode_t bits, char *chars)
Packit dd8086
{
Packit dd8086
#ifdef S_ISUID
Packit dd8086
  if (bits & S_ISUID)
Packit dd8086
    {
Packit dd8086
      if (chars[3] != 'x')
Packit dd8086
	/* Set-uid, but not executable by owner.  */
Packit dd8086
	chars[3] = 'S';
Packit dd8086
      else
Packit dd8086
	chars[3] = 's';
Packit dd8086
    }
Packit dd8086
#endif
Packit dd8086
#ifdef S_ISGID
Packit dd8086
  if (bits & S_ISGID)
Packit dd8086
    {
Packit dd8086
      if (chars[6] != 'x')
Packit dd8086
	/* Set-gid, but not executable by group.  */
Packit dd8086
	chars[6] = 'S';
Packit dd8086
      else
Packit dd8086
	chars[6] = 's';
Packit dd8086
    }
Packit dd8086
#endif
Packit dd8086
#ifdef S_ISVTX
Packit dd8086
  if (bits & S_ISVTX)
Packit dd8086
    {
Packit dd8086
      if (chars[9] != 'x')
Packit dd8086
	/* Sticky, but not executable by others.  */
Packit dd8086
	chars[9] = 'T';
Packit dd8086
      else
Packit dd8086
	chars[9] = 't';
Packit dd8086
    }
Packit dd8086
#endif
Packit dd8086
}
Packit dd8086
Packit dd8086
/* Return a character indicating the type of file described by
Packit dd8086
   file mode BITS:
Packit dd8086
   'd' for directories
Packit dd8086
   'D' for doors
Packit dd8086
   'b' for block special files
Packit dd8086
   'c' for character special files
Packit dd8086
   'n' for network special files
Packit dd8086
   'm' for multiplexor files
Packit dd8086
   'M' for an off-line (regular) file
Packit dd8086
   'l' for symbolic links
Packit dd8086
   's' for sockets
Packit dd8086
   'p' for fifos
Packit dd8086
   'C' for contigous data files
Packit dd8086
   '-' for regular files
Packit dd8086
   '?' for any other file type.  */
Packit dd8086
Packit dd8086
static char
Packit dd8086
ftypelet (mode_t bits)
Packit dd8086
{
Packit dd8086
#ifdef S_ISBLK
Packit dd8086
  if (S_ISBLK (bits))
Packit dd8086
    return 'b';
Packit dd8086
#endif
Packit dd8086
  if (S_ISCHR (bits))
Packit dd8086
    return 'c';
Packit dd8086
  if (S_ISDIR (bits))
Packit dd8086
    return 'd';
Packit dd8086
  if (S_ISREG (bits))
Packit dd8086
    return '-';
Packit dd8086
#ifdef S_ISFIFO
Packit dd8086
  if (S_ISFIFO (bits))
Packit dd8086
    return 'p';
Packit dd8086
#endif
Packit dd8086
#ifdef S_ISLNK
Packit dd8086
  if (S_ISLNK (bits))
Packit dd8086
    return 'l';
Packit dd8086
#endif
Packit dd8086
#ifdef S_ISSOCK
Packit dd8086
  if (S_ISSOCK (bits))
Packit dd8086
    return 's';
Packit dd8086
#endif
Packit dd8086
#ifdef S_ISMPC
Packit dd8086
  if (S_ISMPC (bits))
Packit dd8086
    return 'm';
Packit dd8086
#endif
Packit dd8086
#ifdef S_ISNWK
Packit dd8086
  if (S_ISNWK (bits))
Packit dd8086
    return 'n';
Packit dd8086
#endif
Packit dd8086
#ifdef S_ISDOOR
Packit dd8086
  if (S_ISDOOR (bits))
Packit dd8086
    return 'D';
Packit dd8086
#endif
Packit dd8086
#ifdef S_ISCTG
Packit dd8086
  if (S_ISCTG (bits))
Packit dd8086
    return 'C';
Packit dd8086
#endif
Packit dd8086
Packit dd8086
  /* The following two tests are for Cray DMF (Data Migration
Packit dd8086
     Facility), which is a HSM file system.  A migrated file has a
Packit dd8086
     `st_dm_mode' that is different from the normal `st_mode', so any
Packit dd8086
     tests for migrated files should use the former.  */
Packit dd8086
Packit dd8086
#ifdef S_ISOFD
Packit dd8086
  if (S_ISOFD (bits))
Packit dd8086
    /* off line, with data  */
Packit dd8086
    return 'M';
Packit dd8086
#endif
Packit dd8086
#ifdef S_ISOFL
Packit dd8086
  /* off line, with no data  */
Packit dd8086
  if (S_ISOFL (bits))
Packit dd8086
    return 'M';
Packit dd8086
#endif
Packit dd8086
  return '?';
Packit dd8086
}
Packit dd8086
Packit dd8086
/*! udf_mode_string - fill in string STR with an ls-style ASCII
Packit dd8086
   representation of the st_mode field of file stats block STATP.
Packit dd8086
   10 characters are stored in STR; no terminating null is added.
Packit dd8086
   The characters stored in STR are:
Packit dd8086
Packit dd8086
   0	File type.  'd' for directory, 'c' for character
Packit dd8086
	special, 'b' for block special, 'm' for multiplex,
Packit dd8086
	'l' for symbolic link, 's' for socket, 'p' for fifo,
Packit dd8086
	'-' for regular, '?' for any other file type
Packit dd8086
Packit dd8086
   1	'r' if the owner may read, '-' otherwise.
Packit dd8086
Packit dd8086
   2	'w' if the owner may write, '-' otherwise.
Packit dd8086
Packit dd8086
   3	'x' if the owner may execute, 's' if the file is
Packit dd8086
	set-user-id, '-' otherwise.
Packit dd8086
	'S' if the file is set-user-id, but the execute
Packit dd8086
	bit isn't set.
Packit dd8086
Packit dd8086
   4	'r' if group members may read, '-' otherwise.
Packit dd8086
Packit dd8086
   5	'w' if group members may write, '-' otherwise.
Packit dd8086
Packit dd8086
   6	'x' if group members may execute, 's' if the file is
Packit dd8086
	set-group-id, '-' otherwise.
Packit dd8086
	'S' if it is set-group-id but not executable.
Packit dd8086
Packit dd8086
   7	'r' if any user may read, '-' otherwise.
Packit dd8086
Packit dd8086
   8	'w' if any user may write, '-' otherwise.
Packit dd8086
Packit dd8086
   9	'x' if any user may execute, 't' if the file is "sticky"
Packit dd8086
	(will be retained in swap space after execution), '-'
Packit dd8086
	otherwise.
Packit dd8086
	'T' if the file is sticky but not executable.  */
Packit dd8086
Packit dd8086
char *
Packit dd8086
udf_mode_string (mode_t i_mode, char *psz_str)
Packit dd8086
{
Packit dd8086
  psz_str[ 0] = ftypelet (i_mode);
Packit dd8086
  psz_str[ 1] = i_mode & S_IRUSR ? 'r' : '-';
Packit dd8086
  psz_str[ 2] = i_mode & S_IWUSR ? 'w' : '-';
Packit dd8086
  psz_str[ 3] = i_mode & S_IXUSR ? 'x' : '-';
Packit dd8086
  psz_str[ 4] = i_mode & S_IRGRP ? 'r' : '-';
Packit dd8086
  psz_str[ 5] = i_mode & S_IWGRP ? 'w' : '-';
Packit dd8086
  psz_str[ 6] = i_mode & S_IXGRP ? 'x' : '-';
Packit dd8086
  psz_str[ 7] = i_mode & S_IROTH ? 'r' : '-';
Packit dd8086
  psz_str[ 8] = i_mode & S_IWOTH ? 'w' : '-';
Packit dd8086
  psz_str[ 9] = i_mode & S_IXOTH ? 'x' : '-';
Packit dd8086
  psz_str[10] = '\0';
Packit dd8086
  setst (i_mode, psz_str);
Packit dd8086
  return psz_str;
Packit dd8086
}