Blame lib/iso9660/xa.c

Packit dd8086
/*
Packit dd8086
  Copyright (C) 2003, 2005, 2008, 2011 Rocky Bernstein <rocky@gnu.org>
Packit dd8086
  Copyright (C) 2000 Herbert Valerio Riedel <hvr@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

Packit dd8086
Packit dd8086
#ifdef HAVE_CONFIG_H
Packit dd8086
# include "config.h"
Packit dd8086
# define __CDIO_CONFIG_H__ 1
Packit dd8086
#endif
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
/*! String inside frame which identifies XA attributes.  Note should
Packit dd8086
    come *before* public headers which does a #define of
Packit dd8086
    this name.
Packit dd8086
*/
Packit dd8086
const char ISO_XA_MARKER_STRING[] = {'C', 'D', '-', 'X', 'A', '0', '0', '1'};
Packit dd8086
Packit dd8086
/* Public headers */
Packit dd8086
#include <cdio/iso9660.h>
Packit dd8086
#include <cdio/util.h>
Packit dd8086
#include <cdio/bytesex.h>
Packit dd8086
Packit dd8086
/* Private headers */
Packit dd8086
#include "cdio_assert.h"
Packit dd8086
#include "filemode.h"
Packit dd8086
Packit dd8086
/** The below variable is trickery to force enum symbol values to be
Packit dd8086
    recorded in debug symbol tables. It is 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
xa_misc_enum_t debugger_xa_misc_enum;
Packit dd8086
Packit dd8086
#define BUF_COUNT 16
Packit dd8086
#define BUF_SIZE 80
Packit dd8086
Packit dd8086
/* Return a pointer to a internal free buffer */
Packit dd8086
static char *
Packit dd8086
_getbuf (void)
Packit dd8086
{
Packit dd8086
  static char _buf[BUF_COUNT][BUF_SIZE];
Packit dd8086
  static int _num = -1;
Packit dd8086
  
Packit dd8086
  _num++;
Packit dd8086
  _num %= BUF_COUNT;
Packit dd8086
Packit dd8086
  memset (_buf[_num], 0, BUF_SIZE);
Packit dd8086
Packit dd8086
  return _buf[_num];
Packit dd8086
}
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Returns a string which interpreting the extended attribute xa_attr. 
Packit dd8086
  For example:
Packit dd8086
  \verbatim
Packit dd8086
  d---1xrxrxr
Packit dd8086
  ---2--r-r-r
Packit dd8086
  -a--1xrxrxr
Packit dd8086
  \endverbatim
Packit dd8086
Packit dd8086
  A description of the characters in the string follows
Packit dd8086
  The 1st character is either "d" if the entry is a directory, or "-" if not.
Packit dd8086
  The 2nd character is either "a" if the entry is CDDA (audio), or "-" if not.
Packit dd8086
  The 3rd character is either "i" if the entry is interleaved, or "-" if not.
Packit dd8086
  The 4th character is either "2" if the entry is mode2 form2 or "-" if not.
Packit dd8086
  The 5th character is either "1" if the entry is mode2 form1 or "-" if not.
Packit dd8086
   Note that an entry will either be in mode2 form1 or mode form2. That
Packit dd8086
   is you will either see "2-" or "-1" in the 4th & 5th positions.
Packit dd8086
Packit dd8086
  The 6th and 7th characters refer to permissions for a user while the
Packit dd8086
  the 8th and 9th characters refer to permissions for a group while, and 
Packit dd8086
  the 10th and 11th characters refer to permissions for a others. 
Packit dd8086
 
Packit dd8086
  In each of these pairs the first character (6, 8, 10) is "x" if the 
Packit dd8086
  entry is executable. For a directory this means the directory is
Packit dd8086
  allowed to be listed or "searched".
Packit dd8086
  The second character of a pair (7, 9, 11) is "r" if the entry is allowed
Packit dd8086
  to be read. 
Packit dd8086
*/
Packit dd8086
Packit dd8086
const char *
Packit dd8086
iso9660_get_xa_attr_str (uint16_t xa_attr)
Packit dd8086
{
Packit dd8086
  char *result = _getbuf();
Packit dd8086
Packit dd8086
  xa_attr = uint16_from_be (xa_attr);
Packit dd8086
Packit dd8086
  result[ 0] = (xa_attr & XA_ATTR_DIRECTORY) ? 'd' : '-';
Packit dd8086
  result[ 1] = (xa_attr & XA_ATTR_CDDA) ? 'a' : '-';
Packit dd8086
  result[ 2] = (xa_attr & XA_ATTR_INTERLEAVED) ? 'i' : '-';
Packit dd8086
  result[ 3] = (xa_attr & XA_ATTR_MODE2FORM2) ? '2' : '-';
Packit dd8086
  result[ 4] = (xa_attr & XA_ATTR_MODE2FORM1) ? '1' : '-';
Packit dd8086
Packit dd8086
  result[ 5] = (xa_attr & XA_PERM_XUSR) ? 'x' : '-';
Packit dd8086
  result[ 6] = (xa_attr & XA_PERM_RUSR) ? 'r' : '-';
Packit dd8086
Packit dd8086
  result[ 7] = (xa_attr & XA_PERM_XGRP) ? 'x' : '-';
Packit dd8086
  result[ 8] = (xa_attr & XA_PERM_RGRP) ? 'r' : '-';
Packit dd8086
Packit dd8086
  /* Hack alert: wonder if this should be ROTH and XOTH? */
Packit dd8086
  result[ 9] = (xa_attr & XA_PERM_XSYS) ? 'x' : '-';
Packit dd8086
  result[10] = (xa_attr & XA_PERM_RSYS) ? 'r' : '-';
Packit dd8086
Packit dd8086
  result[11] = '\0';
Packit dd8086
Packit dd8086
  return result;
Packit dd8086
}
Packit dd8086
Packit dd8086
iso9660_xa_t *
Packit dd8086
iso9660_xa_init (iso9660_xa_t *_xa, uint16_t uid, uint16_t gid, uint16_t attr, 
Packit dd8086
	      uint8_t filenum)
Packit dd8086
{
Packit dd8086
  cdio_assert (_xa != NULL);
Packit dd8086
  
Packit dd8086
  _xa->user_id = uint16_to_be (uid);
Packit dd8086
  _xa->group_id = uint16_to_be (gid);
Packit dd8086
  _xa->attributes = uint16_to_be (attr);
Packit dd8086
Packit dd8086
  _xa->signature[0] = 'X';
Packit dd8086
  _xa->signature[1] = 'A';
Packit dd8086
Packit dd8086
  _xa->filenum = filenum;
Packit dd8086
Packit dd8086
  _xa->reserved[0] 
Packit dd8086
    = _xa->reserved[1] 
Packit dd8086
    = _xa->reserved[2] 
Packit dd8086
    = _xa->reserved[3] 
Packit dd8086
    = _xa->reserved[4] = 0x00;
Packit dd8086
Packit dd8086
  return _xa;
Packit dd8086
}
Packit dd8086
Packit dd8086
void
Packit dd8086
iso9660_xa_free (iso9660_xa_t *_xa)
Packit dd8086
{
Packit dd8086
  if (_xa != NULL)
Packit dd8086
    free(_xa);
Packit dd8086
}
Packit dd8086
Packit dd8086
/*!
Packit dd8086
  Returns POSIX mode bitstring for a given file.
Packit dd8086
*/
Packit dd8086
posix_mode_t 
Packit dd8086
iso9660_get_posix_filemode_from_xa(uint16_t i_perms) 
Packit dd8086
{
Packit dd8086
  posix_mode_t mode = 0;
Packit dd8086
  
Packit dd8086
  if (i_perms & XA_PERM_RUSR)  mode |= S_IRUSR;
Packit dd8086
  if (i_perms & XA_PERM_XUSR)  mode |= S_IXUSR;
Packit dd8086
  
Packit dd8086
#ifdef S_IRGRP
Packit dd8086
  if (i_perms & XA_PERM_RGRP)  mode |= S_IRGRP;
Packit dd8086
#endif
Packit dd8086
#ifdef S_IXGRP
Packit dd8086
  if (i_perms & XA_PERM_XGRP)  mode |= S_IXGRP;
Packit dd8086
#endif
Packit dd8086
  
Packit dd8086
#ifdef S_IROTH
Packit dd8086
  if (i_perms & XA_PERM_ROTH)  mode |= S_IROTH;
Packit dd8086
#endif
Packit dd8086
#ifdef S_IXOTH
Packit dd8086
  if (i_perms & XA_PERM_XOTH)  mode |= S_IXOTH;
Packit dd8086
#endif
Packit dd8086
  
Packit dd8086
  if (i_perms & XA_ATTR_DIRECTORY)  mode |= S_IFDIR;
Packit dd8086
  
Packit dd8086
  return mode;
Packit dd8086
}
Packit dd8086