Blame lib/udf/udf.c

Packit dd8086
/*
Packit dd8086
  Copyright (C) 2005, 2008, 2010, 2012 Rocky Bernstein <rocky@gnu.org>
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
/* Access routines */
Packit dd8086
Packit dd8086
/* udf_private.h has to come first else _FILE_OFFSET_BITS are redefined in
Packit dd8086
   say opensolaris. */
Packit dd8086
#include "udf_private.h"
Packit dd8086
#include <cdio/bytesex.h>
Packit dd8086
#include "filemode.h"
Packit dd8086
Packit dd8086
#ifdef HAVE_STRING_H
Packit dd8086
# include <string.h>
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
/** The below variables are trickery to force enum symbol values to be
Packit dd8086
    recorded in debug symbol tables. They are used to allow one to refer
Packit dd8086
    to the enumeration value names in the typedefs above in a debugger
Packit dd8086
    and debugger expressions
Packit dd8086
*/
Packit dd8086
tag_id_t                 debug_tagid;
Packit dd8086
file_characteristics_t   debug_file_characteristics;
Packit dd8086
icbtag_file_type_enum_t  debug_icbtag_file_type_enum;
Packit dd8086
icbtag_flag_enum_t       debug_flag_enum;
Packit dd8086
ecma_167_enum1_t         debug_ecma_167_enum1;
Packit dd8086
ecma_167_timezone_enum_t debug_ecma_167_timezone_enum;
Packit dd8086
udf_enum1_t              debug_udf_enum1;
Packit dd8086
  
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Returns POSIX mode bitstring for a given file.
Packit dd8086
*/
Packit dd8086
mode_t 
Packit dd8086
udf_get_posix_filemode(const udf_dirent_t *p_udf_dirent) 
Packit dd8086
{
Packit dd8086
  udf_file_entry_t udf_fe;
Packit dd8086
  mode_t mode = 0;
Packit dd8086
Packit dd8086
  if (udf_get_file_entry(p_udf_dirent, &udf_fe)) {
Packit dd8086
    uint32_t i_perms;
Packit dd8086
#ifdef S_ISUID
Packit dd8086
    uint16_t i_flags;
Packit dd8086
Packit dd8086
    i_flags = uint16_from_le(udf_fe.icb_tag.flags);
Packit dd8086
#endif
Packit dd8086
    i_perms = uint32_from_le(udf_fe.permissions);
Packit dd8086
Packit dd8086
    if (i_perms & FE_PERM_U_READ)  mode |= S_IRUSR;
Packit dd8086
    if (i_perms & FE_PERM_U_WRITE) mode |= S_IWUSR;
Packit dd8086
    if (i_perms & FE_PERM_U_EXEC)  mode |= S_IXUSR;
Packit dd8086
    
Packit dd8086
#ifdef S_IRGRP
Packit dd8086
    if (i_perms & FE_PERM_G_READ)  mode |= S_IRGRP;
Packit dd8086
    if (i_perms & FE_PERM_G_WRITE) mode |= S_IWGRP;
Packit dd8086
    if (i_perms & FE_PERM_G_EXEC)  mode |= S_IXGRP;
Packit dd8086
#endif
Packit dd8086
    
Packit dd8086
#ifdef S_IROTH
Packit dd8086
    if (i_perms & FE_PERM_O_READ)  mode |= S_IROTH;
Packit dd8086
    if (i_perms & FE_PERM_O_WRITE) mode |= S_IWOTH;
Packit dd8086
    if (i_perms & FE_PERM_O_EXEC)  mode |= S_IXOTH;
Packit dd8086
#endif
Packit dd8086
Packit dd8086
    switch (udf_fe.icb_tag.file_type) {
Packit dd8086
    case ICBTAG_FILE_TYPE_DIRECTORY: 
Packit dd8086
      mode |= S_IFDIR;
Packit dd8086
      break;
Packit dd8086
    case ICBTAG_FILE_TYPE_REGULAR:
Packit dd8086
      mode |= S_IFREG;
Packit dd8086
      break;
Packit dd8086
#ifdef S_IFLNK
Packit dd8086
    case ICBTAG_FILE_TYPE_SYMLINK:
Packit dd8086
      mode |= S_IFLNK;
Packit dd8086
      break;
Packit dd8086
#endif
Packit dd8086
    case ICBTAG_FILE_TYPE_CHAR:
Packit dd8086
      mode |= S_IFCHR;
Packit dd8086
      break;
Packit dd8086
#ifdef S_IFSOCK
Packit dd8086
    case ICBTAG_FILE_TYPE_SOCKET:
Packit dd8086
      mode |= S_IFSOCK;
Packit dd8086
      break;
Packit dd8086
#endif
Packit dd8086
    case ICBTAG_FILE_TYPE_BLOCK:
Packit dd8086
      mode |= S_IFBLK;
Packit dd8086
      break;
Packit dd8086
    default: ;
Packit dd8086
    };
Packit dd8086
  
Packit dd8086
#ifdef S_ISUID
Packit dd8086
    if (i_flags & ICBTAG_FLAG_SETUID) mode |= S_ISUID;
Packit dd8086
    if (i_flags & ICBTAG_FLAG_SETGID) mode |= S_ISGID;
Packit dd8086
    if (i_flags & ICBTAG_FLAG_STICKY) mode |= S_ISVTX;
Packit dd8086
#endif
Packit dd8086
  }
Packit dd8086
  
Packit dd8086
  return mode;
Packit dd8086
  
Packit dd8086
}
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Return the partition number of the the opened udf handle. -1 
Packit dd8086
  Is returned if we have an error.
Packit dd8086
*/
Packit dd8086
int16_t udf_get_part_number(const udf_t *p_udf)
Packit dd8086
{
Packit dd8086
  if (!p_udf) return -1;
Packit dd8086
  return p_udf->i_partition;
Packit dd8086
}
Packit dd8086