Compare commits
5 Commits
ZeroThreeT
...
ZeroTwoTwo
Author | SHA1 | Date | |
---|---|---|---|
beb0ce5522 | |||
659f88bec7 | |||
a52ad2fcf5 | |||
f3cb096f46 | |||
3cb1741725 |
@ -1,11 +1,11 @@
|
|||||||
Mario Danic <mario.danic@gmail.com>,
|
Mario Danic <mario.danic@gmail.com>,
|
||||||
Vreixo Formoso <metalpain2002@yahoo.es>
|
Vreixo Formoso <metalpain2002@yahoo.es>
|
||||||
Thomas Schmitt <scdbackup@gmx.net>
|
Thomas Schmitt <scdbackup@gmx.net>
|
||||||
libisoburn is Copyright (C) 2007-2009 Vreixo Formoso, Thomas Schmitt
|
libisoburn is Copyright (C) 2007-2008 Vreixo Formoso, Thomas Schmitt
|
||||||
xorriso is Copyright (C) 2007-2009 Thomas Schmitt
|
xorriso is Copyright (C) 2007-2008 Thomas Schmitt
|
||||||
libisofs (if included) is Copyright (C) 2007-2009 Vreixo Formoso, Mario Danic
|
libisofs (if included) is Copyright (C) 2007-2008 Vreixo Formoso, Mario Danic
|
||||||
libburn (if included) is Copyright (C) 2002-2006 Derek Foreman, Ben Jansens
|
libburn (if included) is Copyright (C) 2002-2006 Derek Foreman, Ben Jansens
|
||||||
and Copyright (C) 2006-2009 Mario Danic, Thomas Schmitt
|
and Copyright (C) 2006-2008 Mario Danic, Thomas Schmitt
|
||||||
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
42
Makefile.am
42
Makefile.am
@ -32,21 +32,8 @@ libinclude_HEADERS = \
|
|||||||
bin_PROGRAMS = \
|
bin_PROGRAMS = \
|
||||||
xorriso/xorriso
|
xorriso/xorriso
|
||||||
|
|
||||||
# This looks quite ugly with make install: xorriso.c is compiled twice again
|
|
||||||
#
|
|
||||||
# Trying to create a build timestamp file
|
|
||||||
#
|
|
||||||
# BUILT_SOURCES = xorriso/xorriso_buildstamp.h
|
|
||||||
#
|
|
||||||
# phony targets get rebuilt every time
|
|
||||||
#
|
|
||||||
# .PHONY: xorriso/xorriso_buildstamp.h
|
|
||||||
# xorriso/xorriso_buildstamp.h:
|
|
||||||
# date -u '+#define Xorriso_build_timestamP "%Y.%m.%d.%H%M%S"' >xorriso/xorriso_buildstamp.h
|
|
||||||
# cat xorriso/xorriso_buildstamp.h
|
|
||||||
|
|
||||||
xorriso_xorriso_CPPFLAGS = -Ilibisoburn
|
xorriso_xorriso_CPPFLAGS = -Ilibisoburn
|
||||||
xorriso_xorriso_CFLAGS = -DXorriso_with_maiN $(READLINE_DEF)
|
xorriso_xorriso_CFLAGS = -DXorriso_with_maiN -DXorriso_with_regeX $(READLINE_DEF)
|
||||||
xorriso_xorriso_LDADD = libisoburn/libisoburn.la -lisofs -lburn $(THREAD_LIBS)
|
xorriso_xorriso_LDADD = libisoburn/libisoburn.la -lisofs -lburn $(THREAD_LIBS)
|
||||||
xorriso_xorriso_SOURCES = \
|
xorriso_xorriso_SOURCES = \
|
||||||
xorriso/xorriso.h \
|
xorriso/xorriso.h \
|
||||||
@ -61,16 +48,15 @@ xorriso_xorriso_SOURCES = \
|
|||||||
# Install symbolic links to the xorriso binary
|
# Install symbolic links to the xorriso binary
|
||||||
#
|
#
|
||||||
install-exec-hook:
|
install-exec-hook:
|
||||||
if test -e "$(DESTDIR)$(bindir)"/xorrisofs ; then rm "$(DESTDIR)$(bindir)"/xorrisofs ; else echo ; fi
|
if test -e $(bindir)/xorrisofs ; then rm $(bindir)/xorrisofs ; else echo ; fi
|
||||||
ln -s xorriso "$(DESTDIR)$(bindir)"/xorrisofs
|
ln -s xorriso $(bindir)/xorrisofs
|
||||||
if test -e "$(DESTDIR)$(bindir)"/osirrox ; then rm "$(DESTDIR)$(bindir)"/osirrox ; else echo ; fi
|
if test -e $(bindir)/osirrox ; then rm $(bindir)/osirrox ; else echo ; fi
|
||||||
ln -s xorriso "$(DESTDIR)$(bindir)"/osirrox
|
ln -s xorriso $(bindir)/osirrox
|
||||||
if test -e "$(DESTDIR)$(bindir)"/xorrecord ; then rm "$(DESTDIR)$(bindir)"/xorrecord ; else echo ; fi
|
if test -e $(bindir)/xorrecord ; then rm $(bindir)/xorrecord ; else echo ; fi
|
||||||
ln -s xorriso "$(DESTDIR)$(bindir)"/xorrecord
|
ln -s xorriso $(bindir)/xorrecord
|
||||||
|
|
||||||
|
|
||||||
# Alternative to the disabled .PHONY above.
|
# Trying to create a build timestamp file
|
||||||
# Trying to create a build timestamp file semi-manually: make buildstamped
|
|
||||||
#
|
#
|
||||||
buildstamp:
|
buildstamp:
|
||||||
date -u '+#define Xorriso_build_timestamP "%Y.%m.%d.%H%M%S"' >xorriso/xorriso_buildstamp.h
|
date -u '+#define Xorriso_build_timestamP "%Y.%m.%d.%H%M%S"' >xorriso/xorriso_buildstamp.h
|
||||||
@ -79,7 +65,15 @@ buildstamp:
|
|||||||
# For now make buildstamped has to be performed explicitely.
|
# For now make buildstamped has to be performed explicitely.
|
||||||
buildstamped: buildstamp
|
buildstamped: buildstamp
|
||||||
make
|
make
|
||||||
|
#
|
||||||
|
# Processing of the "all:" rule happens too late.
|
||||||
|
# How to create a dependency of xorriso.c on buildstamp ?
|
||||||
|
# Not working:
|
||||||
|
# Add xorriso_buildstamp.h to xorriso_xorriso_SOURCES and make it depend
|
||||||
|
# on buildstamp. It runs. But at quite random occasions.
|
||||||
|
# xorriso/xorriso_buildstamp.h: buildstamp
|
||||||
|
#
|
||||||
|
# all: buildstamp
|
||||||
|
|
||||||
|
|
||||||
## Build test applications
|
## Build test applications
|
||||||
@ -152,8 +146,6 @@ man_MANS = xorriso/xorriso.1
|
|||||||
EXTRA_DIST = \
|
EXTRA_DIST = \
|
||||||
libisoburn-1.pc.in \
|
libisoburn-1.pc.in \
|
||||||
version.h.in \
|
version.h.in \
|
||||||
doc/comments \
|
|
||||||
doc/doxygen.conf.in \
|
|
||||||
README \
|
README \
|
||||||
AUTHORS \
|
AUTHORS \
|
||||||
CONTRIBUTORS \
|
CONTRIBUTORS \
|
||||||
|
31
README
31
README
@ -4,13 +4,13 @@
|
|||||||
libisoburn. By Vreixo Formoso <metalpain2002@yahoo.es>
|
libisoburn. By Vreixo Formoso <metalpain2002@yahoo.es>
|
||||||
and Thomas Schmitt <scdbackup@gmx.net>
|
and Thomas Schmitt <scdbackup@gmx.net>
|
||||||
Integrated sub project of libburnia-project.org.
|
Integrated sub project of libburnia-project.org.
|
||||||
http://files.libburnia-project.org/releases/libisoburn-0.3.2.pl00.tar.gz
|
http://files.libburnia-project.org/releases/libisoburn-0.2.2.pl00.tar.gz
|
||||||
Copyright (C) 2006-2009 Vreixo Formoso, Thomas Schmitt.
|
Copyright (C) 2006-2008 Vreixo Formoso, Thomas Schmitt.
|
||||||
Provided under GPL version 2.
|
Provided under GPL version 2.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
libisoburn is a frontend for libraries libburn and libisofs which enables
|
libisoburn is a frontend for libraries libburn and libisofs which enables
|
||||||
creation and expansion of ISO-9660 filesystems on all CD/DVD/BD media supported
|
creation and expansion of ISO-9660 filesystems on all CD/DVD media supported
|
||||||
by libburn. This includes media like DVD+RW, which do not support multi-session
|
by libburn. This includes media like DVD+RW, which do not support multi-session
|
||||||
management on media level and even plain disk files or block devices.
|
management on media level and even plain disk files or block devices.
|
||||||
|
|
||||||
@ -18,8 +18,7 @@ The price for that is thorough specialization on data files in ISO-9660
|
|||||||
filesystem images. So libisoburn is not suitable for audio (CD-DA) or any
|
filesystem images. So libisoburn is not suitable for audio (CD-DA) or any
|
||||||
other CD layout which does not entirely consist of ISO-9660 sessions.
|
other CD layout which does not entirely consist of ISO-9660 sessions.
|
||||||
|
|
||||||
Currently it is supported on Linux with kernels >= 2.4 and on FreeBSD versions
|
Currently it is only supported on Linux with kernels >= 2.4.
|
||||||
with ATAPI/CAM support enabled in the kernel, see atapicam(4).
|
|
||||||
|
|
||||||
By using this software you agree to the disclaimer at the end of this text:
|
By using this software you agree to the disclaimer at the end of this text:
|
||||||
"... without even the implied warranty ..."
|
"... without even the implied warranty ..."
|
||||||
@ -27,18 +26,18 @@ By using this software you agree to the disclaimer at the end of this text:
|
|||||||
|
|
||||||
Compilation, First Glimpse, Installation
|
Compilation, First Glimpse, Installation
|
||||||
|
|
||||||
Dynamic library and compile time header requirements for libisoburn-0.3.2 :
|
Dynamic library and compile time header requirements for libisoburn-0.2.2 :
|
||||||
- libburn.so.4 , version libburn-0.6.0 or higher
|
- libburn.so.4 , version libburn-0.5.0 or higher
|
||||||
- libisofs.so.6 , version libisofs-0.6.12 or higher
|
- libisofs.so.6 , version libisofs-0.6.6 or higher
|
||||||
libisoburn and xorriso will not start with libraries which are older than their
|
libisoburn and xorriso will not start with libraries which are older than their
|
||||||
headers seen at compile time. So compile in the oldest possible installation
|
headers seen at compile time. So compile in the oldest possible installation
|
||||||
setup unless you have reason to enforce a newer bug fix level.
|
setup unless you have reason to enforce a newer bug fix level.
|
||||||
|
|
||||||
Obtain libisoburn-0.3.2.pl00.tar.gz, take it to a directory of your choice
|
Obtain libisoburn-0.2.2.pl00.tar.gz, take it to a directory of your choice
|
||||||
and do:
|
and do:
|
||||||
|
|
||||||
tar xzf libisoburn-0.3.2.pl00.tar.gz
|
tar xzf libisoburn-0.2.2.pl00.tar.gz
|
||||||
cd libisoburn-0.3.2
|
cd libisoburn-0.2.2
|
||||||
|
|
||||||
Within that directory execute:
|
Within that directory execute:
|
||||||
|
|
||||||
@ -58,7 +57,7 @@ as well as
|
|||||||
|
|
||||||
xorriso
|
xorriso
|
||||||
|
|
||||||
libisoburn comes with a command line and dialog application named xorriso,
|
libisoburn includes a command line and dialog application named xorriso,
|
||||||
which offers a substantial part of libisoburn features to shell scripts and
|
which offers a substantial part of libisoburn features to shell scripts and
|
||||||
users. Its file xorriso/README describes a standalone tarball as first
|
users. Its file xorriso/README describes a standalone tarball as first
|
||||||
preference for statically linked xorriso installation.
|
preference for statically linked xorriso installation.
|
||||||
@ -73,12 +72,6 @@ Several alias links point to the xorriso binary:
|
|||||||
xorrecord starts xorriso with -as cdrecord emulation already enabled
|
xorrecord starts xorriso with -as cdrecord emulation already enabled
|
||||||
osirrox starts with -osirrox image-to-disk copying already enabled
|
osirrox starts with -osirrox image-to-disk copying already enabled
|
||||||
|
|
||||||
By default xorriso will depend on libreadline if the readline-dev headers
|
|
||||||
are present. This dependcy can be avoided by running
|
|
||||||
./configure --prefix=/usr --disable-libreadline
|
|
||||||
make clean ; make
|
|
||||||
Never omit the "make clean" command after switching libreadline enabling.
|
|
||||||
|
|
||||||
|
|
||||||
Drives and Disk File Objects
|
Drives and Disk File Objects
|
||||||
|
|
||||||
@ -156,7 +149,7 @@ libburnia-project.org
|
|||||||
By Mario Danic <mario.danic@gmail.com>,
|
By Mario Danic <mario.danic@gmail.com>,
|
||||||
Vreixo Formoso <metalpain2002@yahoo.es>
|
Vreixo Formoso <metalpain2002@yahoo.es>
|
||||||
Thomas Schmitt <scdbackup@gmx.net>
|
Thomas Schmitt <scdbackup@gmx.net>
|
||||||
Copyright (C) 2006-2009 Mario Danic, Vreixo Formoso, Thomas Schmitt.
|
Copyright (C) 2006-2008 Mario Danic, Vreixo Formoso, Thomas Schmitt.
|
||||||
|
|
||||||
libburnia-project.org is inspired by and in other components still containing
|
libburnia-project.org is inspired by and in other components still containing
|
||||||
parts of old
|
parts of old
|
||||||
|
34
configure.ac
34
configure.ac
@ -1,4 +1,4 @@
|
|||||||
AC_INIT([libisoburn], [0.3.2], [http://libburnia-project.org])
|
AC_INIT([libisoburn], [0.2.2], [http://libburnia-project.org])
|
||||||
AC_PREREQ([2.50])
|
AC_PREREQ([2.50])
|
||||||
dnl AC_CONFIG_HEADER([config.h])
|
dnl AC_CONFIG_HEADER([config.h])
|
||||||
|
|
||||||
@ -8,7 +8,7 @@ AC_CANONICAL_TARGET
|
|||||||
AM_INIT_AUTOMAKE([subdir-objects])
|
AM_INIT_AUTOMAKE([subdir-objects])
|
||||||
|
|
||||||
dnl Hint: Search list for version code aspects:
|
dnl Hint: Search list for version code aspects:
|
||||||
dnl /AC_INIT(
|
dnl /AC_INT(
|
||||||
dnl /ISOBURN_.*_VERSION
|
dnl /ISOBURN_.*_VERSION
|
||||||
dnl /LT_.*
|
dnl /LT_.*
|
||||||
dnl /LIB.*_REQUIRED
|
dnl /LIB.*_REQUIRED
|
||||||
@ -20,7 +20,7 @@ dnl LT_CURREN, LT_AGE, LT_REVISION where SONAME becomes LT_CURRENT - LT_AGE
|
|||||||
dnl
|
dnl
|
||||||
dnl These three are only copies to provide libtool with unused LT_RELEASE
|
dnl These three are only copies to provide libtool with unused LT_RELEASE
|
||||||
ISOBURN_MAJOR_VERSION=0
|
ISOBURN_MAJOR_VERSION=0
|
||||||
ISOBURN_MINOR_VERSION=3
|
ISOBURN_MINOR_VERSION=2
|
||||||
ISOBURN_MICRO_VERSION=2
|
ISOBURN_MICRO_VERSION=2
|
||||||
dnl ISOBURN_VERSION=$ISOBURN_MAJOR_VERSION.$ISOBURN_MINOR_VERSION.$ISOBURN_MICRO_VERSION
|
dnl ISOBURN_VERSION=$ISOBURN_MAJOR_VERSION.$ISOBURN_MINOR_VERSION.$ISOBURN_MICRO_VERSION
|
||||||
|
|
||||||
@ -33,16 +33,16 @@ dnl Libtool versioning
|
|||||||
dnl Generate libisoburn.so.1.x.y
|
dnl Generate libisoburn.so.1.x.y
|
||||||
dnl SONAME will become LT_CURRENT - LT_AGE
|
dnl SONAME will become LT_CURRENT - LT_AGE
|
||||||
dnl
|
dnl
|
||||||
dnl ts A90105
|
dnl ts A80718
|
||||||
dnl This is the release version 0.3.2 = libisoburn.so.1.21.0
|
dnl This is the release version 0.2.2 = libisoburn.so.1.11.0
|
||||||
dnl ### This is the development version after above stable release
|
dnl ### This is the development version after above stable release
|
||||||
dnl LT_CURRENT++, LT_AGE++ have not happened happened yet.
|
dnl LT_CURRENT++, LT_AGE++ have not happened happened yet.
|
||||||
dnl ### LT_CURRENT++, LT_AGE++ has happened meanwhile.
|
dnl ### LT_CURRENT++, LT_AGE++ has happened meanwhile.
|
||||||
dnl
|
dnl
|
||||||
dnl SONAME = 22 - 21 = 1 . Library name = libisoburn.so.1.21.0
|
dnl SONAME = 12 - 11 = 1 . Library name = libburn.so.1.11.0
|
||||||
LT_RELEASE=$ISOBURN_MAJOR_VERSION.$ISOBURN_MINOR_VERSION
|
LT_RELEASE=$ISOBURN_MAJOR_VERSION.$ISOBURN_MINOR_VERSION
|
||||||
LT_CURRENT=22
|
LT_CURRENT=12
|
||||||
LT_AGE=21
|
LT_AGE=11
|
||||||
LT_REVISION=0
|
LT_REVISION=0
|
||||||
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`
|
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`
|
||||||
|
|
||||||
@ -86,28 +86,22 @@ AC_SUBST(ARCH)
|
|||||||
AC_SUBST(LIBBURN_ARCH_LIBS)
|
AC_SUBST(LIBBURN_ARCH_LIBS)
|
||||||
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(libreadline,
|
|
||||||
[ --enable-libreadline Enable use of libreadline by xorriso, default=yes],
|
|
||||||
, enable_libreadline=yes)
|
|
||||||
if test x$enable_libreadline = xyes; then
|
|
||||||
dnl Check whether there is readline-devel and readline-runtime.
|
dnl Check whether there is readline-devel and readline-runtime.
|
||||||
dnl If not, erase this macro which would enable use of readline(),add_history()
|
dnl If not, erase this macro which would enable use of readline(),add_history()
|
||||||
READLINE_DEF="-DXorriso_with_readlinE"
|
READLINE_DEF="-DXorriso_with_readlinE"
|
||||||
dnl The empty yes case obviously causes -lreadline to be linked
|
dnl The empty yes case obviously causes -lreadline to be linked
|
||||||
AC_CHECK_HEADER(readline/readline.h, AC_CHECK_LIB(readline, readline, , READLINE_DEF= ), READLINE_DEF= )
|
AC_CHECK_HEADER(readline/readline.h, AC_CHECK_LIB(readline, readline, , READLINE_DEF= ), READLINE_DEF= )
|
||||||
dnl The X= in the yes case prevents that -lreadline gets linked twice
|
dnl The X= in the yes case prevents that -lreadline gets linked twice
|
||||||
AC_CHECK_HEADER(readline/history.h, AC_CHECK_LIB(readline, add_history, X= , READLINE_DEF= ), READLINE_DEF= )
|
AC_CHECK_HEADER(readline/history.h, AC_CHECK_LIB(readline, add_history, X= , READLINE_DEF= ), READLINE_DEF= )
|
||||||
else
|
|
||||||
READLINE_DEF=
|
|
||||||
fi
|
|
||||||
AC_SUBST(READLINE_DEF)
|
AC_SUBST(READLINE_DEF)
|
||||||
|
|
||||||
|
|
||||||
AC_CHECK_HEADER(libburn/libburn.h)
|
AC_CHECK_HEADER(libburn/libburn.h)
|
||||||
AC_CHECK_HEADER(libisofs/libisofs.h)
|
AC_CHECK_HEADER(libisofs/libisofs.h)
|
||||||
|
|
||||||
dnl Check for proper library versions
|
dnl Check for proper library versions
|
||||||
LIBBURN_REQUIRED=0.6.0
|
LIBBURN_REQUIRED=0.5.0
|
||||||
LIBISOFS_REQUIRED=0.6.12
|
LIBISOFS_REQUIRED=0.6.6
|
||||||
PKG_CHECK_MODULES(LIBBURN, libburn-1 >= $LIBBURN_REQUIRED)
|
PKG_CHECK_MODULES(LIBBURN, libburn-1 >= $LIBBURN_REQUIRED)
|
||||||
PKG_CHECK_MODULES(LIBISOFS, libisofs-1 >= $LIBISOFS_REQUIRED)
|
PKG_CHECK_MODULES(LIBISOFS, libisofs-1 >= $LIBISOFS_REQUIRED)
|
||||||
|
|
||||||
|
58
doc/comments
58
doc/comments
@ -1,58 +0,0 @@
|
|||||||
/**
|
|
||||||
@author Mario Danic, Vreixo Formoso, Thomas Schmitt
|
|
||||||
|
|
||||||
@mainpage Libisoburn Documentation Index
|
|
||||||
|
|
||||||
@section intro Introduction
|
|
||||||
|
|
||||||
Libburnia is an open-source project for reading, mastering and writing
|
|
||||||
optical discs. This page is about its capability to read, manipulate, and
|
|
||||||
write ISO 9660 filesystems with Rock Ridge extensions. Media can be optical
|
|
||||||
media or filesystem objects.
|
|
||||||
|
|
||||||
Our scope is currently Linux 2.4 and 2.6, or FreeBSD .
|
|
||||||
|
|
||||||
libisoburn is an add-on to libburn and libisofs which coordinates both and
|
|
||||||
also allows to grow ISO-9660 filesystem images on multi-session media as well
|
|
||||||
as on overwriteable media via the same API.
|
|
||||||
All media peculiarities are handled automatically.
|
|
||||||
|
|
||||||
xorriso is an application of all three libraries which creates, loads,
|
|
||||||
manipulates and writes ISO 9660 filesystem images with Rock Ridge extensions.
|
|
||||||
Manipulation is not only adding or overwriting of files but also deletion,
|
|
||||||
renaming, and attribute changing. An incremental backup feature is provided.
|
|
||||||
See xorriso/README for more
|
|
||||||
|
|
||||||
SONAME:
|
|
||||||
libisoburn.so.1 (since 0.1.0, February 2008).
|
|
||||||
|
|
||||||
|
|
||||||
@section using Using the libraries
|
|
||||||
|
|
||||||
Our build system is based on autotools.
|
|
||||||
User experience tells us that you will need at least autotools version 1.7.
|
|
||||||
|
|
||||||
To build libisoburn go into its toplevel directory and execute
|
|
||||||
|
|
||||||
- ./bootstrap (needed if you downloaded from SVN)
|
|
||||||
|
|
||||||
- ./configure
|
|
||||||
|
|
||||||
- make
|
|
||||||
|
|
||||||
To make the libraries accessible for running resp. developing applications
|
|
||||||
|
|
||||||
- make install
|
|
||||||
|
|
||||||
Read libisoburn/libisoburn.h for a description of the API.
|
|
||||||
See also README, xorriso/README, and the man page xorriso/xorriso.1 which
|
|
||||||
gives an idea of the capabilities provided by Libburnia.
|
|
||||||
|
|
||||||
You will also have to install and understand the two libraries of the
|
|
||||||
Libburnia project which provide fundamental services:
|
|
||||||
libburn is the library by which preformatted data get onto optical media.
|
|
||||||
See libburn/libburn.h for its API description.
|
|
||||||
libisofs is the library to handle ISO 9660 filesystems with Rock Ridge
|
|
||||||
extensions. Its API is described in libisofs/libisofs.h .
|
|
||||||
|
|
||||||
*/
|
|
@ -477,7 +477,7 @@ WARN_LOGFILE =
|
|||||||
# directories like "/usr/src/myproject". Separate the files or directories
|
# directories like "/usr/src/myproject". Separate the files or directories
|
||||||
# with spaces.
|
# with spaces.
|
||||||
|
|
||||||
INPUT = libisoburn \
|
INPUT = libburn \
|
||||||
doc \
|
doc \
|
||||||
test
|
test
|
||||||
|
|
||||||
@ -495,7 +495,9 @@ INPUT_ENCODING = UTF-8
|
|||||||
# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
|
# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
|
||||||
# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
|
# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
|
||||||
|
|
||||||
FILE_PATTERNS =
|
FILE_PATTERNS = libburn.h \
|
||||||
|
comments \
|
||||||
|
libburner.c
|
||||||
|
|
||||||
# The RECURSIVE tag can be used to turn specify whether or not subdirectories
|
# The RECURSIVE tag can be used to turn specify whether or not subdirectories
|
||||||
# should be searched for input files as well. Possible values are YES and NO.
|
# should be searched for input files as well. Possible values are YES and NO.
|
||||||
|
@ -1,328 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
Arbitrary Attribute Interchange Protocol
|
|
||||||
|
|
||||||
Draft version 0.2
|
|
||||||
Dec 19 2008
|
|
||||||
|
|
||||||
Interchange of Persistent File Attributes
|
|
||||||
|
|
||||||
by Thomas Schmitt - mailto:scdbackup@gmx.net
|
|
||||||
Libburnia project - mailto:libburn-hackers@pykix.org
|
|
||||||
|
|
||||||
|
|
||||||
AAIP is intended as companion of the Rock Ridge Interchange Protocol RRIP
|
|
||||||
which under the general design of System Use Sharing Protocol SUSP extends
|
|
||||||
ISO 9660 aka ECMA-119 filesystem semantics to match POSIX needs.
|
|
||||||
|
|
||||||
Goal is to have for each file an arbitrary number of attributes which consist
|
|
||||||
of two components (Name and Value) of arbitrary length and to have a compact
|
|
||||||
representation of ACLs.
|
|
||||||
|
|
||||||
This document describes a SUSP field with adjustable name (Signature Word).
|
|
||||||
The name is defined in an ER field of which the content form is described here.
|
|
||||||
Recommended is to use the name "AA" which collides neither with SUSP 1.12 nor
|
|
||||||
with RRIP 1.12.
|
|
||||||
The field has been designed to be as similar to the RRIP field SL as possible.
|
|
||||||
|
|
||||||
Since the size of a SUSP field is limited to 255, multiple fields may be
|
|
||||||
needed to describe one component. The CE mechanism of SUSP shall be used to
|
|
||||||
address enough storage if needed.
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
System Entries Provided by this Specification
|
|
||||||
|
|
||||||
* AA (or another name which does not disturb other co-existing SUSP protocols)
|
|
||||||
|
|
||||||
Description of the "AA" System Use Entry
|
|
||||||
|
|
||||||
The field has exactly the same layout as RRIP field SL. One has to expect
|
|
||||||
more data bytes than with SL, though, and any of the 256 possible byte values.
|
|
||||||
The reader shall be prepared to detect and handle oversized data.
|
|
||||||
|
|
||||||
One or more AA fields form the Attribute List of a file object with
|
|
||||||
a pare number of components. Each two consequtive components form a pair of
|
|
||||||
Name and Value. The empty name is reserved for a compact representation of
|
|
||||||
ALCs. The meaning of any other name is not specified by this document.
|
|
||||||
|
|
||||||
All AA fields except the last one shall have the CONTINUE flag set. An AA
|
|
||||||
field with CONTINUE set to 0 indicates the end of the Attribute List.
|
|
||||||
|
|
||||||
The format of the "AA" System Use Field is as follows:
|
|
||||||
|
|
||||||
[1] "BP 1 to BP 2 - Signature Word" shall be (41)(41) ("AA") resp. the word
|
|
||||||
that is defined in the ER field. See below.
|
|
||||||
|
|
||||||
[2] "BP 3 - Length" shall specify as an 8-bit number the length in bytes of
|
|
||||||
the "AA" entry recorded according to ISO 9660:7.1.1.
|
|
||||||
|
|
||||||
[3] "BP 4 - System Use Entry Version" shall be 1 as in ISO 9660:7.1.1.
|
|
||||||
|
|
||||||
[4] "BP 5 - Flags" shall contain bit field flags numbered 0 to 7 starting
|
|
||||||
with the least significant bit as follows:
|
|
||||||
0 CONTINUE This AA field continues in the next AA field.
|
|
||||||
All other bits shall be set to 0.
|
|
||||||
|
|
||||||
[5] "BP 6 to Length - Component Area" shall contain Component Records
|
|
||||||
as described below.
|
|
||||||
|
|
||||||
| 'A' | 'A' | LENGTH | 1 | FLAGS | COMPONENT AREA |
|
|
||||||
|
|
||||||
|
|
||||||
Within "AA" fields each component (Name or Value) shall be recorded as one
|
|
||||||
or more component records. If a component does not fit into the remaining
|
|
||||||
space of an AA field then it shall be continued in following AA fields.
|
|
||||||
|
|
||||||
All Component Records of a component except the last one shall have the
|
|
||||||
CONTINUE flag set. A Component Record with CONTINUE set to 0 indicates the end
|
|
||||||
of the component. An eventually following Component Record starts the next
|
|
||||||
component.
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
The Component Record format is identical to the one of the SL field.
|
|
||||||
The complete form of the following summary can be found in RRIP 1.12 "4.1.3.1".
|
|
||||||
In case of discrepancies, RRIP 1.12 is the decisive specification.
|
|
||||||
|
|
||||||
Component Records shall be recorded contiguously within each Component Area,
|
|
||||||
starting in the first byte of the Component Area. The last Component Record
|
|
||||||
in the Component Area of an "AA" System Use Entry may be continued in the
|
|
||||||
Component Area of the next recorded "AA" System Use Entry in the same
|
|
||||||
System Use Area.
|
|
||||||
|
|
||||||
Each Component Record shall have the following format:
|
|
||||||
|
|
||||||
[A] "BP 1 - Component Flags" shall contain bit field flags numbered 0 to 7,
|
|
||||||
starting with the least significant bit, as follows:
|
|
||||||
0 CONTINUE This Component Record continues in the next
|
|
||||||
AA Component Record.
|
|
||||||
The following bits are defined but may not be set if the Component
|
|
||||||
Record shall carry payload. (Their use case is unclear yet.)
|
|
||||||
1 CURRENT This Component Record refers to the current
|
|
||||||
directory.
|
|
||||||
2 PARENT This Component Record refers to the parent of
|
|
||||||
the current directory.
|
|
||||||
3 ROOT This Component Record refers to root directory.
|
|
||||||
|
|
||||||
all others are RESERVED and shall be 0.
|
|
||||||
|
|
||||||
No more than one of "AA" Component Flag Bits 0-3 shall be set to ONE.
|
|
||||||
|
|
||||||
[B] "BP 2 - Component Length (LEN_CP)" shall specify as an 8-bit number the
|
|
||||||
number of component bytes in the Component Record. This length shall not
|
|
||||||
include the first two bytes of the Component Record.
|
|
||||||
If any of the bit positions 1-3 is set, the value of this field shall be
|
|
||||||
set to ZERO and no Component Content shall be recorded.
|
|
||||||
This field shall be recorded according to ISO 9660 Format section 7.1.1.
|
|
||||||
|
|
||||||
[C] "BP 3 to 2 + LEN_CP - Component Content" shall contain the component
|
|
||||||
bytes in the Component Record.
|
|
||||||
|
|
||||||
| COMPONENT FLAGS | LEN_CP | COMPONENT BYTES |
|
|
||||||
|
|
||||||
|
|
||||||
Example: Two pairs of "name"="long...content" and "one"="more" encoded as
|
|
||||||
two AA fields
|
|
||||||
|
|
||||||
Field 1 contains the Component Record of Name and one Component Record of
|
|
||||||
Value :
|
|
||||||
{ 'A', 'A', 255, 1, 1,
|
|
||||||
0, 4, 'n', 'a', 'm', 'e',
|
|
||||||
1, 255, 'l', 'o', 'n', 'g', ... 238 more bytes, 13 go to next AA ... }
|
|
||||||
Field 2 contains the rest of "long...content" and the complete second pair.
|
|
||||||
It marks the end of the Attribute List :
|
|
||||||
{ 'A', 'A', 38, 1, 0,
|
|
||||||
... 13 remaining bytes of the Component Record in first field ...
|
|
||||||
0, 7, 'c', 'o', 'n', 't', 'e', 'n', 't',
|
|
||||||
0, 3, 'o', 'n', 'e',
|
|
||||||
0, 4, 'm', 'o', 'r', 'e' }
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
Specification of binary ACL representation as special Arbitrary Attribute
|
|
||||||
|
|
||||||
The Name component of a binary ACL shall be of length 0.
|
|
||||||
|
|
||||||
The Value shall be an arbitrary number of ACL Entries:
|
|
||||||
|
|
||||||
[a] "BP 1 - Entry Flags" shall contain bit field flags numbered 0 to 7,
|
|
||||||
starting with the least significant bit, as follows:
|
|
||||||
0 EXEC indicates that this entry grants execute permission
|
|
||||||
1 WRITE write permission
|
|
||||||
2 READ read permission
|
|
||||||
3 QUALIFIER indicates that one or more Qualifier Records follow
|
|
||||||
4 - 7 TYPE
|
|
||||||
shall contain the tag type of the ACL entry as four bit code:
|
|
||||||
0 TRANSLATE entry for a global map of name to numeric id
|
|
||||||
1 ACL_USER_OBJ permissions of owning user (as of PX field)
|
|
||||||
2 ACL_USER of arbitrary user, with name as qualifier
|
|
||||||
3 ACL_GROUP_OBJ permissions of owning group (as of PX field)
|
|
||||||
4 ACL_GROUP of arbitrary group, with name as qualifier
|
|
||||||
5 ACL_MASK restricts 2, 3, and 4 via logical AND
|
|
||||||
6 ACL_OTHER permissions of non-listed, non-owning users
|
|
||||||
8 SWITCH_MARK switch from "access" ACL to "default" ACL
|
|
||||||
10 ACL_USER_N like 2, with numeric user id as qualifier
|
|
||||||
12 ACL_GROUP_N like 4, with numeric group id as qualifier
|
|
||||||
15 FUTURE_VERSION will indicate that this document
|
|
||||||
does not apply to the entry.
|
|
||||||
The other values are reserved. Readers shall ignore them if
|
|
||||||
they are not aware of updates of this document which would
|
|
||||||
assign a meaning to them.
|
|
||||||
|
|
||||||
If any of ACL_USER_OBJ, ACL_GROUP_OBJ, ACL_OTHER are missing then the settings
|
|
||||||
from the PX field shall get into effect. If they exist then they shall override
|
|
||||||
the PX field.
|
|
||||||
|
|
||||||
A numeric qualifier is a binary number of variable length. The Most Significant
|
|
||||||
Byte comes first. The number shall be the "POSIX File User ID" resp.
|
|
||||||
"POSIX File Group ID" as also used in RRIP PX fields. The ids of owning user
|
|
||||||
and owning group shall be taken from the PX field of the file object.
|
|
||||||
|
|
||||||
Optional TRANSLATE entries may associate user or group names with numeric
|
|
||||||
ids to allow the reading system to remap the numeric ids. See below.
|
|
||||||
The writer is not obliged to write them and the reader is not obliged to
|
|
||||||
interpret them.
|
|
||||||
|
|
||||||
The ACL entries belong to the "access" ACL of a file object. An optional
|
|
||||||
SWITCH_MARK entry may direct further entries to the "default" ACL which
|
|
||||||
is defined for directory objects. The switching is controlled by the EXEC bit.
|
|
||||||
0 "access" ACL
|
|
||||||
1 "default" ACL
|
|
||||||
The bits for WRITE, READ, QUALIFIER shall be 0 with SWITCH_MARK.
|
|
||||||
|
|
||||||
The eventually needed qualifier is stored in one or more Qualifier Records.
|
|
||||||
|
|
||||||
[b] "BP 2 - Qualifier Record Head" shall be present only if QUALIFIER is set
|
|
||||||
to 1. It shall give the number of Qualifier Bytes and eventually
|
|
||||||
indicate that the qualifier continues in a Qualifier Record which comes
|
|
||||||
imediately after this record.
|
|
||||||
0 to 127 Q_LENGTH, the qualifier is complete by this record
|
|
||||||
128 to 255 Q_LENGTH+128, the qualifier is continued by next record
|
|
||||||
So a Qualifier Record can contain at most 127 Qualifier Bytes.
|
|
||||||
This field shall be recorded according to ISO 9660 Format section 7.1.1.
|
|
||||||
|
|
||||||
[c] "BP 3 to BP 2 + Q_LENGTH - Qualifier Bytes" shall be present only if
|
|
||||||
QUALIFIER is set to 1 and hold the announced number of bytes of the
|
|
||||||
user or group name.
|
|
||||||
|
|
||||||
| ENTRY FLAGS [ | QUALIFIER HEAD | QUALIFIER BYTES | ]
|
|
||||||
|
|
||||||
|
|
||||||
Example: From man 5 acl: u::rw-,u:lisa:rw-,g::r--,g:toolies:rw-,m::r--,o::r--
|
|
||||||
{ 'A', 'A', 28, 1, 0,
|
|
||||||
0, 0,
|
|
||||||
0, 19, 0x16,
|
|
||||||
0x2E, 4, 'l', 'i', 's', 'a',
|
|
||||||
0x34,
|
|
||||||
0x4E, 7, 't', 'o', 'o', 'l', 'i', 'e', 's',
|
|
||||||
0x54,
|
|
||||||
0x64 }
|
|
||||||
|
|
||||||
Example: An entry with very long qualifier u:His_Excellency_..._the_Boss:r--
|
|
||||||
0x2C, 255, 'H', 'i', 's', '_', 'E', 'x', 'c', 'e', 'l', 'e',
|
|
||||||
... 117 more bytes ...,
|
|
||||||
8, 't', 'h', 'e', '_', 'B', 'o', 's', 's',
|
|
||||||
|
|
||||||
Example: User number 71 in numerical form gets rwx
|
|
||||||
0xAF, 1, 71,
|
|
||||||
Group number 65534 gets r-x
|
|
||||||
0xCD, 2, 255, 254,
|
|
||||||
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
About Names and Numeric Identifiers
|
|
||||||
|
|
||||||
It makes an important difference whether qualifiers are represented as names
|
|
||||||
or as id numbers. By storing names (and usually wasting space) it is possible
|
|
||||||
to control permissions in a way that is portable between uncoordinated
|
|
||||||
computers as long as the human readable user/group names are present on both
|
|
||||||
sides. POSIX File ID numbers make most sense in backups which shall be read
|
|
||||||
by the same system which wrote it.
|
|
||||||
Rock Ridge can only record POSIX File Ids but not user or group names.
|
|
||||||
|
|
||||||
The entry flag value 0x08 TRANSLATE is not a ACL entry of the hosting object
|
|
||||||
but rather a global hint about the relation of roles, names and numeric ids.
|
|
||||||
If it is recorded at all, then it shall be recorded with the first Directory
|
|
||||||
Entry of the volume's root directory. According to the description of SUSP
|
|
||||||
field ER, this has to be "dot" or (00). Other than with ER, a TRANSLATE entry
|
|
||||||
may not appear in the root of directory sub trees.
|
|
||||||
|
|
||||||
An interested reader shall examine the Arbitrary Attributes of this Directory
|
|
||||||
Entry in order to collect a translation table.
|
|
||||||
The advised translation is: PX or AA Id number -> name -> local id number.
|
|
||||||
|
|
||||||
The Qualifier Bytes of a TRANSLATE entry shall have the following format:
|
|
||||||
|
|
||||||
[i] "BP 0 - Role" shall tell whether it is about a user name (role 0) or
|
|
||||||
a group name (role 1). Other values are not allowed.
|
|
||||||
|
|
||||||
[ii] "BP 1 to BP 8 - Numeric Id" shall hold the 32 bit POSIX Id number of the
|
|
||||||
entry. This field shall be recorded according to ISO 9660:7.3.3.
|
|
||||||
|
|
||||||
[iii] "BP 9 to End Of Qualifier - Name" shall hold the name bytes of this
|
|
||||||
entry.
|
|
||||||
|
|
||||||
| ROLE | NUMERIC ID | NAME |
|
|
||||||
|
|
||||||
Example: User id number 1001 gets associated with user name "lisa"
|
|
||||||
|
|
||||||
0x08, 13, 0, 233,3,0,0, 0,0,3,233, 'l', 'i', 's', 'a',
|
|
||||||
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
Specification of the ER System Use Entry Values for AAIP:
|
|
||||||
|
|
||||||
The Extension Version number for this version of AAIP shall be 1.
|
|
||||||
|
|
||||||
The Extension Identifier field shall be "AAIP_0002" with Identifier Length 9.
|
|
||||||
|
|
||||||
The mandatory content form of the Extension Descriptor is
|
|
||||||
"AA PROVIDES VIA AAIP 0.2 SUPPORT FOR ARBITRARY FILE ATTRIBUTES IN ISO 9660 IMAGES"
|
|
||||||
with possibly two letters other than "AA" at the start of the string.
|
|
||||||
The Description Length is 81.
|
|
||||||
|
|
||||||
The reader of AAIP shall take the actual name of the AA field from BP 19 and
|
|
||||||
BP 20 of the ER field.
|
|
||||||
|
|
||||||
The recommended content of the Extension Source is
|
|
||||||
"PLEASE CONTACT THE LIBBURNIA PROJECT VIA LIBBURNIA-PROJECT.ORG".
|
|
||||||
The corresponding Source Length is 62.
|
|
||||||
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
Model Relations:
|
|
||||||
|
|
||||||
Attribute List ------------- [1:0..1] ------------- ACL
|
|
||||||
[1:0..n] [1:0..n]
|
|
||||||
Arbitrary Attribute ( [1:0..1] ACL ) Entry
|
|
||||||
[1:2..2n] [1:0..1]
|
|
||||||
Component ( [1..m:1..n] AA Field ) Qualifier
|
|
||||||
[1:1..n] << one of >>
|
|
||||||
Component Record / \ \
|
|
||||||
[1..m:1..n] Translation Entry , Name , Numeric Id
|
|
||||||
AA Field | | |
|
|
||||||
[1:1..n] [1:1..n] [1:1]
|
|
||||||
\ | /
|
|
||||||
Qualifier Record
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
Revoked drafts:
|
|
||||||
|
|
||||||
There was a draft AAIP 0.0 with ER signature "AAIP_2008A". It did not resemble
|
|
||||||
the existing field SL and therefore shall not be used by writers of ISO images.
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
References:
|
|
||||||
|
|
||||||
ECMA-119 http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-119.pdf
|
|
||||||
|
|
||||||
SUSP 1.12 ftp://ftp.ymi.com/pub/rockridge/susp112.ps
|
|
||||||
|
|
||||||
RRIP 1.12 ftp://ftp.ymi.com/pub/rockridge/rrip112.ps
|
|
||||||
(especially field SL)
|
|
||||||
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
|||||||
*/
|
*/
|
||||||
/* libburn wrappers for libisoburn
|
/* libburn wrappers for libisoburn
|
||||||
|
|
||||||
Copyright 2007 - 2009 Thomas Schmitt, <scdbackup@gmx.net>
|
Copyright 2007 - 2008 Thomas Schmitt, <scdbackup@gmx.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* <<< A70929 : hardcoded CD-RW with fabricated -msinfo
|
/* <<< A70929 : hardcoded CD-RW with fabricated -msinfo
|
||||||
@ -24,7 +24,6 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <regex.h>
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef Xorriso_standalonE
|
#ifndef Xorriso_standalonE
|
||||||
@ -59,7 +58,7 @@ extern void *libisoburn_default_msgs_submit_handle;
|
|||||||
extern int libisoburn_default_msgs_submit_flag;
|
extern int libisoburn_default_msgs_submit_flag;
|
||||||
|
|
||||||
|
|
||||||
static int isoburn_emulate_toc(struct burn_drive *d, int flag);
|
int isoburn_emulate_toc(struct burn_drive *d, int flag);
|
||||||
|
|
||||||
|
|
||||||
int isoburn_initialize(char msg[1024], int flag)
|
int isoburn_initialize(char msg[1024], int flag)
|
||||||
@ -264,7 +263,6 @@ int isoburn_is_intermediate_dvd_rw(struct burn_drive *d, int flag)
|
|||||||
@param flag bit0= pretent blank on overwriteable media
|
@param flag bit0= pretent blank on overwriteable media
|
||||||
bit3= if the drive reports a -ROM profile then try to read
|
bit3= if the drive reports a -ROM profile then try to read
|
||||||
table of content by scanning for ISO image headers.
|
table of content by scanning for ISO image headers.
|
||||||
bit4= do not emulate TOC on overwriteable media
|
|
||||||
*/
|
*/
|
||||||
static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
|
static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
|
||||||
int flag)
|
int flag)
|
||||||
@ -314,13 +312,11 @@ static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
|
|||||||
(*o)->emulation_mode= -1;
|
(*o)->emulation_mode= -1;
|
||||||
goto ex;
|
goto ex;
|
||||||
}
|
}
|
||||||
if(!(flag & 16)) {
|
/* try to read emulated toc */
|
||||||
/* try to read emulated toc */
|
ret= isoburn_emulate_toc(d, 0);
|
||||||
ret= isoburn_emulate_toc(d, 0);
|
if(ret<0) {
|
||||||
if(ret<0) {
|
(*o)->emulation_mode= -1;
|
||||||
(*o)->emulation_mode= -1;
|
goto ex;
|
||||||
goto ex;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -330,13 +326,9 @@ static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
|
|||||||
|
|
||||||
if(readonly) {
|
if(readonly) {
|
||||||
/* This might be overwriteable media in a -ROM drive */
|
/* This might be overwriteable media in a -ROM drive */
|
||||||
if((flag & 16)) {
|
ret= isoburn_emulate_toc(d, 1);
|
||||||
ret= 0;
|
if(ret<0)
|
||||||
} else {
|
goto ex;
|
||||||
ret= isoburn_emulate_toc(d, 1);
|
|
||||||
if(ret<0)
|
|
||||||
goto ex;
|
|
||||||
}
|
|
||||||
if(ret==0 && profile !=0x08 && (flag&8)) {
|
if(ret==0 && profile !=0x08 && (flag&8)) {
|
||||||
/* This might also be multi-session media which do not
|
/* This might also be multi-session media which do not
|
||||||
get shown with a decent TOC.
|
get shown with a decent TOC.
|
||||||
@ -381,38 +373,29 @@ ex:
|
|||||||
table of content by scanning for ISO image headers.
|
table of content by scanning for ISO image headers.
|
||||||
(depending on media type and drive state this might
|
(depending on media type and drive state this might
|
||||||
help or it might make the resulting toc even worse)
|
help or it might make the resulting toc even worse)
|
||||||
bit4= do not emulate TOC on overwriteable media
|
|
||||||
*/
|
*/
|
||||||
int isoburn_drive_aquire(struct burn_drive_info *drive_infos[],
|
int isoburn_drive_aquire(struct burn_drive_info *drive_infos[],
|
||||||
char *adr, int flag)
|
char *adr, int flag)
|
||||||
{
|
{
|
||||||
int ret, drive_grabbed= 0;
|
int ret, conv_ret, drive_grabbed= 0;
|
||||||
struct isoburn *o= NULL;
|
|
||||||
|
|
||||||
#ifndef NIX
|
|
||||||
|
|
||||||
/* <<< should be obsolete by new drive addressing of libburn-0.5.2 */
|
|
||||||
/* >>> but helps with kernel 2.4 to use /dev/sr */
|
|
||||||
|
|
||||||
int conv_ret;
|
|
||||||
char libburn_drive_adr[BURN_DRIVE_ADR_LEN];
|
char libburn_drive_adr[BURN_DRIVE_ADR_LEN];
|
||||||
|
struct isoburn *o= NULL;
|
||||||
|
char msg[BURN_MSGS_MESSAGE_LEN+4096];
|
||||||
|
|
||||||
conv_ret= burn_drive_convert_fs_adr(adr, libburn_drive_adr);
|
conv_ret= burn_drive_convert_fs_adr(adr, libburn_drive_adr);
|
||||||
if(conv_ret<=0)
|
if(conv_ret<=0) {
|
||||||
strcpy(libburn_drive_adr, adr);
|
sprintf(msg, "Unsuitable drive address: '%s'\n",adr);
|
||||||
|
msg[BURN_MSGS_MESSAGE_LEN-1]= 0;
|
||||||
|
isoburn_msgs_submit(NULL, 0x00060000, msg, 0, "FAILURE", 0);
|
||||||
|
ret= 0; goto ex;
|
||||||
|
}
|
||||||
|
|
||||||
ret= burn_drive_scan_and_grab(drive_infos, libburn_drive_adr, flag&1);
|
ret= burn_drive_scan_and_grab(drive_infos, libburn_drive_adr, flag&1);
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
ret= burn_drive_scan_and_grab(drive_infos, adr, flag & 1);
|
|
||||||
|
|
||||||
#endif /* ! NIX */
|
|
||||||
|
|
||||||
if(ret<=0)
|
if(ret<=0)
|
||||||
goto ex;
|
goto ex;
|
||||||
drive_grabbed= 1;
|
drive_grabbed= 1;
|
||||||
ret= isoburn_welcome_media(&o, (*drive_infos)[0].drive,
|
ret= isoburn_welcome_media(&o, (*drive_infos)[0].drive,
|
||||||
(flag & 24) | !!(flag&2));
|
(flag&8) | !!(flag&2));
|
||||||
if(ret<=0)
|
if(ret<=0)
|
||||||
goto ex;
|
goto ex;
|
||||||
|
|
||||||
@ -1042,33 +1025,7 @@ int isoburn_read_iso_head(struct burn_drive *d, int lba,
|
|||||||
}
|
}
|
||||||
ret= isoburn_read_iso_head_parse(d, buffer+32*1024, image_blocks, info,
|
ret= isoburn_read_iso_head_parse(d, buffer+32*1024, image_blocks, info,
|
||||||
info_mode);
|
info_mode);
|
||||||
if(ret<=0)
|
return(ret);
|
||||||
return(ret);
|
|
||||||
return(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int isoburn_make_toc_entry(struct isoburn *o, int *session_count, int lba,
|
|
||||||
int track_blocks, int flag)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
struct isoburn_toc_entry *item;
|
|
||||||
|
|
||||||
ret= isoburn_toc_entry_new(&item, o->toc, 0);
|
|
||||||
if(ret<=0) {
|
|
||||||
isoburn_msgs_submit(o, 0x00060000,
|
|
||||||
"Not enough memory for emulated TOC entry object",
|
|
||||||
0, "FATAL", 0);
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
if(o->toc==NULL)
|
|
||||||
o->toc= item;
|
|
||||||
(*session_count)++;
|
|
||||||
item->session= *session_count;
|
|
||||||
item->track_no= *session_count;
|
|
||||||
item->start_lba= lba;
|
|
||||||
item->track_blocks= track_blocks;
|
|
||||||
return(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1080,8 +1037,8 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag)
|
|||||||
{
|
{
|
||||||
int ret, image_size= 0, lba, track_blocks, session_count= 0, read_flag= 0;
|
int ret, image_size= 0, lba, track_blocks, session_count= 0, read_flag= 0;
|
||||||
int scan_start= 0, scan_count= 0, probe_minus_16= 0, growisofs_nwa;
|
int scan_start= 0, scan_count= 0, probe_minus_16= 0, growisofs_nwa;
|
||||||
int with_enclosure= 0;
|
|
||||||
struct isoburn *o;
|
struct isoburn *o;
|
||||||
|
struct isoburn_toc_entry *item;
|
||||||
char msg[160], size_text[80], *sev;
|
char msg[160], size_text[80], *sev;
|
||||||
time_t start_time, last_pacifier, now;
|
time_t start_time, last_pacifier, now;
|
||||||
|
|
||||||
@ -1101,7 +1058,6 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag)
|
|||||||
if(ret<=0)
|
if(ret<=0)
|
||||||
{ret= 0; goto failure;}
|
{ret= 0; goto failure;}
|
||||||
lba= Libisoburn_overwriteable_starT;
|
lba= Libisoburn_overwriteable_starT;
|
||||||
with_enclosure= 1;
|
|
||||||
}
|
}
|
||||||
while(lba<image_size || (flag&2)) {
|
while(lba<image_size || (flag&2)) {
|
||||||
now= time(NULL);
|
now= time(NULL);
|
||||||
@ -1110,7 +1066,7 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag)
|
|||||||
if(scan_count>=10*512)
|
if(scan_count>=10*512)
|
||||||
sprintf(size_text, "%.f MB", ((double) scan_count) / 512.0);
|
sprintf(size_text, "%.f MB", ((double) scan_count) / 512.0);
|
||||||
else
|
else
|
||||||
sprintf(size_text, "%.f kB", 2 * (double) scan_count);
|
sprintf(size_text, "%.f MB", 2 * (double) scan_count);
|
||||||
sprintf(msg, "Found %d ISO sessions by scanning %s in %.f seconds",
|
sprintf(msg, "Found %d ISO sessions by scanning %s in %.f seconds",
|
||||||
session_count, size_text, (double) (now - start_time));
|
session_count, size_text, (double) (now - start_time));
|
||||||
isoburn_msgs_submit(o, 0x00060000, msg, 0, "UPDATE", 0);
|
isoburn_msgs_submit(o, 0x00060000, msg, 0, "UPDATE", 0);
|
||||||
@ -1150,25 +1106,27 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag)
|
|||||||
"Chain of ISO session headers broken at #%d, LBA %ds",
|
"Chain of ISO session headers broken at #%d, LBA %ds",
|
||||||
session_count+1, lba);
|
session_count+1, lba);
|
||||||
isoburn_msgs_submit(o, 0x00060000, msg, 0, "WARNING", 0);
|
isoburn_msgs_submit(o, 0x00060000, msg, 0, "WARNING", 0);
|
||||||
|
|
||||||
if(with_enclosure) {
|
|
||||||
ret= isoburn_make_toc_entry(o, &session_count, 0, image_size, 0);
|
|
||||||
if(ret<=0)
|
|
||||||
goto failure;
|
|
||||||
}
|
|
||||||
break; /* do not return failure */
|
|
||||||
|
|
||||||
}
|
}
|
||||||
{ret= 0; goto failure;}
|
{ret= 0; goto failure;}
|
||||||
}
|
}
|
||||||
if(ret==2) /* ISO header was found in first half block */
|
if(ret==2) /* ISO header was found in first half block */
|
||||||
lba-= 16;
|
lba-= 16;
|
||||||
|
ret= isoburn_toc_entry_new(&item, o->toc, 0);
|
||||||
ret= isoburn_make_toc_entry(o, &session_count, lba, track_blocks, 0);
|
if(ret<=0) {
|
||||||
if(ret<=0)
|
isoburn_msgs_submit(o, 0x00060000,
|
||||||
goto failure;
|
"Not enough memory for emulated TOC entry object",
|
||||||
lba+= track_blocks;
|
0, "FATAL", 0);
|
||||||
|
ret= -1; goto failure;
|
||||||
|
}
|
||||||
|
if(o->toc==NULL)
|
||||||
|
o->toc= item;
|
||||||
|
session_count++;
|
||||||
scan_count+= 32;
|
scan_count+= 32;
|
||||||
|
item->session= session_count;
|
||||||
|
item->track_no= session_count;
|
||||||
|
item->start_lba= lba;
|
||||||
|
item->track_blocks= track_blocks;
|
||||||
|
lba+= track_blocks;
|
||||||
|
|
||||||
/* growisofs aligns to 16 rather than 32 */
|
/* growisofs aligns to 16 rather than 32 */
|
||||||
growisofs_nwa= lba;
|
growisofs_nwa= lba;
|
||||||
@ -1195,10 +1153,6 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag)
|
|||||||
return(1);
|
return(1);
|
||||||
failure:;
|
failure:;
|
||||||
isoburn_toc_entry_destroy(&(o->toc), 1);
|
isoburn_toc_entry_destroy(&(o->toc), 1);
|
||||||
if(with_enclosure && o->emulation_mode == 1) {
|
|
||||||
session_count= 0;
|
|
||||||
ret= isoburn_make_toc_entry(o, &session_count, 0, image_size, 0);
|
|
||||||
}
|
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1343,31 +1297,15 @@ failure:;
|
|||||||
int isoburn_toc_disc_get_sectors(struct isoburn_toc_disc *disc)
|
int isoburn_toc_disc_get_sectors(struct isoburn_toc_disc *disc)
|
||||||
{
|
{
|
||||||
struct isoburn_toc_entry *t;
|
struct isoburn_toc_entry *t;
|
||||||
int ret= 0, num_sessions, num_tracks;
|
int ret= 0;
|
||||||
struct burn_session **sessions;
|
|
||||||
struct burn_track **tracks;
|
|
||||||
struct burn_toc_entry entry;
|
|
||||||
|
|
||||||
if(disc==NULL)
|
if(disc==NULL)
|
||||||
return(0);
|
return(0);
|
||||||
if(disc->toc!=NULL) {
|
if(disc->toc!=NULL) {
|
||||||
for(t= disc->toc; t!=NULL; t= t->next)
|
for(t= disc->toc; t!=NULL; t= t->next)
|
||||||
ret= t->start_lba + t->track_blocks;
|
ret= t->start_lba + t->track_blocks;
|
||||||
} else if(disc->disc!=NULL) {
|
} else if(disc->disc!=NULL)
|
||||||
sessions= burn_disc_get_sessions(disc->disc, &num_sessions);
|
|
||||||
if(num_sessions > 0) {
|
|
||||||
tracks = burn_session_get_tracks(sessions[num_sessions - 1],
|
|
||||||
&num_tracks);
|
|
||||||
if(num_tracks > 0) {
|
|
||||||
burn_track_get_entry(tracks[num_tracks - 1], &entry);
|
|
||||||
if(entry.extensions_valid & 1)
|
|
||||||
ret= entry.start_lba + entry.track_blocks;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
ret= burn_disc_get_sectors(disc->disc);
|
ret= burn_disc_get_sectors(disc->disc);
|
||||||
*/
|
|
||||||
}
|
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1512,14 +1450,12 @@ int isoburn_drive_set_msgs_submit(struct burn_drive *d,
|
|||||||
|
|
||||||
|
|
||||||
/* @param flag bit0= with adr_mode 3: adr_value might be 16 blocks too high
|
/* @param flag bit0= with adr_mode 3: adr_value might be 16 blocks too high
|
||||||
bit1= insist in seeing a disc object with at least one session
|
|
||||||
bit2= with adr_mode 4: use adr_value as regular expression
|
|
||||||
*/
|
*/
|
||||||
int isoburn_set_msc1(struct burn_drive *d, int adr_mode, char *adr_value,
|
int isoburn_set_msc1(struct burn_drive *d, int adr_mode, char *adr_value,
|
||||||
int flag)
|
int flag)
|
||||||
{
|
{
|
||||||
int ret, num_sessions, num_tracks, adr_num, i, j, total_tracks;
|
int ret, num_sessions, num_tracks, adr_num, i, j, total_tracks;
|
||||||
int lba, best_lba, size, re_valid= 0;
|
int lba, best_lba, size;
|
||||||
char volid[33], msg[160];
|
char volid[33], msg[160];
|
||||||
struct isoburn *o;
|
struct isoburn *o;
|
||||||
struct isoburn_toc_disc *disc= NULL;
|
struct isoburn_toc_disc *disc= NULL;
|
||||||
@ -1527,8 +1463,6 @@ int isoburn_set_msc1(struct burn_drive *d, int adr_mode, char *adr_value,
|
|||||||
struct isoburn_toc_track **tracks= NULL;
|
struct isoburn_toc_track **tracks= NULL;
|
||||||
static char mode_names[][20]= {"auto", "session", "track", "lba", "volid"};
|
static char mode_names[][20]= {"auto", "session", "track", "lba", "volid"};
|
||||||
static int max_mode_names= 4;
|
static int max_mode_names= 4;
|
||||||
regex_t re;
|
|
||||||
regmatch_t match[1];
|
|
||||||
|
|
||||||
ret= isoburn_find_emulator(&o, d, 0);
|
ret= isoburn_find_emulator(&o, d, 0);
|
||||||
if(ret<0)
|
if(ret<0)
|
||||||
@ -1537,7 +1471,7 @@ int isoburn_set_msc1(struct burn_drive *d, int adr_mode, char *adr_value,
|
|||||||
return(-1);
|
return(-1);
|
||||||
|
|
||||||
adr_num= atoi(adr_value);
|
adr_num= atoi(adr_value);
|
||||||
if(adr_mode!=3 || (flag & 2)) {
|
if(adr_mode!=3) {
|
||||||
disc= isoburn_toc_drive_get_disc(d);
|
disc= isoburn_toc_drive_get_disc(d);
|
||||||
if(disc==NULL) {
|
if(disc==NULL) {
|
||||||
not_found:;
|
not_found:;
|
||||||
@ -1596,13 +1530,6 @@ not_found:;
|
|||||||
}
|
}
|
||||||
} else if(adr_mode==4) {
|
} else if(adr_mode==4) {
|
||||||
/* search for volume id that is equal to adr_value */
|
/* search for volume id that is equal to adr_value */
|
||||||
if(flag & 4) {
|
|
||||||
ret= regcomp(&re, adr_value, 0);
|
|
||||||
if(ret != 0)
|
|
||||||
flag&= ~4;
|
|
||||||
else
|
|
||||||
re_valid= 1;
|
|
||||||
}
|
|
||||||
best_lba= -1;
|
best_lba= -1;
|
||||||
for(i=0; i<num_sessions; i++) {
|
for(i=0; i<num_sessions; i++) {
|
||||||
tracks= isoburn_toc_session_get_tracks(sessions[i], &num_tracks);
|
tracks= isoburn_toc_session_get_tracks(sessions[i], &num_tracks);
|
||||||
@ -1613,14 +1540,8 @@ not_found:;
|
|||||||
ret= isoburn_read_iso_head(d, lba, &size, volid, 1);
|
ret= isoburn_read_iso_head(d, lba, &size, volid, 1);
|
||||||
if(ret<=0)
|
if(ret<=0)
|
||||||
continue;
|
continue;
|
||||||
if(flag & 4) {
|
if(strcmp(volid, adr_value)!=0)
|
||||||
ret= regexec(&re, volid, 1, match, 0);
|
|
||||||
if(ret != 0)
|
|
||||||
continue;
|
continue;
|
||||||
} else {
|
|
||||||
if(strcmp(volid, adr_value)!=0)
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
best_lba= lba;
|
best_lba= lba;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1638,64 +1559,7 @@ unknown_mode:;
|
|||||||
ex:;
|
ex:;
|
||||||
if(disc!=NULL)
|
if(disc!=NULL)
|
||||||
isoburn_toc_disc_free(disc);
|
isoburn_toc_disc_free(disc);
|
||||||
if((flag & 4) && re_valid)
|
|
||||||
regfree(&re);
|
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int isoburn_get_mount_params(struct burn_drive *d,
|
|
||||||
int adr_mode, char *adr_value,
|
|
||||||
int *lba, int *track, int *session,
|
|
||||||
char volid[33], int flag)
|
|
||||||
{
|
|
||||||
int msc1_mem, ret, total_tracks, num_sessions, num_tracks, i, j, track_lba;
|
|
||||||
int size, is_iso= 0;
|
|
||||||
struct isoburn *o;
|
|
||||||
struct isoburn_toc_disc *disc= NULL;
|
|
||||||
struct isoburn_toc_session **sessions= NULL;
|
|
||||||
struct isoburn_toc_track **tracks= NULL;
|
|
||||||
|
|
||||||
*lba= *track= *session= -1;
|
|
||||||
volid[0]= 0;
|
|
||||||
ret= isoburn_find_emulator(&o, d, 0);
|
|
||||||
if(ret < 0 || o == NULL)
|
|
||||||
return(-1);
|
|
||||||
msc1_mem= o->fabricated_msc1;
|
|
||||||
ret= isoburn_set_msc1(d, adr_mode, adr_value, 2 | (flag & 4));
|
|
||||||
if(ret <= 0)
|
|
||||||
return(ret);
|
|
||||||
*lba= o->fabricated_msc1;
|
|
||||||
|
|
||||||
disc= isoburn_toc_drive_get_disc(d);
|
|
||||||
if(disc==NULL)
|
|
||||||
{ret= -1; goto ex;} /* cannot happen because checked by isoburn_set_msc1 */
|
|
||||||
sessions= isoburn_toc_disc_get_sessions(disc, &num_sessions);
|
|
||||||
if(sessions==NULL || num_sessions<=0)
|
|
||||||
{ret= -1; goto ex;} /* cannot happen because checked by isoburn_set_msc1 */
|
|
||||||
total_tracks= 0;
|
|
||||||
for(i=0; i<num_sessions && *session < 0; i++) {
|
|
||||||
tracks= isoburn_toc_session_get_tracks(sessions[i], &num_tracks);
|
|
||||||
if(tracks==NULL)
|
|
||||||
continue;
|
|
||||||
for(j= 0; j<num_tracks && *track < 0; j++) {
|
|
||||||
total_tracks++;
|
|
||||||
isoburn_get_track_lba(tracks[j], &track_lba, 0);
|
|
||||||
if(track_lba == *lba) {
|
|
||||||
*track= total_tracks;
|
|
||||||
*session= i + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ret= isoburn_read_iso_head(d, *lba, &size, volid, 1);
|
|
||||||
if(ret <= 0)
|
|
||||||
volid[0]= 0;
|
|
||||||
else
|
|
||||||
is_iso= 1;
|
|
||||||
|
|
||||||
ex:;
|
|
||||||
o->fabricated_msc1= msc1_mem;
|
|
||||||
return(2 - is_iso);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
data source for libisoburn.
|
data source for libisoburn.
|
||||||
|
|
||||||
Copyright 2007 - 2009 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
Copyright 2007 - 2008 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
||||||
and Thomas Schmitt <scdbackup@gmx.net>
|
and Thomas Schmitt <scdbackup@gmx.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -147,10 +147,6 @@ int ds_read_block(IsoDataSource *src, uint32_t lba, uint8_t *buffer)
|
|||||||
return 1;
|
return 1;
|
||||||
tiles[oldest].last_error_lba = lba;
|
tiles[oldest].last_error_lba = lba;
|
||||||
|
|
||||||
#ifdef ISO_DATA_SOURCE_MISHAP
|
|
||||||
ret= ISO_DATA_SOURCE_MISHAP;
|
|
||||||
#else
|
|
||||||
/* <<< pre libisofs-0.6.7 */
|
|
||||||
/* It is not required by the specs of libisofs but implicitely assumed
|
/* It is not required by the specs of libisofs but implicitely assumed
|
||||||
...
|
...
|
||||||
But it is not possible to ignore FAILURE.
|
But it is not possible to ignore FAILURE.
|
||||||
@ -163,8 +159,6 @@ int ds_read_block(IsoDataSource *src, uint32_t lba, uint8_t *buffer)
|
|||||||
enough to make it appear plausible.
|
enough to make it appear plausible.
|
||||||
*/
|
*/
|
||||||
ret= ISO_FILE_CANT_WRITE;
|
ret= ISO_FILE_CANT_WRITE;
|
||||||
#endif
|
|
||||||
|
|
||||||
if(ret >= 0)
|
if(ret >= 0)
|
||||||
ret = -1;
|
ret = -1;
|
||||||
sprintf(msg, "ds_read_block(%lu) returns %d", (unsigned long) lba, ret);
|
sprintf(msg, "ds_read_block(%lu) returns %d", (unsigned long) lba, ret);
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/*
|
/*
|
||||||
Class core of libisoburn.
|
Class core of libisoburn.
|
||||||
|
|
||||||
Copyright 2007 - 2009 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
Copyright 2007 - 2008 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
||||||
Thomas Schmitt <scdbackup@gmx.net>
|
Thomas Schmitt <scdbackup@gmx.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -413,9 +413,6 @@ int isoburn_prepare_disc_aux(struct burn_drive *in_d, struct burn_drive *out_d,
|
|||||||
iso_write_opts_set_allow_full_ascii(wopts, opts->allow_full_ascii);
|
iso_write_opts_set_allow_full_ascii(wopts, opts->allow_full_ascii);
|
||||||
iso_write_opts_set_relaxed_vol_atts(wopts, 1);
|
iso_write_opts_set_relaxed_vol_atts(wopts, 1);
|
||||||
iso_write_opts_set_joliet_longer_paths(wopts, opts->joliet_longer_paths);
|
iso_write_opts_set_joliet_longer_paths(wopts, opts->joliet_longer_paths);
|
||||||
iso_write_opts_set_always_gmt(wopts, opts->always_gmt);
|
|
||||||
iso_write_opts_set_rrip_version_1_10(wopts, opts->rrip_version_1_10);
|
|
||||||
iso_write_opts_set_dir_rec_mtime(wopts, opts->dir_rec_mtime);
|
|
||||||
iso_write_opts_set_sort_files(wopts, opts->sort_files);
|
iso_write_opts_set_sort_files(wopts, opts->sort_files);
|
||||||
iso_write_opts_set_replace_mode(wopts, opts->replace_dir_mode,
|
iso_write_opts_set_replace_mode(wopts, opts->replace_dir_mode,
|
||||||
opts->replace_file_mode, opts->replace_uid, opts->replace_gid);
|
opts->replace_file_mode, opts->replace_uid, opts->replace_gid);
|
||||||
@ -776,9 +773,6 @@ int isoburn_igopt_new(struct isoburn_imgen_opts **new_o, int flag)
|
|||||||
o->allow_lowercase= 0;
|
o->allow_lowercase= 0;
|
||||||
o->allow_full_ascii= 0;
|
o->allow_full_ascii= 0;
|
||||||
o->joliet_longer_paths= 0;
|
o->joliet_longer_paths= 0;
|
||||||
o->always_gmt= 0;
|
|
||||||
o->rrip_version_1_10= 0;
|
|
||||||
o->dir_rec_mtime= 0;
|
|
||||||
o->sort_files= 0;
|
o->sort_files= 0;
|
||||||
o->replace_dir_mode= 0;
|
o->replace_dir_mode= 0;
|
||||||
o->replace_file_mode= 0;
|
o->replace_file_mode= 0;
|
||||||
@ -788,7 +782,7 @@ int isoburn_igopt_new(struct isoburn_imgen_opts **new_o, int flag)
|
|||||||
o->file_mode= 0444;
|
o->file_mode= 0444;
|
||||||
o->uid= 0;
|
o->uid= 0;
|
||||||
o->gid= 0;
|
o->gid= 0;
|
||||||
o->output_charset= NULL;
|
o->output_charset= 0;
|
||||||
o->fifo_size= 4*1024*1024;
|
o->fifo_size= 4*1024*1024;
|
||||||
o->effective_lba= -1;
|
o->effective_lba= -1;
|
||||||
return(1);
|
return(1);
|
||||||
@ -845,9 +839,6 @@ int isoburn_igopt_set_relaxed(struct isoburn_imgen_opts *o, int relax)
|
|||||||
o->allow_lowercase= !!(relax&32);
|
o->allow_lowercase= !!(relax&32);
|
||||||
o->allow_full_ascii= !!(relax&64);
|
o->allow_full_ascii= !!(relax&64);
|
||||||
o->joliet_longer_paths= !!(relax&128);
|
o->joliet_longer_paths= !!(relax&128);
|
||||||
o->always_gmt= !!(relax & isoburn_igopt_always_gmt);
|
|
||||||
o->rrip_version_1_10= !!(relax & isoburn_igopt_rrip_version_1_10);
|
|
||||||
o->dir_rec_mtime= !!(relax & isoburn_igopt_dir_rec_mtime);
|
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -357,24 +357,6 @@ struct isoburn_imgen_opts {
|
|||||||
*/
|
*/
|
||||||
unsigned int joliet_longer_paths :1;
|
unsigned int joliet_longer_paths :1;
|
||||||
|
|
||||||
/**
|
|
||||||
* Store timestamps as GMT rather than in local time.
|
|
||||||
*/
|
|
||||||
unsigned int always_gmt :1;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Write Rock Ridge info as of specification RRIP-1.10 rather than
|
|
||||||
* RRIP-1.12: signature "RRIP_1991A" rather than "IEEE_1282",
|
|
||||||
* field PX without file serial number
|
|
||||||
*/
|
|
||||||
unsigned int rrip_version_1_10 :1;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Store as ECMA-119 Directory Record timestamp the mtime
|
|
||||||
* of the source rather than the image creation time.
|
|
||||||
*/
|
|
||||||
unsigned int dir_rec_mtime :1;
|
|
||||||
|
|
||||||
unsigned int sort_files:1;
|
unsigned int sort_files:1;
|
||||||
/**< If files should be sorted based on their weight. */
|
/**< If files should be sorted based on their weight. */
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/*
|
/*
|
||||||
libisofs related functions of libisoburn.
|
libisofs related functions of libisoburn.
|
||||||
|
|
||||||
Copyright 2007 - 2009 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
Copyright 2007 - 2008 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
||||||
Thomas Schmitt <scdbackup@gmx.net>
|
Thomas Schmitt <scdbackup@gmx.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
/*
|
/*
|
||||||
API definition of libisoburn.
|
API definition of libisoburn.
|
||||||
|
|
||||||
Copyright 2007-2009 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
Copyright 2007-2008 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
||||||
and Thomas Schmitt <scdbackup@gmx.net>
|
and Thomas Schmitt <scdbackup@gmx.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -200,14 +200,14 @@ void isoburn_version(int *major, int *minor, int *micro);
|
|||||||
*/
|
*/
|
||||||
#define isoburn_libisofs_req_major 0
|
#define isoburn_libisofs_req_major 0
|
||||||
#define isoburn_libisofs_req_minor 6
|
#define isoburn_libisofs_req_minor 6
|
||||||
#define isoburn_libisofs_req_micro 12
|
#define isoburn_libisofs_req_micro 6
|
||||||
|
|
||||||
/** The minimum version of libburn to be used with this version of libisoburn
|
/** The minimum version of libburn to be used with this version of libisoburn
|
||||||
at compile time.
|
at compile time.
|
||||||
@since 0.1.0
|
@since 0.1.0
|
||||||
*/
|
*/
|
||||||
#define isoburn_libburn_req_major 0
|
#define isoburn_libburn_req_major 0
|
||||||
#define isoburn_libburn_req_minor 6
|
#define isoburn_libburn_req_minor 5
|
||||||
#define isoburn_libburn_req_micro 0
|
#define isoburn_libburn_req_micro 0
|
||||||
|
|
||||||
|
|
||||||
@ -243,7 +243,7 @@ int isoburn_libburn_req(int *major, int *minor, int *micro);
|
|||||||
@since 0.1.0
|
@since 0.1.0
|
||||||
*/
|
*/
|
||||||
#define isoburn_header_version_major 0
|
#define isoburn_header_version_major 0
|
||||||
#define isoburn_header_version_minor 3
|
#define isoburn_header_version_minor 2
|
||||||
#define isoburn_header_version_micro 2
|
#define isoburn_header_version_micro 2
|
||||||
/** Note:
|
/** Note:
|
||||||
Above version numbers are also recorded in configure.ac because libtool
|
Above version numbers are also recorded in configure.ac because libtool
|
||||||
@ -336,8 +336,7 @@ int isoburn_set_msgs_submit(int (*msgs_submit)(void *handle, int error_code,
|
|||||||
(cdrom/burner). Thus use with driveno 0 only. On failure
|
(cdrom/burner). Thus use with driveno 0 only. On failure
|
||||||
the array has no valid elements at all.
|
the array has no valid elements at all.
|
||||||
The returned array should be freed via burn_drive_info_free()
|
The returned array should be freed via burn_drive_info_free()
|
||||||
when the drive is no longer needed. But before this is done
|
when the drive is no longer needed.
|
||||||
one has to call isoburn_drive_release(drive_infos[0].drive).
|
|
||||||
@param adr The persistent address of the desired drive.
|
@param adr The persistent address of the desired drive.
|
||||||
@param load 1 attempt to load the disc tray. 0 no attempt,rather failure.
|
@param load 1 attempt to load the disc tray. 0 no attempt,rather failure.
|
||||||
@return 1 = success , 0 = drive not found , <0 = other error
|
@return 1 = success , 0 = drive not found , <0 = other error
|
||||||
@ -354,8 +353,7 @@ int isoburn_drive_scan_and_grab(struct burn_drive_info *drive_infos[],
|
|||||||
(cdrom/burner). Thus use with driveno 0 only. On failure
|
(cdrom/burner). Thus use with driveno 0 only. On failure
|
||||||
the array has no valid elements at all.
|
the array has no valid elements at all.
|
||||||
The returned array should be freed via burn_drive_info_free()
|
The returned array should be freed via burn_drive_info_free()
|
||||||
when the drive is no longer needed. But before this is done
|
when the drive is no longer needed.
|
||||||
one has to call isoburn_drive_release(drive_infos[0].drive).
|
|
||||||
@param adr The persistent address of the desired drive.
|
@param adr The persistent address of the desired drive.
|
||||||
@param flag bit0= attempt to load the disc tray.
|
@param flag bit0= attempt to load the disc tray.
|
||||||
Else: failure if not loaded.
|
Else: failure if not loaded.
|
||||||
@ -366,7 +364,6 @@ int isoburn_drive_scan_and_grab(struct burn_drive_info *drive_infos[],
|
|||||||
table of content by scanning for ISO image headers.
|
table of content by scanning for ISO image headers.
|
||||||
(depending on media type and drive this might
|
(depending on media type and drive this might
|
||||||
help or it might make the resulting toc even worse)
|
help or it might make the resulting toc even worse)
|
||||||
bit4= do not emulate table of content on overwriteable media
|
|
||||||
@return 1 = success , 0 = drive not found , <0 = other error
|
@return 1 = success , 0 = drive not found , <0 = other error
|
||||||
*/
|
*/
|
||||||
int isoburn_drive_aquire(struct burn_drive_info *drive_infos[],
|
int isoburn_drive_aquire(struct burn_drive_info *drive_infos[],
|
||||||
@ -377,7 +374,6 @@ int isoburn_drive_aquire(struct burn_drive_info *drive_infos[],
|
|||||||
Wrapper for: burn_drive_grab()
|
Wrapper for: burn_drive_grab()
|
||||||
@since 0.1.0
|
@since 0.1.0
|
||||||
@param drive The drive to grab. E.g. drive_infos[1].drive .
|
@param drive The drive to grab. E.g. drive_infos[1].drive .
|
||||||
Call isoburn_drive_release(drive) when it it no longer needed.
|
|
||||||
@param load 1 attempt to load the disc tray. 0 no attempt, rather failure.
|
@param load 1 attempt to load the disc tray. 0 no attempt, rather failure.
|
||||||
@return 1 success, <=0 failure
|
@return 1 success, <=0 failure
|
||||||
*/
|
*/
|
||||||
@ -453,14 +449,12 @@ void isoburn_disc_erase(struct burn_drive *drive, int fast);
|
|||||||
3= adr_value itself is the lba to be used
|
3= adr_value itself is the lba to be used
|
||||||
4= start lba of last session with volume id
|
4= start lba of last session with volume id
|
||||||
given by adr_value
|
given by adr_value
|
||||||
@param adr_value A string describing the value to be eventually used.
|
@parm adr_value A string describing the value to be eventually used.
|
||||||
@param flag Bitfield for control purposes.
|
@param flag Bitfield for control purposes.
|
||||||
bit0= @since 0.2.2
|
bit0= @since 0.2.2
|
||||||
with adr_mode 3: adr_value might be 16 blocks too high
|
with adr_mode 3: adr_value might be 16 blocks too high
|
||||||
(e.g. -C stemming from growisofs). Probe for ISO head
|
(e.g. -C stemming from growisofs). Probe for ISO head
|
||||||
at adr_value-16 and eventually adjust setting.
|
at adr_value-16 and eventually adjust setting.
|
||||||
bit1= insist in seeing a disc object with at least one session
|
|
||||||
bit2= with adr_mode 4: use adr_value as regular expression
|
|
||||||
*/
|
*/
|
||||||
int isoburn_set_msc1(struct burn_drive *d, int adr_mode, char *adr_value,
|
int isoburn_set_msc1(struct burn_drive *d, int adr_mode, char *adr_value,
|
||||||
int flag);
|
int flag);
|
||||||
@ -508,8 +502,7 @@ struct isoburn_toc_disc *isoburn_toc_drive_get_disc(struct burn_drive *d);
|
|||||||
|
|
||||||
|
|
||||||
/** Tell the number of 2048 byte blocks covered by the table of content.
|
/** Tell the number of 2048 byte blocks covered by the table of content.
|
||||||
This number includes the eventual gaps between sessions and tracks.
|
Wrapper for: burn_disc_get_sectors()
|
||||||
So this call is not really a wrapper for burn_disc_get_sectors().
|
|
||||||
@since 0.1.6
|
@since 0.1.6
|
||||||
@param disc The master handle of the media
|
@param disc The master handle of the media
|
||||||
@return number of blocks, <=0 indicates unknown or unreadable state
|
@return number of blocks, <=0 indicates unknown or unreadable state
|
||||||
@ -560,7 +553,7 @@ struct isoburn_toc_track **isoburn_toc_session_get_tracks(
|
|||||||
struct isoburn_toc_session *s, int *num);
|
struct isoburn_toc_session *s, int *num);
|
||||||
|
|
||||||
|
|
||||||
/** Obtain a copy of the entry which describes a particular track.
|
/** Obtain a copy of the entry which describes a particular itrack.
|
||||||
Wrapper for: burn_track_get_entry()
|
Wrapper for: burn_track_get_entry()
|
||||||
@since 0.1.6
|
@since 0.1.6
|
||||||
@param s The track handle
|
@param s The track handle
|
||||||
@ -605,35 +598,6 @@ int isoburn_read_iso_head(struct burn_drive *d, int lba,
|
|||||||
int *image_blocks, char *info, int flag);
|
int *image_blocks, char *info, int flag);
|
||||||
|
|
||||||
|
|
||||||
/** Try to convert the given entity address into various entity addresses
|
|
||||||
which would describe it.
|
|
||||||
Note: Sessions and tracks are counted beginning with 1, not with 0.
|
|
||||||
@since 0.3.2
|
|
||||||
@param drive The drive where msc1 is to be set
|
|
||||||
@param adr_mode Determines how to interpret the input adr_value.
|
|
||||||
If adr_value shall represent a number then decimal ASCII
|
|
||||||
digits are expected.
|
|
||||||
0= start lba of last session in TOC, ignore adr_value
|
|
||||||
1= start lba of session number given by adr_value
|
|
||||||
2= start lba of track given number by adr_value
|
|
||||||
3= adr_value itself is the lba to be used
|
|
||||||
4= start lba of last session with volume id
|
|
||||||
given by adr_value
|
|
||||||
@param adr_value A string describing the value to be eventually used.
|
|
||||||
@param lba returns the block address of the entity, -1 means invalid
|
|
||||||
@param track returns the track number of the entity, -1 means invalid
|
|
||||||
@param session returns the session number of the entity, -1 means invalid
|
|
||||||
@param volid returns the volume id of the entity if it is a ISO session
|
|
||||||
@param flag Bitfield for control purposes.
|
|
||||||
bit2= with adr_mode 4: use adr_value as regular expression
|
|
||||||
@return <=0 error , 1 ok, ISO session, 2 ok, not an ISO session
|
|
||||||
*/
|
|
||||||
int isoburn_get_mount_params(struct burn_drive *d,
|
|
||||||
int adr_mode, char *adr_value,
|
|
||||||
int *lba, int *track, int *session,
|
|
||||||
char volid[33], int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
/*
|
/*
|
||||||
|
|
||||||
@ -876,21 +840,6 @@ int isoburn_igopt_get_extensions(struct isoburn_imgen_opts *o, int *ext);
|
|||||||
bit7= joliet_longer_paths
|
bit7= joliet_longer_paths
|
||||||
Allow paths in the Joliet tree to have more than
|
Allow paths in the Joliet tree to have more than
|
||||||
240 characters.
|
240 characters.
|
||||||
bit8= always_gmt
|
|
||||||
Write timestamps as GMT although the specs prescribe local
|
|
||||||
time with eventual non-zero timezone offset. Negative
|
|
||||||
timezones (west of GMT) can trigger bugs in some operating
|
|
||||||
systems which typically appear in mounted ISO images as if
|
|
||||||
the timezone shift from GMT was applied twice
|
|
||||||
(e.g. in New York 22:36 becomes 17:36).
|
|
||||||
bit9= rrip_version_1_10
|
|
||||||
Write Rock Ridge info as of specification RRIP-1.10 rather
|
|
||||||
than RRIP-1.12: signature "RRIP_1991A" rather than
|
|
||||||
"IEEE_1282", field PX without file serial number.
|
|
||||||
bit10= dir_rec_mtime
|
|
||||||
Store as ECMA-119 Directory Record timestamp the mtime
|
|
||||||
of the source rather than the image creation time.
|
|
||||||
|
|
||||||
@return 1 success, <=0 failure
|
@return 1 success, <=0 failure
|
||||||
*/
|
*/
|
||||||
#define isoburn_igopt_omit_version_numbers 1
|
#define isoburn_igopt_omit_version_numbers 1
|
||||||
@ -901,9 +850,6 @@ int isoburn_igopt_get_extensions(struct isoburn_imgen_opts *o, int *ext);
|
|||||||
#define isoburn_igopt_allow_lowercase 32
|
#define isoburn_igopt_allow_lowercase 32
|
||||||
#define isoburn_igopt_allow_full_ascii 64
|
#define isoburn_igopt_allow_full_ascii 64
|
||||||
#define isoburn_igopt_joliet_longer_paths 128
|
#define isoburn_igopt_joliet_longer_paths 128
|
||||||
#define isoburn_igopt_always_gmt 256
|
|
||||||
#define isoburn_igopt_rrip_version_1_10 512
|
|
||||||
#define isoburn_igopt_dir_rec_mtime 1024
|
|
||||||
int isoburn_igopt_set_relaxed(struct isoburn_imgen_opts *o, int relax);
|
int isoburn_igopt_set_relaxed(struct isoburn_imgen_opts *o, int relax);
|
||||||
int isoburn_igopt_get_relaxed(struct isoburn_imgen_opts *o, int *relax);
|
int isoburn_igopt_get_relaxed(struct isoburn_imgen_opts *o, int *relax);
|
||||||
|
|
||||||
@ -1105,10 +1051,9 @@ off_t isoburn_disc_available_space(struct burn_drive *d,
|
|||||||
|
|
||||||
|
|
||||||
/** Obtain the start block number of the most recent session on media. In
|
/** Obtain the start block number of the most recent session on media. In
|
||||||
case of random access media this will normally be 0. Successfull return is
|
case of random access media this will always be 0. Succesfull return is
|
||||||
not a guarantee that there is a ISO-9660 image at all. The call will fail,
|
not a guarantee that there is a ISO-9660 image at all. The call will fail,
|
||||||
nevertheless,if isoburn_disc_get_status() returns not BURN_DISC_APPENDABLE
|
nevertheless,if isoburn_disc_get_status() returns not BURN_DISC_APPENDABLE.
|
||||||
or BURN_DISC_FULL.
|
|
||||||
Note: The result of this call may be fabricated by a previous call of
|
Note: The result of this call may be fabricated by a previous call of
|
||||||
isoburn_set_msc1() which can override the rule to load the most recent
|
isoburn_set_msc1() which can override the rule to load the most recent
|
||||||
session.
|
session.
|
||||||
@ -1236,9 +1181,10 @@ int isoburn_prepare_blind_grow(struct burn_drive *d, struct burn_disc **disc,
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Revoke isoburn_prepare_*() instead of running isoburn_disc_write().
|
Revoke isoburn_prepare_new_image() or isoburn_prepare_disc() instead of
|
||||||
|
running isoburn_disc_write().
|
||||||
libisofs reserves resources and maybe already starts generating the
|
libisofs reserves resources and maybe already starts generating the
|
||||||
image stream when one of above three calls is performed. It is mandatory to
|
image stream when one of above two calls is performed. It is mandatory to
|
||||||
either run isoburn_disc_write() or to revoke the preparations by the
|
either run isoburn_disc_write() or to revoke the preparations by the
|
||||||
call described here.
|
call described here.
|
||||||
@since 0.1.0
|
@since 0.1.0
|
||||||
@ -1277,7 +1223,7 @@ void isoburn_disc_write(struct burn_write_opts *o, struct burn_disc *disc);
|
|||||||
Hint: If only burn_write_opts and not burn_drive is known, then the drive
|
Hint: If only burn_write_opts and not burn_drive is known, then the drive
|
||||||
can be obtained by burn_write_opts_get_drive().
|
can be obtained by burn_write_opts_get_drive().
|
||||||
@since 0.1.0
|
@since 0.1.0
|
||||||
@param d The drive to which the track with the fifo gets burned.
|
@parm d The drive to which the track with the fifo gets burned.
|
||||||
@param size The total size of the fifo
|
@param size The total size of the fifo
|
||||||
@param free_bytes The current free capacity of the fifo
|
@param free_bytes The current free capacity of the fifo
|
||||||
@param status_text Returns a pointer to a constant text, see below
|
@param status_text Returns a pointer to a constant text, see below
|
||||||
|
@ -1,283 +0,0 @@
|
|||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
aaip-os-freebsd.c
|
|
||||||
Arbitrary Attribute Interchange Protocol , system adapter for getting and
|
|
||||||
setting of ACLs and XFS-style Extended Attributes.
|
|
||||||
|
|
||||||
To be included by aaip_0_2.c
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include <sys/acl.h>
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------ Getters --------------------------------- */
|
|
||||||
|
|
||||||
/* Obtain the ACL of the given file in long text form.
|
|
||||||
@param path Path to the file
|
|
||||||
@param text Will hold the result. This is a managed object which
|
|
||||||
finally has to be freed by a call to this function
|
|
||||||
with bit15 of flag.
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
bit0= obtain default ACL rather than access ACL
|
|
||||||
bit15= free text and return 1
|
|
||||||
@return > 0 ok
|
|
||||||
-1 failure of system ACL service (see errno)
|
|
||||||
*/
|
|
||||||
int aaip_get_acl_text(char *path, char **text, int flag)
|
|
||||||
{
|
|
||||||
acl_t acl= NULL;
|
|
||||||
|
|
||||||
if(flag & (1 << 15)) {
|
|
||||||
if(*text != NULL)
|
|
||||||
acl_free(text);
|
|
||||||
*text= NULL;
|
|
||||||
return(1);
|
|
||||||
}
|
|
||||||
*text= NULL;
|
|
||||||
|
|
||||||
/* Note: no ACL_TYPE_DEFAULT in FreeBSD */
|
|
||||||
if(flag & 1)
|
|
||||||
return(0);
|
|
||||||
|
|
||||||
acl= acl_get_file(path, ACL_TYPE_ACCESS);
|
|
||||||
|
|
||||||
if(acl == NULL)
|
|
||||||
return(-1);
|
|
||||||
*text= acl_to_text(acl, NULL);
|
|
||||||
acl_free(acl);
|
|
||||||
if(*text == NULL)
|
|
||||||
return(-1);
|
|
||||||
return(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Obtain the Extended Attributes and/or the ACLs of the given file in a form
|
|
||||||
that is ready for aaip_encode().
|
|
||||||
|
|
||||||
Note: There are no Extended Attributes in FreeBSD. So only ACL will be
|
|
||||||
obtained.
|
|
||||||
|
|
||||||
@param path Path to the file
|
|
||||||
@param num_attrs Will return the number of name-value pairs
|
|
||||||
@param names Will return an array of pointers to 0-terminated names
|
|
||||||
@param value_lengths Will return an arry with the lenghts of values
|
|
||||||
@param values Will return an array of pointers to 8-bit values
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
bit0= obtain ACL (access and eventually default)
|
|
||||||
bit1= use numeric ACL qualifiers rather than names
|
|
||||||
bit2= do not encode attributes other than ACL
|
|
||||||
bit15= free memory of names, value_lengths, values
|
|
||||||
@return >0 ok
|
|
||||||
<=0 error
|
|
||||||
*/
|
|
||||||
int aaip_get_attr_list(char *path, size_t *num_attrs, char ***names,
|
|
||||||
size_t **value_lengths, char ***values, int flag)
|
|
||||||
{
|
|
||||||
int ret, retry= 0;
|
|
||||||
char *list= NULL;
|
|
||||||
ssize_t list_size= 0, i, num_names, value_ret;
|
|
||||||
size_t a_acl_len= 0, d_acl_len= 0, acl_len= 0;
|
|
||||||
unsigned char *a_acl= NULL, *d_acl= NULL, *acl= NULL;
|
|
||||||
char *acl_text= NULL;
|
|
||||||
|
|
||||||
if(flag & (1 << 15)) { /* Free memory */
|
|
||||||
if(*names != NULL)
|
|
||||||
list= (*names)[0];
|
|
||||||
{ret= 1; goto ex;}
|
|
||||||
}
|
|
||||||
|
|
||||||
*num_attrs= 0;
|
|
||||||
*names= NULL;
|
|
||||||
*value_lengths= NULL;
|
|
||||||
*values= NULL;
|
|
||||||
|
|
||||||
if(flag & 1)
|
|
||||||
num_names++;
|
|
||||||
if(num_names == 0)
|
|
||||||
{ret= 1; goto ex;}
|
|
||||||
(*names)= calloc(num_names, sizeof(char *));
|
|
||||||
(*value_lengths)= calloc(num_names, sizeof(size_t));
|
|
||||||
(*values)= calloc(num_names, sizeof(char *));
|
|
||||||
if(*names == NULL || *value_lengths == NULL || *values == NULL)
|
|
||||||
{ret= -1; goto ex;}
|
|
||||||
|
|
||||||
for(i= *num_attrs; i < num_names; i++)
|
|
||||||
(*names)[i]= NULL;
|
|
||||||
for(i= 0; i < num_names; i++) {
|
|
||||||
(*values)[i]= NULL;
|
|
||||||
(*value_lengths)[i]= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(flag & 1) { /* Obtain ACL */
|
|
||||||
/* access-ACL */
|
|
||||||
ret= aaip_get_acl_text(path, &acl_text, 0);
|
|
||||||
if(ret <= 0)
|
|
||||||
goto ex;
|
|
||||||
ret= aaip_encode_acl(acl_text, &a_acl_len, &a_acl, flag & 2);
|
|
||||||
if(ret <= 0)
|
|
||||||
goto ex;
|
|
||||||
aaip_get_acl_text("", &acl_text, 1 << 15); /* free */
|
|
||||||
|
|
||||||
/* Note: There are no default-ACL in FreeBSD */
|
|
||||||
|
|
||||||
/* Set as attribute with empty name */;
|
|
||||||
(*names)[*num_attrs]= strdup("");
|
|
||||||
if((*names)[*num_attrs] == NULL)
|
|
||||||
{ret= -1; goto ex;}
|
|
||||||
(*values)[*num_attrs]= (char *) acl;
|
|
||||||
(*value_lengths)[*num_attrs]= acl_len;
|
|
||||||
(*num_attrs)++;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret= 1;
|
|
||||||
ex:;
|
|
||||||
if(a_acl != NULL)
|
|
||||||
free(a_acl);
|
|
||||||
if(d_acl != NULL)
|
|
||||||
free(d_acl);
|
|
||||||
if(acl_text != NULL)
|
|
||||||
aaip_get_acl_text("", &acl_text, 1 << 15); /* free */
|
|
||||||
|
|
||||||
if(ret <= 0 || (flag & (1 << 15))) {
|
|
||||||
if(list != NULL)
|
|
||||||
free(list);
|
|
||||||
if(*names != NULL)
|
|
||||||
free(*names);
|
|
||||||
*names= NULL;
|
|
||||||
if(*value_lengths != NULL)
|
|
||||||
free(*value_lengths);
|
|
||||||
*value_lengths= NULL;
|
|
||||||
if(*values != NULL) {
|
|
||||||
for(i= 0; i < *num_attrs; i++)
|
|
||||||
free((*values)[i]);
|
|
||||||
free(*values);
|
|
||||||
}
|
|
||||||
if(acl != NULL)
|
|
||||||
free(acl);
|
|
||||||
*values= NULL;
|
|
||||||
*num_attrs= 0;
|
|
||||||
}
|
|
||||||
return(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------ Setters --------------------------------- */
|
|
||||||
|
|
||||||
|
|
||||||
/* Set the ACL of the given file to a given list in long text form.
|
|
||||||
@param path Path to the file
|
|
||||||
@param text The input text (0 terminated, ACL long text form)
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
bit0= set default ACL rather than access ACL
|
|
||||||
@return > 0 ok
|
|
||||||
-1 failure of system ACL service (see errno)
|
|
||||||
*/
|
|
||||||
int aaip_set_acl_text(char *path, char *text, int flag)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
acl_t acl= NULL;
|
|
||||||
|
|
||||||
acl= acl_from_text(text);
|
|
||||||
if(acl == NULL) {
|
|
||||||
ret= -1; goto ex;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Note: no ACL_TYPE_DEFAULT in FreeBSD */
|
|
||||||
if(flag & 1)
|
|
||||||
{ret= 0; goto ex;}
|
|
||||||
|
|
||||||
ret= acl_set_file(path, ACL_TYPE_ACCESS, acl);
|
|
||||||
|
|
||||||
if(ret == -1)
|
|
||||||
goto ex;
|
|
||||||
ret= 1;
|
|
||||||
ex:
|
|
||||||
if(acl != NULL)
|
|
||||||
acl_free(acl);
|
|
||||||
return(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Bring the given attributes and/or ACLs into effect with the given file.
|
|
||||||
|
|
||||||
Note: There are no Extended Attributes in FreeBSD. So only ACL get set.
|
|
||||||
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
bit0= decode and set ACLs
|
|
||||||
( bit1= first clear all existing attributes of the file )
|
|
||||||
( bit2= do not set attributes other than ACLs )
|
|
||||||
@return 1 success
|
|
||||||
-1 error memory allocation
|
|
||||||
-2 error with decoding of ACL
|
|
||||||
-3 error with setting ACL
|
|
||||||
( -4 error with setting attribute )
|
|
||||||
( -5 error with deleting attribute )
|
|
||||||
|
|
||||||
*/
|
|
||||||
int aaip_set_attr_list(char *path, size_t num_attrs, char **names,
|
|
||||||
size_t *value_lengths, char **values, int flag)
|
|
||||||
{
|
|
||||||
int ret, has_default_acl= 0;
|
|
||||||
size_t i, consumed, acl_text_fill, list_size= 0;
|
|
||||||
char *acl_text= NULL, *list= NULL;
|
|
||||||
|
|
||||||
for(i= 0; i < num_attrs; i++) {
|
|
||||||
if(names[i] == NULL || values[i] == NULL)
|
|
||||||
continue;
|
|
||||||
if(names[i][0] == 0) { /* Decode ACLs */
|
|
||||||
/* access ACL */
|
|
||||||
ret= aaip_decode_acl((unsigned char *) values[i], value_lengths[i],
|
|
||||||
&consumed, NULL, 0, &acl_text_fill, 1);
|
|
||||||
if(ret <= 0)
|
|
||||||
{ret= -2; goto ex;}
|
|
||||||
acl_text= calloc(acl_text_fill, 1);
|
|
||||||
if(acl_text == NULL)
|
|
||||||
{ret= -1; goto ex;}
|
|
||||||
ret= aaip_decode_acl((unsigned char *) values[i], value_lengths[i],
|
|
||||||
&consumed, acl_text, acl_text_fill, &acl_text_fill, 0);
|
|
||||||
if(ret <= 0)
|
|
||||||
{ret= -2; goto ex;}
|
|
||||||
has_default_acl= (ret == 2);
|
|
||||||
ret= aaip_set_acl_text(path, acl_text, 0);
|
|
||||||
if(ret <= 0)
|
|
||||||
{ret= -3; goto ex;}
|
|
||||||
if(has_default_acl) {
|
|
||||||
free(acl_text);
|
|
||||||
acl_text= NULL;
|
|
||||||
ret= aaip_decode_acl((unsigned char *) (values[i] + consumed),
|
|
||||||
value_lengths[i] - consumed, &consumed,
|
|
||||||
NULL, 0, &acl_text_fill, 1);
|
|
||||||
if(ret <= 0)
|
|
||||||
{ret= -2; goto ex;}
|
|
||||||
acl_text= calloc(acl_text_fill, 1);
|
|
||||||
if(acl_text == NULL)
|
|
||||||
{ret= -1; goto ex;}
|
|
||||||
ret= aaip_decode_acl((unsigned char *) (values[i] + consumed),
|
|
||||||
value_lengths[i] - consumed, &consumed,
|
|
||||||
acl_text, acl_text_fill, &acl_text_fill, 0);
|
|
||||||
if(ret <= 0)
|
|
||||||
{ret= -2; goto ex;}
|
|
||||||
ret= aaip_set_acl_text(path, acl_text, 1);
|
|
||||||
if(ret <= 0)
|
|
||||||
{ret= -3; goto ex;}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ret= 1;
|
|
||||||
ex:;
|
|
||||||
if(acl_text != NULL)
|
|
||||||
free(acl_text);
|
|
||||||
if(list != NULL)
|
|
||||||
free(list);
|
|
||||||
return(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,371 +0,0 @@
|
|||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
aaip-os-linux.c
|
|
||||||
Arbitrary Attribute Interchange Protocol , system adapter for getting and
|
|
||||||
setting of ACLs and XFS-style Extended Attributes.
|
|
||||||
|
|
||||||
To be included by aaip_0_2.c
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include <sys/acl.h>
|
|
||||||
#include <attr/xattr.h>
|
|
||||||
|
|
||||||
#define Aaip_acl_attrnamE "system.posix_acl_access"
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------ Getters --------------------------------- */
|
|
||||||
|
|
||||||
/* Obtain the ACL of the given file in long text form.
|
|
||||||
@param path Path to the file
|
|
||||||
@param text Will hold the result. This is a managed object which
|
|
||||||
finally has to be freed by a call to this function
|
|
||||||
with bit15 of flag.
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
bit0= obtain default ACL rather than access ACL
|
|
||||||
bit15= free text and return 1
|
|
||||||
@return > 0 ok
|
|
||||||
-1 failure of system ACL service (see errno)
|
|
||||||
*/
|
|
||||||
int aaip_get_acl_text(char *path, char **text, int flag)
|
|
||||||
{
|
|
||||||
acl_t acl= NULL;
|
|
||||||
|
|
||||||
if(flag & (1 << 15)) {
|
|
||||||
if(*text != NULL)
|
|
||||||
acl_free(text);
|
|
||||||
*text= NULL;
|
|
||||||
return(1);
|
|
||||||
}
|
|
||||||
*text= NULL;
|
|
||||||
acl= acl_get_file(path, (flag & 1) ? ACL_TYPE_DEFAULT : ACL_TYPE_ACCESS);
|
|
||||||
if(acl == NULL)
|
|
||||||
return(-1);
|
|
||||||
*text= acl_to_text(acl, NULL);
|
|
||||||
acl_free(acl);
|
|
||||||
if(*text == NULL)
|
|
||||||
return(-1);
|
|
||||||
return(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Obtain the Extended Attributes and/or the ACLs of the given file in a form
|
|
||||||
that is ready for aaip_encode().
|
|
||||||
@param path Path to the file
|
|
||||||
@param num_attrs Will return the number of name-value pairs
|
|
||||||
@param names Will return an array of pointers to 0-terminated names
|
|
||||||
@param value_lengths Will return an arry with the lenghts of values
|
|
||||||
@param values Will return an array of pointers to 8-bit values
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
bit0= obtain ACL (access and eventually default)
|
|
||||||
bit1= use numeric ACL qualifiers rather than names
|
|
||||||
bit2= do not obtain attributes other than ACL
|
|
||||||
bit3= do not ignore eventual local ACL attribute
|
|
||||||
(e.g. system.posix_acl_access)
|
|
||||||
bit15= free memory of names, value_lengths, values
|
|
||||||
@return >0 ok
|
|
||||||
<=0 error
|
|
||||||
*/
|
|
||||||
int aaip_get_attr_list(char *path, size_t *num_attrs, char ***names,
|
|
||||||
size_t **value_lengths, char ***values, int flag)
|
|
||||||
{
|
|
||||||
int ret, retry= 0;
|
|
||||||
char *list= NULL;
|
|
||||||
ssize_t list_size= 0, i, num_names= 0, value_ret;
|
|
||||||
size_t a_acl_len= 0, d_acl_len= 0, acl_len= 0;
|
|
||||||
unsigned char *a_acl= NULL, *d_acl= NULL, *acl= NULL;
|
|
||||||
char *acl_text= NULL;
|
|
||||||
|
|
||||||
if(flag & (1 << 15)) { /* Free memory */
|
|
||||||
if(*names != NULL)
|
|
||||||
list= (*names)[0];
|
|
||||||
{ret= 1; goto ex;}
|
|
||||||
}
|
|
||||||
|
|
||||||
*num_attrs= 0;
|
|
||||||
*names= NULL;
|
|
||||||
*value_lengths= NULL;
|
|
||||||
*values= NULL;
|
|
||||||
|
|
||||||
/* Set up arrays */
|
|
||||||
if(!(flag & 4)) { /* Get xattr names */
|
|
||||||
list_size= listxattr(path, list, 0);
|
|
||||||
if(list_size == -1)
|
|
||||||
{ret= -1; goto ex;}
|
|
||||||
list= calloc(list_size, 1);
|
|
||||||
if(list == NULL)
|
|
||||||
{ret= -1; goto ex;}
|
|
||||||
list_size= listxattr(path, list, list_size);
|
|
||||||
if(list_size == -1)
|
|
||||||
{ret= -1; goto ex;}
|
|
||||||
for(i= 0; i < list_size; i+= strlen(list + i) + 1)
|
|
||||||
num_names++;
|
|
||||||
}
|
|
||||||
if(flag & 1)
|
|
||||||
num_names++;
|
|
||||||
if(num_names == 0)
|
|
||||||
{ret= 1; goto ex;}
|
|
||||||
(*names)= calloc(num_names, sizeof(char *));
|
|
||||||
(*value_lengths)= calloc(num_names, sizeof(size_t));
|
|
||||||
(*values)= calloc(num_names, sizeof(char *));
|
|
||||||
if(*names == NULL || *value_lengths == NULL || *values == NULL)
|
|
||||||
{ret= -1; goto ex;}
|
|
||||||
|
|
||||||
if(!(flag & 4))
|
|
||||||
for(i= 0; i < list_size && num_names > *num_attrs;
|
|
||||||
i+= strlen(list + i) + 1) {
|
|
||||||
if(!(flag & 8))
|
|
||||||
if(strcmp(list + i, Aaip_acl_attrnamE) == 0)
|
|
||||||
continue;
|
|
||||||
(*names)[(*num_attrs)++]= list + i;
|
|
||||||
}
|
|
||||||
for(i= *num_attrs; i < num_names; i++)
|
|
||||||
(*names)[i]= NULL;
|
|
||||||
for(i= 0; i < num_names; i++) {
|
|
||||||
(*values)[i]= NULL;
|
|
||||||
(*value_lengths)[i]= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!(flag & 4)) { /* Get xattr values */
|
|
||||||
for(i= 0; i < *num_attrs; i++) {
|
|
||||||
if(!(flag & 8))
|
|
||||||
if(strcmp((*names)[i], Aaip_acl_attrnamE) == 0)
|
|
||||||
continue;
|
|
||||||
value_ret= getxattr(path, (*names)[i], NULL, 0);
|
|
||||||
if(value_ret == -1)
|
|
||||||
continue;
|
|
||||||
(*values)[i]= calloc(value_ret + 1, 1);
|
|
||||||
if((*values)[i] == NULL)
|
|
||||||
{ret= -1; goto ex;}
|
|
||||||
(*value_lengths)[i]= getxattr(path, (*names)[i], (*values)[i], value_ret);
|
|
||||||
if(value_ret == -1) { /* there could be a race condition */
|
|
||||||
if(retry++ > 5)
|
|
||||||
{ret= -1; goto ex;}
|
|
||||||
i--;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
(*value_lengths)[i]= value_ret;
|
|
||||||
retry= 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(flag & 1) { /* Obtain ACL */
|
|
||||||
/* access-ACL */
|
|
||||||
ret= aaip_get_acl_text(path, &acl_text, 0);
|
|
||||||
if(ret <= 0)
|
|
||||||
goto ex;
|
|
||||||
ret= aaip_encode_acl(acl_text, &a_acl_len, &a_acl, flag & 2);
|
|
||||||
if(ret <= 0)
|
|
||||||
goto ex;
|
|
||||||
aaip_get_acl_text("", &acl_text, 1 << 15); /* free */
|
|
||||||
|
|
||||||
/* eventually default-ACL */
|
|
||||||
ret= aaip_get_acl_text(path, &acl_text, 1);
|
|
||||||
if(ret > 0) {
|
|
||||||
/* encode and append to a_acl */;
|
|
||||||
ret= aaip_encode_acl(acl_text, &d_acl_len, &d_acl, (flag & 2) | 4);
|
|
||||||
if(ret <= 0)
|
|
||||||
goto ex;
|
|
||||||
acl= calloc(a_acl_len + d_acl_len + 1, 1);
|
|
||||||
if(acl == NULL)
|
|
||||||
{ret= -1; goto ex;}
|
|
||||||
if(a_acl_len)
|
|
||||||
memcpy(acl, a_acl, a_acl_len);
|
|
||||||
if(d_acl_len)
|
|
||||||
memcpy(acl + a_acl_len, d_acl, d_acl_len);
|
|
||||||
acl_len= a_acl_len + d_acl_len;
|
|
||||||
} else {
|
|
||||||
acl= a_acl;
|
|
||||||
a_acl= NULL;
|
|
||||||
acl_len= a_acl_len;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set as attribute with empty name */;
|
|
||||||
(*names)[*num_attrs]= strdup("");
|
|
||||||
if((*names)[*num_attrs] == NULL)
|
|
||||||
{ret= -1; goto ex;}
|
|
||||||
(*values)[*num_attrs]= (char *) acl;
|
|
||||||
(*value_lengths)[*num_attrs]= acl_len;
|
|
||||||
(*num_attrs)++;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret= 1;
|
|
||||||
ex:;
|
|
||||||
if(a_acl != NULL)
|
|
||||||
free(a_acl);
|
|
||||||
if(d_acl != NULL)
|
|
||||||
free(d_acl);
|
|
||||||
if(acl_text != NULL)
|
|
||||||
aaip_get_acl_text("", &acl_text, 1 << 15); /* free */
|
|
||||||
|
|
||||||
if(ret <= 0 || (flag & (1 << 15))) {
|
|
||||||
if(list != NULL)
|
|
||||||
free(list);
|
|
||||||
if(*names != NULL)
|
|
||||||
free(*names);
|
|
||||||
*names= NULL;
|
|
||||||
if(*value_lengths != NULL)
|
|
||||||
free(*value_lengths);
|
|
||||||
*value_lengths= NULL;
|
|
||||||
if(*values != NULL) {
|
|
||||||
for(i= 0; i < *num_attrs; i++)
|
|
||||||
free((*values)[i]);
|
|
||||||
free(*values);
|
|
||||||
}
|
|
||||||
if(acl != NULL)
|
|
||||||
free(acl);
|
|
||||||
*values= NULL;
|
|
||||||
*num_attrs= 0;
|
|
||||||
}
|
|
||||||
return(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------ Setters --------------------------------- */
|
|
||||||
|
|
||||||
|
|
||||||
/* Set the ACL of the given file to a given list in long text form.
|
|
||||||
@param path Path to the file
|
|
||||||
@param text The input text (0 terminated, ACL long text form)
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
bit0= set default ACL rather than access ACL
|
|
||||||
@return > 0 ok
|
|
||||||
-1 failure of system ACL service (see errno)
|
|
||||||
*/
|
|
||||||
int aaip_set_acl_text(char *path, char *text, int flag)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
acl_t acl= NULL;
|
|
||||||
|
|
||||||
acl= acl_from_text(text);
|
|
||||||
if(acl == NULL) {
|
|
||||||
ret= -1; goto ex;
|
|
||||||
}
|
|
||||||
ret= acl_set_file(path, (flag & 1) ? ACL_TYPE_DEFAULT : ACL_TYPE_ACCESS, acl);
|
|
||||||
if(ret == -1)
|
|
||||||
goto ex;
|
|
||||||
ret= 1;
|
|
||||||
ex:
|
|
||||||
if(acl != NULL)
|
|
||||||
acl_free(acl);
|
|
||||||
return(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Bring the given attributes and/or ACLs into effect with the given file.
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
bit0= decode and set ACLs
|
|
||||||
bit1= first clear all existing attributes of the file
|
|
||||||
bit2= do not set attributes other than ACLs
|
|
||||||
bit3= do not ignore eventual ACL attribute
|
|
||||||
(e.g. system.posix_acl_access)
|
|
||||||
@return 1 success
|
|
||||||
-1 error memory allocation
|
|
||||||
-2 error with decoding of ACL
|
|
||||||
-3 error with setting ACL
|
|
||||||
-4 error with setting attribute
|
|
||||||
-5 error with deleting attributes
|
|
||||||
|
|
||||||
*/
|
|
||||||
int aaip_set_attr_list(char *path, size_t num_attrs, char **names,
|
|
||||||
size_t *value_lengths, char **values, int flag)
|
|
||||||
{
|
|
||||||
int ret, has_default_acl= 0;
|
|
||||||
size_t i, consumed, acl_text_fill, list_size= 0, acl_idx= 0;
|
|
||||||
char *acl_text= NULL, *list= NULL;
|
|
||||||
|
|
||||||
if(flag & 2) /* Delete all file attributes */
|
|
||||||
list_size= listxattr(path, list, 0);
|
|
||||||
if(list_size > 0) { /* Delete all file attributes */
|
|
||||||
list= calloc(list_size, 1);
|
|
||||||
if(list == NULL)
|
|
||||||
{ret= -5; goto ex;}
|
|
||||||
list_size= listxattr(path, list, list_size);
|
|
||||||
if(list_size == -1)
|
|
||||||
{ret= -5; goto ex;}
|
|
||||||
for(i= 0; i < list_size; i+= strlen(list + i) + 1) {
|
|
||||||
if(!(flag & 8))
|
|
||||||
if(strcmp(list + i, Aaip_acl_attrnamE) == 0)
|
|
||||||
continue;
|
|
||||||
ret= removexattr(path, list + i);
|
|
||||||
if(ret == -1)
|
|
||||||
{ret= -5; goto ex;}
|
|
||||||
}
|
|
||||||
free(list); list= NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(i= 0; i < num_attrs; i++) {
|
|
||||||
if(names[i] == NULL || values[i] == NULL)
|
|
||||||
continue;
|
|
||||||
if(names[i][0] == 0) { /* ACLs */
|
|
||||||
if(flag & 1)
|
|
||||||
acl_idx= i + 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
/* Extended Attribute */
|
|
||||||
if((flag & 1) && !(flag & 8))
|
|
||||||
if(strcmp(names[i], Aaip_acl_attrnamE) == 0)
|
|
||||||
continue;
|
|
||||||
ret= setxattr(path, names[i], values[i], value_lengths[i], 0);
|
|
||||||
if(ret == -1)
|
|
||||||
{ret= -4; goto ex;}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Decode ACLs */
|
|
||||||
if(acl_idx == 0)
|
|
||||||
{ret= 1; goto ex;}
|
|
||||||
i= acl_idx - 1;
|
|
||||||
/* "access" ACL */
|
|
||||||
ret= aaip_decode_acl((unsigned char *) values[i], value_lengths[i],
|
|
||||||
&consumed, NULL, 0, &acl_text_fill, 1);
|
|
||||||
if(ret <= 0)
|
|
||||||
{ret= -2; goto ex;}
|
|
||||||
acl_text= calloc(acl_text_fill, 1);
|
|
||||||
if(acl_text == NULL)
|
|
||||||
{ret= -1; goto ex;}
|
|
||||||
ret= aaip_decode_acl((unsigned char *) values[i], value_lengths[i],
|
|
||||||
&consumed, acl_text, acl_text_fill, &acl_text_fill, 0);
|
|
||||||
if(ret <= 0)
|
|
||||||
{ret= -2; goto ex;}
|
|
||||||
has_default_acl= (ret == 2);
|
|
||||||
ret= aaip_set_acl_text(path, acl_text, 0);
|
|
||||||
if(ret <= 0)
|
|
||||||
{ret= -3; goto ex;}
|
|
||||||
/* "default" ACL */
|
|
||||||
if(has_default_acl) {
|
|
||||||
free(acl_text);
|
|
||||||
acl_text= NULL;
|
|
||||||
ret= aaip_decode_acl((unsigned char *) (values[i] + consumed),
|
|
||||||
value_lengths[i] - consumed, &consumed,
|
|
||||||
NULL, 0, &acl_text_fill, 1);
|
|
||||||
if(ret <= 0)
|
|
||||||
{ret= -2; goto ex;}
|
|
||||||
acl_text= calloc(acl_text_fill, 1);
|
|
||||||
if(acl_text == NULL)
|
|
||||||
{ret= -1; goto ex;}
|
|
||||||
ret= aaip_decode_acl((unsigned char *) (values[i] + consumed),
|
|
||||||
value_lengths[i] - consumed, &consumed,
|
|
||||||
acl_text, acl_text_fill, &acl_text_fill, 0);
|
|
||||||
if(ret <= 0)
|
|
||||||
{ret= -2; goto ex;}
|
|
||||||
ret= aaip_set_acl_text(path, acl_text, 1);
|
|
||||||
if(ret <= 0)
|
|
||||||
{ret= -3; goto ex;}
|
|
||||||
}
|
|
||||||
ret= 1;
|
|
||||||
ex:;
|
|
||||||
if(acl_text != NULL)
|
|
||||||
free(acl_text);
|
|
||||||
if(list != NULL)
|
|
||||||
free(list);
|
|
||||||
return(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
1687
test/aaip_0_2.c
1687
test/aaip_0_2.c
File diff suppressed because it is too large
Load Diff
381
test/aaip_0_2.h
381
test/aaip_0_2.h
@ -1,381 +0,0 @@
|
|||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
Arbitrary Attribute Interchange Protocol , AAIP version 0.2
|
|
||||||
Demonstration program for encoding and decoding EA and ACL.
|
|
||||||
|
|
||||||
See http://libburnia-project.org/wiki/AAIP
|
|
||||||
or doc/susp_aaip_0_2.txt
|
|
||||||
|
|
||||||
test/aaip_0.2.h - Public declarations
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef Aaip_h_is_includeD
|
|
||||||
#define Aaip_h_is_includeD yes
|
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------- Encoder ---------------------------- */
|
|
||||||
|
|
||||||
/* Convert an array of Arbitrary Attributes into a series of AAIP fields.
|
|
||||||
@param aa_name The 2 byte SUSP Signature Word of the fields
|
|
||||||
@param num_attrs Number of attributes
|
|
||||||
@param names Array of pointers to 0 terminated name strings
|
|
||||||
@param value_lengths Array of byte lengths for each value
|
|
||||||
@param values Array of pointers to the value bytes
|
|
||||||
@param result_len Number of bytes in the resulting SUSP field string
|
|
||||||
@param result *result will point to the start of the result string.
|
|
||||||
This is malloc() memory which needs to be freed when
|
|
||||||
no longer needed
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
bit0= set CONTINUE bit of last AA field to 1
|
|
||||||
@return >0 is the number of SUSP fields generated,
|
|
||||||
0 means error
|
|
||||||
*/
|
|
||||||
unsigned int aaip_encode(char aa_name[2],
|
|
||||||
unsigned int num_attrs, char **names,
|
|
||||||
size_t *value_lengths, char **values,
|
|
||||||
size_t *result_len, unsigned char **result, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/* ------ ACL representation ------ */
|
|
||||||
|
|
||||||
/* Convert an ACL from long text form into the value of an Arbitrary
|
|
||||||
Attribute. According to AAIP 0.2 this value is to be stored together with
|
|
||||||
an empty name.
|
|
||||||
@param acl_text The ACL in long text form
|
|
||||||
@param result_len Number of bytes in the resulting value
|
|
||||||
@param result *result will point to the start of the result string.
|
|
||||||
This is malloc() memory which needs to be freed when
|
|
||||||
no longer needed
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
bit0= count only
|
|
||||||
bit1= use numeric qualifiers rather than names
|
|
||||||
@return >0 means ok
|
|
||||||
0 means error
|
|
||||||
*/
|
|
||||||
int aaip_encode_acl(char *acl_text,
|
|
||||||
size_t *result_len, unsigned char **result, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/* ------ OS interface ------ */
|
|
||||||
|
|
||||||
/* Obtain the ACL of the given file in long text form.
|
|
||||||
@param path Path to the file
|
|
||||||
@param text Will hold the result. This is a managed object which
|
|
||||||
finally has to be freed by a call to this function
|
|
||||||
with bit15 of flag.
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
bit0= obtain default ACL rather than access ACL
|
|
||||||
bit15= free text and return 1
|
|
||||||
@return > 0 ok
|
|
||||||
-1 failure of system ACL service (see errno)
|
|
||||||
*/
|
|
||||||
int aaip_get_acl_text(char *path, char **text, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/* Obtain the Extended Attributes and/or the ACLs of the given file in a form
|
|
||||||
that is ready for aaip_encode(). The returned data objects finally have
|
|
||||||
to be freed by a call with flag bit 15.
|
|
||||||
@param path Path to the file
|
|
||||||
@param num_attrs Will return the number of name-value pairs
|
|
||||||
@param names Will return an array of pointers to 0-terminated names
|
|
||||||
@param value_lengths Will return an arry with the lenghts of values
|
|
||||||
@param values Will return an array of pointers to 8-bit values
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
bit0= obtain ACLs (access and eventually default) via
|
|
||||||
system ACL API and encode
|
|
||||||
bit1= use numeric ACL qualifiers rather than names
|
|
||||||
bit2= do not obtain attributes other than ACLs
|
|
||||||
bit3= do not ignore eventual ACL attribute
|
|
||||||
(e.g. system.posix_acl_access)
|
|
||||||
bit15= free memory of names, value_lengths, values
|
|
||||||
@return >0 ok
|
|
||||||
<=0 error
|
|
||||||
*/
|
|
||||||
int aaip_get_attr_list(char *path, size_t *num_attrs, char ***names,
|
|
||||||
size_t **value_lengths, char ***values, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------- Decoder ---------------------------- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
The AAIP decoder offers several levels of abstraction of which the
|
|
||||||
lower two avoid the use of dynamic memory. It provides a stateful decoding
|
|
||||||
context with a small buffer which delivers results to caller provided
|
|
||||||
memory locations.
|
|
||||||
|
|
||||||
The lowest level is the stream-like Component Level Interface. It allows
|
|
||||||
to decode very many very long attributes.
|
|
||||||
|
|
||||||
Next is the Pair Level Interface which delivers to fixly sized storage for
|
|
||||||
name and value. It allows to decode very many attributes.
|
|
||||||
|
|
||||||
The List Level Interface uses dynamic memory allocation to provide arrays
|
|
||||||
of names, values and value lengths. It is intended for moderately sized
|
|
||||||
attribute lists but may also be used as alternative to Pair Level.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* The AAIP decoder context.
|
|
||||||
*/
|
|
||||||
struct aaip_state;
|
|
||||||
|
|
||||||
|
|
||||||
/* Obtain the size in bytes of an aaip_state object.
|
|
||||||
*/
|
|
||||||
size_t aaip_sizeof_aaip_state(void);
|
|
||||||
|
|
||||||
|
|
||||||
/* Initialize a AAIP decoder context.
|
|
||||||
This has to be done before the first AA field of a node is processed.
|
|
||||||
The caller has to provide the storage of the struct aaip_state.
|
|
||||||
@param aaip The AAIP decoder context to be initialized
|
|
||||||
@param aa_name The Signature Word (advised is "AA")
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
submit 0
|
|
||||||
@return <=0 error , >0 ok
|
|
||||||
*/
|
|
||||||
int aaip_init_aaip_state(struct aaip_state *aaip, char aa_name[2], int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------- Component Level Interface ------------------- */
|
|
||||||
/*
|
|
||||||
Provides support for unlimited component size but demands the caller
|
|
||||||
to have a growing storage facility resp. to do own oversize handling.
|
|
||||||
|
|
||||||
This interface expects moderatly sized input pieces and will hand out
|
|
||||||
moderately sized result pieces. The number of transactions is virtually
|
|
||||||
unlimited.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Submit small data chunk for decoding.
|
|
||||||
The return value will tell whether data are pending for being fetched.
|
|
||||||
@param aaip The AAIP decoder context
|
|
||||||
@param data Not more than 2048 bytes input for the decoder
|
|
||||||
@param num_data Number of bytes in data
|
|
||||||
0 inquires the buffer status avoiding replies <= 0
|
|
||||||
@param ready_bytes Number of decoded bytes ready for delivery
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
@return -1= non-AA field detected
|
|
||||||
*ready_bytes gives number of consumed bytes in data
|
|
||||||
0= cannot accept data because buffer full
|
|
||||||
1= no component record complete, submit more data
|
|
||||||
2= component record complete, may be delivered
|
|
||||||
3= component complete, may be delivered
|
|
||||||
4= no component available, no more data expected, done
|
|
||||||
*/
|
|
||||||
int aaip_submit_data(struct aaip_state *aaip,
|
|
||||||
unsigned char *data, size_t num_data,
|
|
||||||
size_t *ready_bytes, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/* Fetch the available part of current component.
|
|
||||||
The return value will tell whether it belongs to name or to value and
|
|
||||||
whether that name or value is completed now.
|
|
||||||
@param aaip The AAIP decoder context
|
|
||||||
@param result Has to point to storage for the component data
|
|
||||||
@param result_size Gives the amount of provided result storage
|
|
||||||
@param num_result Will tell the number of fetched result bytes
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
bit0= discard data rather than copying to result
|
|
||||||
@return -2 = insufficient result_size
|
|
||||||
-1 = no data ready for delivery
|
|
||||||
0 = result holds the final part of a name
|
|
||||||
1 = result holds an intermediate part of a name
|
|
||||||
2 = result holds the final part of a value
|
|
||||||
3 = result holds an intermediate part of a value
|
|
||||||
*/
|
|
||||||
int aaip_fetch_data(struct aaip_state *aaip,
|
|
||||||
char *result, size_t result_size, size_t *num_result,
|
|
||||||
int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/* Skip the current component and eventually the following value component.
|
|
||||||
This has to be called if fetching of a component shall be aborted
|
|
||||||
but the next component resp. pair shall be fetchable again.
|
|
||||||
aaip_submit_data() will not indicate readiness for fetching until all
|
|
||||||
bytes of the skipped components are submitted. Those bytes get discarded.
|
|
||||||
@param aaip The AAIP decoder context
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
bit0= do not skip value if current component is name
|
|
||||||
@return <=0 error , 1= now in skip state, 2= not in skip state
|
|
||||||
*/
|
|
||||||
int aaip_skip_component(struct aaip_state *aaip, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------- Pair Level Interface ------------------------ */
|
|
||||||
/*
|
|
||||||
Provides support for names and values of limited size. The limits are
|
|
||||||
given by the caller who has to provide the storage for name and value.
|
|
||||||
|
|
||||||
This interface expects moderatly sized input pieces.
|
|
||||||
The number of input transcations is virtually unlimited.
|
|
||||||
The number of pair transactions after aaip_init() should be limited
|
|
||||||
to 4 billion.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* Accept raw input data and collect a pair of name and value.
|
|
||||||
The return value will indicate whether the pair is complete, whether more
|
|
||||||
pairs are complete or whether more data are desired. No input data will be
|
|
||||||
accepted as long as complete pairs are pending. The end of the attribute
|
|
||||||
list will be indicated.
|
|
||||||
@param aaip The AAIP decoder context
|
|
||||||
@param data The raw data to decode
|
|
||||||
@param num_data Number of data bytes provided
|
|
||||||
@param consumed Returns the number of consumed data bytes
|
|
||||||
@param name Buffer to build the name string
|
|
||||||
@param name_size Maximum number of bytes in name
|
|
||||||
@param name_fill Holds the current buffer fill of name
|
|
||||||
@param value Buffer to build the value string
|
|
||||||
@param value_size Maximum number of bytes in value
|
|
||||||
@param value_fill Holds the current buffer fill of value
|
|
||||||
@param flag Bitfield for control purposes - submit 0 for now
|
|
||||||
@return <0 error
|
|
||||||
0 data not accepted, first fetch pending pairs with num_data == 0
|
|
||||||
1 name and value are not valid yet, submit more data
|
|
||||||
2 name and value are valid, submit more data
|
|
||||||
3 name and value are valid, pairs pending, fetch with num_data == 0
|
|
||||||
4 name and value are valid, no more data expected
|
|
||||||
5 name and value are not valid, no more data expected
|
|
||||||
|
|
||||||
*/
|
|
||||||
int aaip_decode_pair(struct aaip_state *aaip,
|
|
||||||
unsigned char *data, size_t num_data, size_t *consumed,
|
|
||||||
char *name, size_t name_size, size_t *name_fill,
|
|
||||||
char *value, size_t value_size, size_t *value_fill,
|
|
||||||
int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/* Inquire the number of pairs which were skipped because being oversized.
|
|
||||||
@param aaip The AAIP decoder context
|
|
||||||
@param flag Bitfield for control purposes - submit 0 for now
|
|
||||||
@return The number of pairs skipped since aaip_init()
|
|
||||||
*/
|
|
||||||
unsigned int aaip_get_pairs_skipped(struct aaip_state *aaip, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------- List Level Interface ------------------------ */
|
|
||||||
/*
|
|
||||||
Provides support for names and values of limited size. The limits are
|
|
||||||
given for total memory consumption and for number of attributes.
|
|
||||||
|
|
||||||
Iterated decoding is supported as long as no single attribute exceeds
|
|
||||||
the memory limit.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Accept raw input data and collect arrays of name pointers, value lengths
|
|
||||||
and value pointers. A handle object will emerge which finally has to be
|
|
||||||
be freed by a call with bit 15.
|
|
||||||
@param handle The decoding context.
|
|
||||||
It will be created by this call with flag bit 0 or if
|
|
||||||
*handle == NULL. This handle has to be the same as long
|
|
||||||
as decoding goes on and finally has to be freed by a
|
|
||||||
call with bit15.
|
|
||||||
@param aa_name The Signature Word (advised is "AA")
|
|
||||||
@param memory_limit Maximum number of bytes to allocate
|
|
||||||
@param num_attr_limit Maximum number of name-value pairs to allocate
|
|
||||||
@param data The raw data to decode
|
|
||||||
@param num_data Number of data bytes provided
|
|
||||||
@param consumed Returns the number of consumed data bytes
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
bit0= this is the first call for a file object
|
|
||||||
bit15= end decoding :
|
|
||||||
Free handle and its intermediate list memory.
|
|
||||||
@return <=0 error
|
|
||||||
1 not complete yet, submit more data
|
|
||||||
2 arrays are complete, call aaip_get_decoded_attrs()
|
|
||||||
3 limit exceeded, not complete yet, call with bit15 and give up
|
|
||||||
4 limit exceeded, call aaip_get_decoded_attrs() and try again
|
|
||||||
*/
|
|
||||||
int aaip_decode_attrs(struct aaip_state **handle, char aa_name[2],
|
|
||||||
size_t memory_limit, size_t num_attr_limit,
|
|
||||||
unsigned char *data, size_t num_data, size_t *consumed,
|
|
||||||
int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/* Obtain the resulting attributes when aaip_decode_attrs() indicates to
|
|
||||||
be done or to have the maximum possible amount of result ready.
|
|
||||||
The returned data objects get detached from handle making it ready for
|
|
||||||
the next round of decoding with possibly a different input source. The
|
|
||||||
returned data objects finally have to be freed by a call with flag bit 15.
|
|
||||||
@param handle The decoding context created by aaip_decode_attrs()
|
|
||||||
@param num_attrs Will return the number of name-value pairs
|
|
||||||
@param names Will return an array of pointers to 0-terminated names
|
|
||||||
@param value_lengths Will return an arry with the lenghts of values
|
|
||||||
@param values Will return an array of pointers to 8-bit values
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
bit15= free memory of names, value_lengths, values
|
|
||||||
*/
|
|
||||||
int aaip_get_decoded_attrs(struct aaip_state **handle, size_t *num_attrs,
|
|
||||||
char ***names, size_t **value_lengths, char ***values,
|
|
||||||
int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/* ------ ACL representation ------ */
|
|
||||||
|
|
||||||
/* Convert an AAIP 0.2 ACL attribute value into the long text form of ACL.
|
|
||||||
@param data The raw data to decode
|
|
||||||
@param num_data Number of data bytes provided
|
|
||||||
@param consumed Returns the number of consumed data bytes
|
|
||||||
@param acl_text Will be filled with ACL long text form
|
|
||||||
@param acl_text_size Maximum number of bytes to be written to acl_text
|
|
||||||
@param acl_text_fill Will return the number of bytes in acl_text
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
bit0= count only, do not really produce bytes:
|
|
||||||
acl_text will not be touched,
|
|
||||||
acl_text_size will be ignored,
|
|
||||||
*acl_text_fill will return the counted number
|
|
||||||
bit1= expected is a default ACL (see return value 2)
|
|
||||||
@return 1 success
|
|
||||||
2 success, begin of default/access ACL encountered,
|
|
||||||
submit data + *consumed for access/default ACL
|
|
||||||
-1 error with reading of qualifier
|
|
||||||
-2 error with writing of ACL text line
|
|
||||||
-3 version mismatch
|
|
||||||
-4 unknown tag type encountered
|
|
||||||
*/
|
|
||||||
int aaip_decode_acl(unsigned char *data, size_t num_data, size_t *consumed,
|
|
||||||
char *acl_text, size_t acl_text_size,
|
|
||||||
size_t *acl_text_fill, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/* ------ OS interface ------ */
|
|
||||||
|
|
||||||
/* Set the ACL of the given file to a given list in long text form.
|
|
||||||
@param path Path to the file
|
|
||||||
@param text The input text (0 terminated, ACL long text form)
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
bit0= set default ACL rather than access ACL
|
|
||||||
@return > 0 ok
|
|
||||||
-1 failure of system ACL service (see errno)
|
|
||||||
*/
|
|
||||||
int aaip_set_acl_text(char *path, char *text, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/* Bring the given attributes and/or ACLs into effect with the given file.
|
|
||||||
@param path Path to the file
|
|
||||||
@param num_attrs Number of attributes
|
|
||||||
@param names Array of pointers to 0 terminated name strings
|
|
||||||
@param value_lengths Array of byte lengths for each attribute payload
|
|
||||||
@param values Array of pointers to the attribute payload bytes
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
bit0= decode and set ACLs
|
|
||||||
bit1= first clear all existing attributes of the file
|
|
||||||
bit2= do not set attributes other than ACLs
|
|
||||||
bit3= do not ignore eventual ACL attribute
|
|
||||||
(e.g. system.posix_acl_access)
|
|
||||||
@return 1 success
|
|
||||||
-1 error memory allocation
|
|
||||||
-2 error with decoding of ACL
|
|
||||||
-3 error with setting ACL
|
|
||||||
-4 error with setting attribute
|
|
||||||
-5 error with deleting attributes
|
|
||||||
|
|
||||||
*/
|
|
||||||
int aaip_set_attr_list(char *path, size_t num_attrs, char **names,
|
|
||||||
size_t *value_lengths, char **values, int flag);
|
|
||||||
|
|
||||||
#endif /* ! Aaip_h_is_includeD */
|
|
||||||
|
|
@ -1,443 +0,0 @@
|
|||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
Arbitrary Attribute Interchange Protocol , AAIP version 0.2
|
|
||||||
Demonstration program for encoding and decoding EA and ACL.
|
|
||||||
|
|
||||||
See http://libburnia-project.org/wiki/AAIP
|
|
||||||
|
|
||||||
test/aaip_0_2_test.c - Main program for test binary
|
|
||||||
|
|
||||||
Compile:
|
|
||||||
cc -g -Wall -o test/aaip test/aaip_0_2.c test/aaip_0_2_test.c -lacl
|
|
||||||
|
|
||||||
Usage: ./aaip name value
|
|
||||||
Long parameters ./aaip -name"x100" -value"x100"
|
|
||||||
|
|
||||||
>>> ACLs
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#include <sys/acl.h>
|
|
||||||
|
|
||||||
#include "aaip_0_2.h"
|
|
||||||
|
|
||||||
#define Aaip_test_name_sizE 1024
|
|
||||||
#define Aaip_test_value_sizE 1024
|
|
||||||
|
|
||||||
|
|
||||||
static int print_result(unsigned char *result, size_t result_len, int flag)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
printf(
|
|
||||||
" - - - - - - 0 - - 1 - - 2 - - 3 - - 4 - - 5 - - 6 - - 7 - - 8 - - 9\n");
|
|
||||||
printf("\n");
|
|
||||||
printf("%4u : ", 0);
|
|
||||||
for(i= 0; i < result_len; i++) {
|
|
||||||
if(result[i] >= 32 && result[i] <= 126)
|
|
||||||
printf("'%c' ", result[i]);
|
|
||||||
else
|
|
||||||
printf("%3u ", (unsigned int) ((unsigned char *) result)[i]);
|
|
||||||
if((i % 10) == 9)
|
|
||||||
printf("\n%4u : ", (unsigned int) (i + 1));
|
|
||||||
}
|
|
||||||
printf("\n\n");
|
|
||||||
printf(
|
|
||||||
" - - - - - - 0 - - 1 - - 2 - - 3 - - 4 - - 5 - - 6 - - 7 - - 8 - - 9\n");
|
|
||||||
printf("\n");
|
|
||||||
return(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int print_attrs(size_t num_attrs, char **names, size_t *value_lengths,
|
|
||||||
char **values, int flag)
|
|
||||||
{
|
|
||||||
size_t i, j;
|
|
||||||
|
|
||||||
for(i= 0; i < num_attrs; i++) {
|
|
||||||
printf("name='");
|
|
||||||
for(j= 0; names[i][j] != 0; j++) {
|
|
||||||
if(names[i][j] >= 32 && names[i][j] <= 126 &&
|
|
||||||
names[i][j] != '\\' && names[i][j] != '\'')
|
|
||||||
printf("%c", names[i][j]);
|
|
||||||
else
|
|
||||||
printf("\\%o", (unsigned int) ((unsigned char **) names)[i][j]);
|
|
||||||
}
|
|
||||||
printf("' (%d)\n", (int) j);
|
|
||||||
printf("value='");
|
|
||||||
for(j= 0; j < value_lengths[i]; j++) {
|
|
||||||
if(values[i][j] >= 32 && values[i][j] <= 126 &&
|
|
||||||
values[i][j] != '\\' && values[i][j] != '\'')
|
|
||||||
printf("%c", values[i][j]);
|
|
||||||
else
|
|
||||||
printf("\\%3.3o", (unsigned int) ((unsigned char **) values)[i][j]);
|
|
||||||
}
|
|
||||||
printf("' (%d)\n\n", (int) j);
|
|
||||||
}
|
|
||||||
return(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int do_touch(char *path, int flag)
|
|
||||||
{
|
|
||||||
FILE *fp;
|
|
||||||
|
|
||||||
fp= fopen(path, "a");
|
|
||||||
if(fp == NULL) {
|
|
||||||
fprintf(stderr, "fopen(\"%s\") failed: %d %s\n",
|
|
||||||
path, errno, errno != 0 ? strerror(errno) : "");
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
fclose(fp);
|
|
||||||
return(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int decode_acl(unsigned char *result, size_t result_len,
|
|
||||||
char *out_path, int flag)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
size_t consumed, text_fill;
|
|
||||||
char *text= NULL;
|
|
||||||
|
|
||||||
ret= aaip_decode_acl(result, result_len, &consumed, NULL, 0, &text_fill, 1);
|
|
||||||
if(ret <= 0) {
|
|
||||||
fprintf(stderr, "aaip_decode_acl(,1) failed: ret= %d\n", ret);
|
|
||||||
ret= 0; goto ex;
|
|
||||||
}
|
|
||||||
text= calloc(text_fill, 1);
|
|
||||||
ret= aaip_decode_acl(result, result_len, &consumed, text, text_fill,
|
|
||||||
&text_fill, 0);
|
|
||||||
if(ret <= 0) {
|
|
||||||
fprintf(stderr, "aaip_decode_acl(,0) failed: ret= %d\n", ret);
|
|
||||||
ret= 0; goto ex;
|
|
||||||
}
|
|
||||||
printf("--- ret= %d , text=\n%s--- end of text\n\n", ret, text);
|
|
||||||
|
|
||||||
if(out_path == NULL)
|
|
||||||
{ret= 1; goto ex;}
|
|
||||||
|
|
||||||
ret= do_touch(out_path, 0);
|
|
||||||
if(ret <= 0)
|
|
||||||
goto ex;
|
|
||||||
|
|
||||||
ret= aaip_set_acl_text(out_path, text, 0);
|
|
||||||
if(ret <= 0) {
|
|
||||||
fprintf(stderr, "aaip_set_acl_text() failed");
|
|
||||||
if(ret == -1)
|
|
||||||
fprintf(stderr, ": %d %s\n", errno, errno != 0 ? strerror(errno) : "");
|
|
||||||
else
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
ret= 0; goto ex;
|
|
||||||
}
|
|
||||||
ret= 1;
|
|
||||||
ex:
|
|
||||||
if(text != NULL)
|
|
||||||
free(text);
|
|
||||||
return(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int test_acl(char *in_path, char *out_path, int flag)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
char *acl_text= NULL;
|
|
||||||
unsigned char *result= NULL;
|
|
||||||
size_t result_len;
|
|
||||||
|
|
||||||
ret= aaip_get_acl_text(in_path, &acl_text, 0);
|
|
||||||
if(ret <= 0) {
|
|
||||||
fprintf(stderr, "aaip_get_acl_text() failed");
|
|
||||||
if(ret == -1)
|
|
||||||
fprintf(stderr, ": %d %s\n", errno, errno != 0 ? strerror(errno) : "");
|
|
||||||
else
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
ret= 6; goto ex;
|
|
||||||
}
|
|
||||||
printf("--- ACL:\n%s--- end of ACL\n\n", acl_text);
|
|
||||||
|
|
||||||
ret= aaip_encode_acl(acl_text, &result_len, &result, 0);
|
|
||||||
if(ret <= 0) {
|
|
||||||
fprintf(stderr, "aaip_encode_acl(text) failed: ret= %d\n", ret);
|
|
||||||
ret= 7; goto ex;
|
|
||||||
}
|
|
||||||
print_result(result, result_len, 0);
|
|
||||||
ret= decode_acl(result, result_len, out_path, 0);
|
|
||||||
if(ret <= 0)
|
|
||||||
{ret= 8; goto ex;}
|
|
||||||
free(result); result= NULL;
|
|
||||||
|
|
||||||
ret= aaip_encode_acl(acl_text, &result_len, &result, 2);
|
|
||||||
if(ret <= 0) {
|
|
||||||
fprintf(stderr, "aaip_encode_acl(num) failed: ret= %d\n", ret);
|
|
||||||
ret= 9; goto ex;
|
|
||||||
}
|
|
||||||
print_result(result, result_len, 0);
|
|
||||||
ret= decode_acl(result, result_len, out_path, 0);
|
|
||||||
if(ret <= 0)
|
|
||||||
{ret= 10; goto ex;}
|
|
||||||
|
|
||||||
ret= 0;
|
|
||||||
ex:;
|
|
||||||
aaip_get_acl_text("", &acl_text, 1 << 15);
|
|
||||||
if(result != NULL)
|
|
||||||
free(result);
|
|
||||||
return(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int synthetic_pairs(char *prog, int argc, char **argv, int flag)
|
|
||||||
{
|
|
||||||
int ret, l, mult= 0, k;
|
|
||||||
size_t result_len, i;
|
|
||||||
unsigned char *result= NULL;
|
|
||||||
char **names= NULL, **values= NULL, *cpt, **param;
|
|
||||||
size_t *value_lengths= NULL;
|
|
||||||
|
|
||||||
struct aaip_state *aaip;
|
|
||||||
size_t consumed= 0;
|
|
||||||
char name[Aaip_test_name_sizE + 1];
|
|
||||||
size_t name_fill;
|
|
||||||
char value[Aaip_test_value_sizE + 1];
|
|
||||||
size_t value_fill;
|
|
||||||
size_t todo;
|
|
||||||
int submit_data, is_done;
|
|
||||||
unsigned char *rpt;
|
|
||||||
unsigned int skipped, was_skipped= 0;
|
|
||||||
|
|
||||||
aaip= (struct aaip_state *) calloc(aaip_sizeof_aaip_state(), 1);
|
|
||||||
names= calloc(sizeof(char *), argc / 2);
|
|
||||||
values= calloc(sizeof(char *), argc / 2);
|
|
||||||
value_lengths= calloc(sizeof(size_t), argc / 2);
|
|
||||||
|
|
||||||
for(i= 0; i < argc; i++) {
|
|
||||||
if(i % 2)
|
|
||||||
param= values + i / 2;
|
|
||||||
else
|
|
||||||
param= names + i / 2;
|
|
||||||
(*param)= argv[i];
|
|
||||||
if(argv[i][0] == '-') {
|
|
||||||
cpt= strchr(argv[i], 'x');
|
|
||||||
if(cpt != NULL) {
|
|
||||||
l= cpt - argv[i] - 1;
|
|
||||||
if(l > 0)
|
|
||||||
sscanf(cpt + 1, "%d", &mult);
|
|
||||||
if(l > 0 && mult > 0) {
|
|
||||||
(*param)= calloc(1, l * mult + 1);
|
|
||||||
if((*param) != NULL) {
|
|
||||||
for(k= 0; k < mult; k++)
|
|
||||||
memcpy((*param) + k * l, argv[i] + 1, l);
|
|
||||||
(*param)[mult * l]= 0;
|
|
||||||
} else
|
|
||||||
(*param)= argv[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(i % 2)
|
|
||||||
value_lengths[i / 2]= strlen(values[i / 2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
ret= aaip_encode("AA", (unsigned int) (argc / 2), names,
|
|
||||||
value_lengths, values,
|
|
||||||
&result_len, &result, 0);
|
|
||||||
if(ret <= 0) {
|
|
||||||
fprintf(stderr, "%s : aaip_encode failed with ret= %d\n", prog, ret);
|
|
||||||
return(2);
|
|
||||||
}
|
|
||||||
print_result(result, result_len, 0);
|
|
||||||
|
|
||||||
aaip_init_aaip_state(aaip, "AA", 0);
|
|
||||||
rpt= result;
|
|
||||||
submit_data= 1;
|
|
||||||
is_done= 0;
|
|
||||||
while(!is_done) {
|
|
||||||
if(submit_data) {
|
|
||||||
todo= result_len - (rpt - result);
|
|
||||||
if(todo > 2048)
|
|
||||||
todo= 2048;
|
|
||||||
if(todo == 0) {
|
|
||||||
fprintf(stderr, "%s : Out of data while still prompted to submit\n",
|
|
||||||
prog);
|
|
||||||
return(5);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
todo= 0;
|
|
||||||
ret= aaip_decode_pair(aaip, rpt, todo, &consumed,
|
|
||||||
name, Aaip_test_name_sizE, &name_fill,
|
|
||||||
value, Aaip_test_value_sizE, &value_fill, 0);
|
|
||||||
skipped= aaip_get_pairs_skipped(aaip, 0);
|
|
||||||
if(skipped > was_skipped) {
|
|
||||||
printf("- skipped %d pair%s -\n\n", skipped - was_skipped,
|
|
||||||
skipped - was_skipped > 1 ? "s" : "");
|
|
||||||
was_skipped= skipped;
|
|
||||||
}
|
|
||||||
if(ret < 0) {
|
|
||||||
fprintf(stderr, "%s : aaip_decode_pair failed with ret= %d\n", prog, ret);
|
|
||||||
return(3);
|
|
||||||
}
|
|
||||||
rpt+= todo;
|
|
||||||
if(ret == 0) {
|
|
||||||
rpt-= todo;
|
|
||||||
submit_data= 0;
|
|
||||||
continue;
|
|
||||||
} else if(ret == 1) {
|
|
||||||
submit_data= 1;
|
|
||||||
continue;
|
|
||||||
} else if(ret == 2) {
|
|
||||||
submit_data= 1;
|
|
||||||
} else if(ret == 3) {
|
|
||||||
submit_data= 0;
|
|
||||||
} else if(ret == 4) {
|
|
||||||
is_done= 1;
|
|
||||||
} else if(ret == 5) {
|
|
||||||
is_done= 1;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "%s : Unknown return %d from aaip_decode_pair()\n",
|
|
||||||
prog, ret);
|
|
||||||
return(4);
|
|
||||||
}
|
|
||||||
name[name_fill]= 0;
|
|
||||||
value[value_fill]= 0;
|
|
||||||
if((name_fill < 1000 && value_fill < 1000)) {
|
|
||||||
printf("name = '%s' (%lu)\n", name, (unsigned long) name_fill);
|
|
||||||
printf("value= '%s' (%lu)\n", value, (unsigned long) value_fill);
|
|
||||||
} else {
|
|
||||||
printf("name = (%lu)\n", (unsigned long) name_fill);
|
|
||||||
printf("value= (%lu)\n", (unsigned long) value_fill);
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
@param flag bit0= use numeric qualifiers
|
|
||||||
*/
|
|
||||||
static int copy_all(char *in_path, char *out_path, int flag)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
struct aaip_state *aaip= NULL;
|
|
||||||
size_t in_num_attrs, *in_value_lengths= NULL;
|
|
||||||
char **in_names= NULL, **in_values= NULL;
|
|
||||||
int is_done= 0, first_round= 1;
|
|
||||||
unsigned char *result= NULL, *rpt;
|
|
||||||
size_t result_len, todo, consumed;
|
|
||||||
size_t out_num_attrs, *out_value_lengths= NULL;
|
|
||||||
char **out_names= NULL, **out_values= NULL;
|
|
||||||
|
|
||||||
ret= aaip_get_attr_list(in_path, &in_num_attrs, &in_names, &in_value_lengths,
|
|
||||||
&in_values, 1 | ((flag & 1) << 1));
|
|
||||||
if(ret <= 0)
|
|
||||||
{ret= 11; goto ex;}
|
|
||||||
print_attrs(in_num_attrs, in_names, in_value_lengths, in_values, 0);
|
|
||||||
|
|
||||||
ret= aaip_encode("AA", (unsigned int) in_num_attrs, in_names,
|
|
||||||
in_value_lengths, in_values, &result_len, &result, 0);
|
|
||||||
if(ret == 0)
|
|
||||||
{ret= 12; goto ex;}
|
|
||||||
|
|
||||||
if(result_len <= 0) {
|
|
||||||
fprintf(stderr, "No result\n");
|
|
||||||
ret= 13; goto ex;
|
|
||||||
}
|
|
||||||
print_result(result, result_len, 0);
|
|
||||||
|
|
||||||
rpt= result;
|
|
||||||
while(!is_done) {
|
|
||||||
todo= result_len - (rpt - result);
|
|
||||||
if(todo > 2048)
|
|
||||||
todo= 2048;
|
|
||||||
if(todo == 0) {
|
|
||||||
fprintf(stderr, "Out of data while still prompted to submit\n");
|
|
||||||
ret= 14; goto ex;
|
|
||||||
}
|
|
||||||
/* Allow 1 million bytes of memory consumption, 100,000 attributes */
|
|
||||||
ret= aaip_decode_attrs(&aaip, "AA", (size_t) 1000000, (size_t) 100000,
|
|
||||||
rpt, todo, &consumed, first_round);
|
|
||||||
rpt+= consumed;
|
|
||||||
first_round= 0;
|
|
||||||
if(ret == 1)
|
|
||||||
continue;
|
|
||||||
if(ret == 2)
|
|
||||||
break;
|
|
||||||
fprintf(stderr, "aaip_decode_attrs() returns %d\n", ret);
|
|
||||||
ret= 15; goto ex;
|
|
||||||
}
|
|
||||||
if(rpt - result != result_len) {
|
|
||||||
fprintf(stderr, "aaip_decode_attrs() returns 2 but %d bytes are left\n",
|
|
||||||
(int) (result_len - (rpt - result)));
|
|
||||||
ret= 16; goto ex;
|
|
||||||
}
|
|
||||||
ret= aaip_get_decoded_attrs(&aaip, &out_num_attrs, &out_names,
|
|
||||||
&out_value_lengths, &out_values, 0);
|
|
||||||
|
|
||||||
if(ret != 1) {
|
|
||||||
fprintf(stderr, "aaip_get_decoded_attrs() returns %d\n", ret);
|
|
||||||
ret= 17; goto ex;
|
|
||||||
}
|
|
||||||
print_attrs(out_num_attrs, out_names, out_value_lengths, out_values, 0);
|
|
||||||
|
|
||||||
ret= do_touch(out_path, 0);
|
|
||||||
if(ret <= 0)
|
|
||||||
{ret= 19; goto ex;}
|
|
||||||
|
|
||||||
ret= aaip_set_attr_list(out_path, out_num_attrs, out_names, out_value_lengths,
|
|
||||||
out_values, 1 | 2);
|
|
||||||
if(ret != 1) {
|
|
||||||
fprintf(stderr, "aaip_set_attr_list() returns %d\n", ret);
|
|
||||||
ret= 18; goto ex;
|
|
||||||
}
|
|
||||||
ret= 0;
|
|
||||||
ex:;
|
|
||||||
if(in_names != NULL || in_value_lengths != NULL || in_values != NULL)
|
|
||||||
aaip_get_attr_list(in_path, &in_num_attrs, &in_names, &in_value_lengths,
|
|
||||||
&in_values, 1 << 15);
|
|
||||||
if(out_names != NULL || out_value_lengths != NULL || out_values != NULL)
|
|
||||||
aaip_get_decoded_attrs(&aaip, &out_num_attrs, &out_names,
|
|
||||||
&out_value_lengths, &out_values, 15);
|
|
||||||
aaip_decode_attrs(&aaip, "AA", (size_t) 0, (size_t) 0, NULL, (size_t) 0,
|
|
||||||
&consumed, 1 << 15);
|
|
||||||
return(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if(argc < 2) {
|
|
||||||
usage:
|
|
||||||
fprintf(stderr, "usage : %s options\n", argv[0]);
|
|
||||||
fprintf(stderr, " -pairs [-]name[xNNN] [-]value[xNNN] [...]\n");
|
|
||||||
fprintf(stderr, " -copy_acl source_path target_path\n");
|
|
||||||
fprintf(stderr, " -copy source_path target_path\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
if(strcmp(argv[1], "-pairs") == 0) {
|
|
||||||
if(argc < 4 || (argc % 2) != 0)
|
|
||||||
goto usage;
|
|
||||||
ret= synthetic_pairs(argv[0], argc - 2, argv + 2, 0);
|
|
||||||
} else if(strcmp(argv[1], "-copy_acl") == 0) {
|
|
||||||
if(argc != 4)
|
|
||||||
goto usage;
|
|
||||||
ret= test_acl(argv[2], argv[3], 0);
|
|
||||||
} else if(strcmp(argv[1], "-copy") == 0) {
|
|
||||||
if(argc != 4)
|
|
||||||
goto usage;
|
|
||||||
ret= copy_all(argv[2], argv[3], 1);
|
|
||||||
} else
|
|
||||||
goto usage;
|
|
||||||
exit(ret);
|
|
||||||
}
|
|
@ -4,8 +4,8 @@
|
|||||||
xorriso. By Thomas Schmitt <scdbackup@gmx.net>
|
xorriso. By Thomas Schmitt <scdbackup@gmx.net>
|
||||||
Integrated sub project of libburnia-project.org but also published via:
|
Integrated sub project of libburnia-project.org but also published via:
|
||||||
http://scdbackup.sourceforge.net/xorriso_eng.html
|
http://scdbackup.sourceforge.net/xorriso_eng.html
|
||||||
http://scdbackup.sourceforge.net/xorriso-0.3.2.pl00.tar.gz
|
http://scdbackup.sourceforge.net/xorriso-0.2.2.pl00.tar.gz
|
||||||
Copyright (C) 2006-2009 Thomas Schmitt, provided under GPL version 2.
|
Copyright (C) 2006-2008 Thomas Schmitt, provided under GPL version 2.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
@ -16,8 +16,7 @@ information of existing ISO images and it writes the session results to
|
|||||||
optical media or to filesystem objects.
|
optical media or to filesystem objects.
|
||||||
Vice versa xorriso is able to restore file objects from ISO 9660 filesystems.
|
Vice versa xorriso is able to restore file objects from ISO 9660 filesystems.
|
||||||
|
|
||||||
Currently it is supported on Linux with kernels >= 2.4 and on FreeBSD versions
|
Currently it is only supported on Linux with kernels >= 2.4.
|
||||||
with ATAPI/CAM support enabled in the kernel, see atapicam(4).
|
|
||||||
|
|
||||||
A special property of xorriso is that it needs neither an external ISO 9660
|
A special property of xorriso is that it needs neither an external ISO 9660
|
||||||
formatter program nor an external burn program for CD or DVD but rather
|
formatter program nor an external burn program for CD or DVD but rather
|
||||||
@ -37,10 +36,10 @@ The tarball contains anything that is needed except libc and libpthread.
|
|||||||
libreadline and the readline-dev headers will make dialog mode more convenient,
|
libreadline and the readline-dev headers will make dialog mode more convenient,
|
||||||
but are not mandatory.
|
but are not mandatory.
|
||||||
|
|
||||||
Obtain xorriso-0.3.2.pl00.tar.gz, take it to a directory of your choice and do:
|
Obtain xorriso-0.2.2.pl00.tar.gz, take it to a directory of your choice and do:
|
||||||
|
|
||||||
tar xzf xorriso-0.3.2.pl00.tar.gz
|
tar xzf xorriso-0.2.2.pl00.tar.gz
|
||||||
cd xorriso-0.3.2
|
cd xorriso-0.2.2
|
||||||
|
|
||||||
Within that directory execute:
|
Within that directory execute:
|
||||||
|
|
||||||
@ -54,8 +53,8 @@ which you may strip to reduce it in size
|
|||||||
strip ./xorriso/xorriso
|
strip ./xorriso/xorriso
|
||||||
|
|
||||||
You may copy or move it to a directory where it can be found by the shell,
|
You may copy or move it to a directory where it can be found by the shell,
|
||||||
or you may execute xorriso at the place where it was built,
|
you may execute xorriso at the place where it was built, or you may execute
|
||||||
or you may execute as superuser:
|
as superuser:
|
||||||
make install
|
make install
|
||||||
|
|
||||||
For general concepts, options and usage examples see
|
For general concepts, options and usage examples see
|
||||||
@ -75,15 +74,6 @@ The installation creates several alias links pointing to the xorriso binary:
|
|||||||
xorrecord starts xorriso with -as cdrecord emulation already enabled
|
xorrecord starts xorriso with -as cdrecord emulation already enabled
|
||||||
osirrox starts with -osirrox image-to-disk copying already enabled
|
osirrox starts with -osirrox image-to-disk copying already enabled
|
||||||
|
|
||||||
If you want to avoid dependecy on libreadline although the libreadline
|
|
||||||
development package is installed, then rather build xorriso by:
|
|
||||||
./configure --prefix=/usr --disable-libreadline
|
|
||||||
make clean ; make
|
|
||||||
Never omit the "make clean" command after switching libreadline enabling.
|
|
||||||
|
|
||||||
If you want xorriso to report a "Build timestamp" with its option -version:
|
|
||||||
make buildstamped
|
|
||||||
|
|
||||||
|
|
||||||
Drives and Disk File Objects
|
Drives and Disk File Objects
|
||||||
|
|
||||||
@ -123,13 +113,9 @@ Better try to unmount an eventually mounted media before a write run.
|
|||||||
|
|
||||||
|
|
||||||
Besides true optical drives, xorriso can also address disk files as input or
|
Besides true optical drives, xorriso can also address disk files as input or
|
||||||
output drives. By default paths to files under /dev are accepted only if the
|
output drives. The addresses of the disk files have to be preceded by "stdio:".
|
||||||
device represents a real optical drive. Other device files may be addressed
|
|
||||||
by prepending "stdio:" to the path.
|
|
||||||
Like:
|
Like:
|
||||||
xorriso -dev stdio:/dev/sdb ...more arguments...
|
xorriso -dev stdio:/tmp/pseudo_drive ...more arguments...
|
||||||
This rule may be changed by xorriso option -drive_class.
|
|
||||||
Prefix "mmc:" causes a path to be accepted only if it is a real optical drive.
|
|
||||||
|
|
||||||
|
|
||||||
Testing
|
Testing
|
||||||
@ -161,26 +147,6 @@ and vice versa:
|
|||||||
| less
|
| less
|
||||||
|
|
||||||
|
|
||||||
File Formats
|
|
||||||
|
|
||||||
Currently there is only one file format peculiar to xorriso : sector maps
|
|
||||||
which describe the valid and invalid blocks on a media or a disk copy of
|
|
||||||
a media. xorriso creates and reads these file with its option -check_media.
|
|
||||||
|
|
||||||
The file begins with 32 bytes of cleartext of which the last one is a
|
|
||||||
newline character. The first 25 say "xorriso sector bitmap v2 ", the
|
|
||||||
remaining six characters give the size of the info text as decimal number.
|
|
||||||
This number of bytes follows the first 32 and will not be interpreted
|
|
||||||
by xorriso. They are rather to inform a human reader about the media type
|
|
||||||
and its track layout.
|
|
||||||
After the info text there are two 4 byte signed integers, most significant
|
|
||||||
byte first. The first one, N, gives the number of bits in the following bitmap
|
|
||||||
and the second number S gives the number of 2 KiB blocks governed by a single
|
|
||||||
bit in the map. Then come the bits in form of 8-bit bytes.
|
|
||||||
Data block M is covered by bit B=M/S in the map, bit number B is stored in
|
|
||||||
byte B/8 as bit B%8. A valid readable data block has its bit set to 1.
|
|
||||||
|
|
||||||
|
|
||||||
libisoburn
|
libisoburn
|
||||||
|
|
||||||
xorriso is based on libisofs which does ISO 9600 filesystem aspects and on
|
xorriso is based on libisofs which does ISO 9600 filesystem aspects and on
|
||||||
@ -200,9 +166,9 @@ and a matching dynamically linked xorriso binary.
|
|||||||
This binary is leaner but depends on properly installed libraries of suitable
|
This binary is leaner but depends on properly installed libraries of suitable
|
||||||
revision.
|
revision.
|
||||||
|
|
||||||
Dynamic library and compile time header requirements for libisoburn-0.3.2 :
|
Dynamic library and compile time header requirements for libisoburn-0.2.2 :
|
||||||
- libburn.so.4 , version libburn-0.6.0 or higher
|
- libburn.so.4 , version libburn-0.5.0 or higher
|
||||||
- libisofs.so.6 , version libisofs-0.6.12 or higher
|
- libisofs.so.6 , version libisofs-0.6.6 or higher
|
||||||
libisoburn and xorriso will not start with libraries which are older than their
|
libisoburn and xorriso will not start with libraries which are older than their
|
||||||
headers seen at compile time. So compile in the oldest possible installation
|
headers seen at compile time. So compile in the oldest possible installation
|
||||||
setup unless you have reason to enforce a newer bug fix level.
|
setup unless you have reason to enforce a newer bug fix level.
|
||||||
@ -231,7 +197,7 @@ libburnia-project.org
|
|||||||
By Mario Danic <mario.danic@gmail.com>,
|
By Mario Danic <mario.danic@gmail.com>,
|
||||||
Vreixo Formoso <metalpain2002@yahoo.es>
|
Vreixo Formoso <metalpain2002@yahoo.es>
|
||||||
Thomas Schmitt <scdbackup@gmx.net>
|
Thomas Schmitt <scdbackup@gmx.net>
|
||||||
Copyright (C) 2006-2009 Mario Danic, Vreixo Formoso, Thomas Schmitt.
|
Copyright (C) 2006-2008 Mario Danic, Vreixo Formoso, Thomas Schmitt.
|
||||||
|
|
||||||
libburnia-project.org is inspired by and in other components still containing
|
libburnia-project.org is inspired by and in other components still containing
|
||||||
parts of old
|
parts of old
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
# compile_xorriso.sh
|
# compile_xorriso.sh
|
||||||
# Copyright 2005 - 2009 Thomas Schmitt, scdbackup@gmx.net, GPL
|
# Copyright 2005 - 2008 Thomas Schmitt, scdbackup@gmx.net, GPL
|
||||||
#
|
#
|
||||||
# Not intended for general use in production installations !
|
# Not intended for general use in production installations !
|
||||||
# Rather use: ./bootstrap ; ./configure ; make
|
# Rather use: ./bootstrap ; ./configure ; make
|
||||||
@ -22,8 +22,6 @@ do_strip=0
|
|||||||
static_opts=
|
static_opts=
|
||||||
warn_opts="-Wall"
|
warn_opts="-Wall"
|
||||||
nglibisofs=1
|
nglibisofs=1
|
||||||
def_libreadline="-DXorriso_with_readlinE"
|
|
||||||
link_libreadline="-lreadline"
|
|
||||||
|
|
||||||
for i in "$@"
|
for i in "$@"
|
||||||
do
|
do
|
||||||
@ -37,16 +35,11 @@ do
|
|||||||
elif test "$i" = "-g"
|
elif test "$i" = "-g"
|
||||||
then
|
then
|
||||||
debug_opts="-g -O0"
|
debug_opts="-g -O0"
|
||||||
elif test "$i" = "-no_libreadline"
|
|
||||||
then
|
|
||||||
def_libreadline=""
|
|
||||||
link_libreadline=""
|
|
||||||
elif test "$i" = "-help" -o "$i" = "--help" -o "$i" = "-h"
|
elif test "$i" = "-help" -o "$i" = "--help" -o "$i" = "-h"
|
||||||
then
|
then
|
||||||
echo \
|
echo \
|
||||||
"$xorr/compile_xorriso.sh : to be executed above top level directories"
|
"$xorr/compile_xorriso.sh : to be executed above top level directories"
|
||||||
echo "Options:"
|
echo "Options:"
|
||||||
echo " -no_libreadline do not compile for and link with libreadline."
|
|
||||||
echo " -do_diet produce capability reduced lean version."
|
echo " -do_diet produce capability reduced lean version."
|
||||||
echo " -do_strip apply program strip to compiled programs."
|
echo " -do_strip apply program strip to compiled programs."
|
||||||
echo " -g produce debuggable programm."
|
echo " -g produce debuggable programm."
|
||||||
@ -82,23 +75,21 @@ libisofs="$libisofs $isofs"/tree.o
|
|||||||
libisofs="$libisofs $isofs"/util.o
|
libisofs="$libisofs $isofs"/util.o
|
||||||
libisofs="$libisofs $isofs"/util_htable.o
|
libisofs="$libisofs $isofs"/util_htable.o
|
||||||
libisofs="$libisofs $isofs"/util_rbtree.o
|
libisofs="$libisofs $isofs"/util_rbtree.o
|
||||||
libisofs="$libisofs $isofs"/system_area.o
|
|
||||||
libisofs="$libisofs $isofs"/make_isohybrid_mbr.o
|
|
||||||
|
|
||||||
|
|
||||||
|
timestamp="$(date -u '+%Y.%m.%d.%H%M%S')"
|
||||||
echo "Version timestamp : $(sed -e 's/#define Xorriso_timestamP "//' -e 's/"$//' "$xorr"/xorriso_timestamp.h)"
|
echo "Version timestamp : $(sed -e 's/#define Xorriso_timestamP "//' -e 's/"$//' "$xorr"/xorriso_timestamp.h)"
|
||||||
|
echo "Build timestamp : $timestamp"
|
||||||
date -u '+#define Xorriso_build_timestamP "%Y.%m.%d.%H%M%S"' >"$xorr"/xorriso_buildstamp.h
|
|
||||||
echo "Build timestamp : $(sed -e 's/#define Xorriso_build_timestamP "//' -e 's/"$//' "$xorr"/xorriso_buildstamp.h)"
|
|
||||||
|
|
||||||
echo "compiling program $xorr/xorriso.c $static_opts $debug_opts $def_opts"
|
echo "compiling program $xorr/xorriso.c $static_opts $debug_opts $def_opts"
|
||||||
cc -I. -DXorriso_with_maiN $def_libreadline \
|
cc -I. -DXorriso_with_maiN -DXorriso_with_regeX -DXorriso_with_readlinE \
|
||||||
$warn_opts \
|
$warn_opts \
|
||||||
$static_opts \
|
$static_opts \
|
||||||
$debug_opts \
|
$debug_opts \
|
||||||
$def_opts \
|
$def_opts \
|
||||||
$largefile_opts \
|
$largefile_opts \
|
||||||
\
|
\
|
||||||
|
-DXorriso_build_timestamP='"'"$timestamp"'"' \
|
||||||
|
\
|
||||||
-o "$xorr"/xorriso \
|
-o "$xorr"/xorriso \
|
||||||
\
|
\
|
||||||
"$xorr"/xorriso.c \
|
"$xorr"/xorriso.c \
|
||||||
@ -139,7 +130,7 @@ cc -I. -DXorriso_with_maiN $def_libreadline \
|
|||||||
\
|
\
|
||||||
$libisofs \
|
$libisofs \
|
||||||
\
|
\
|
||||||
$link_libreadline \
|
-lreadline \
|
||||||
\
|
\
|
||||||
-lpthread
|
-lpthread
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
AC_INIT([xorriso], [0.3.2], [http://libburnia-project.org])
|
AC_INIT([xorriso], [0.2.2], [http://libburnia-project.org])
|
||||||
AC_PREREQ([2.50])
|
AC_PREREQ([2.50])
|
||||||
dnl AC_CONFIG_HEADER([config.h])
|
dnl AC_CONFIG_HEADER([config.h])
|
||||||
|
|
||||||
@ -8,7 +8,7 @@ AC_CANONICAL_TARGET
|
|||||||
AM_INIT_AUTOMAKE([subdir-objects])
|
AM_INIT_AUTOMAKE([subdir-objects])
|
||||||
|
|
||||||
BURN_MAJOR_VERSION=0
|
BURN_MAJOR_VERSION=0
|
||||||
BURN_MINOR_VERSION=6
|
BURN_MINOR_VERSION=5
|
||||||
BURN_MICRO_VERSION=1
|
BURN_MICRO_VERSION=1
|
||||||
AC_SUBST(BURN_MAJOR_VERSION)
|
AC_SUBST(BURN_MAJOR_VERSION)
|
||||||
AC_SUBST(BURN_MINOR_VERSION)
|
AC_SUBST(BURN_MINOR_VERSION)
|
||||||
@ -16,7 +16,7 @@ AC_SUBST(BURN_MICRO_VERSION)
|
|||||||
|
|
||||||
LIBISOFS_MAJOR_VERSION=0
|
LIBISOFS_MAJOR_VERSION=0
|
||||||
LIBISOFS_MINOR_VERSION=6
|
LIBISOFS_MINOR_VERSION=6
|
||||||
LIBISOFS_MICRO_VERSION=12
|
LIBISOFS_MICRO_VERSION=6
|
||||||
AC_SUBST(LIBISOFS_MAJOR_VERSION)
|
AC_SUBST(LIBISOFS_MAJOR_VERSION)
|
||||||
AC_SUBST(LIBISOFS_MINOR_VERSION)
|
AC_SUBST(LIBISOFS_MINOR_VERSION)
|
||||||
AC_SUBST(LIBISOFS_MICRO_VERSION)
|
AC_SUBST(LIBISOFS_MICRO_VERSION)
|
||||||
@ -95,20 +95,14 @@ else
|
|||||||
CFLAGS="$CFLAGS -DDEBUG"
|
CFLAGS="$CFLAGS -DDEBUG"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_ARG_ENABLE(libreadline,
|
|
||||||
[ --enable-libreadline Enable use of libreadline by xorriso, default=yes],
|
|
||||||
, enable_libreadline=yes)
|
|
||||||
if test x$enable_libreadline = xyes; then
|
|
||||||
dnl Check whether there is readline-devel and readline-runtime.
|
dnl Check whether there is readline-devel and readline-runtime.
|
||||||
dnl If not, erase this macro which would enable use of readline(),add_history()
|
dnl If not, erase this macro which would enable use of readline(),add_history()
|
||||||
READLINE_DEF="-DXorriso_with_readlinE"
|
READLINE_DEF="-DXorriso_with_readlinE"
|
||||||
dnl The empty yes case obviously causes -lreadline to be linked
|
dnl The empty yes case obviously causes -lreadline to be linked
|
||||||
AC_CHECK_HEADER(readline/readline.h, AC_CHECK_LIB(readline, readline, , READLINE_DEF= ), READLINE_DEF= )
|
AC_CHECK_HEADER(readline/readline.h, AC_CHECK_LIB(readline, readline, , READLINE_DEF= ), READLINE_DEF= )
|
||||||
dnl The X= in the yes case prevents that -lreadline gets linked twice
|
dnl The X= in the yes case prevents that -lreadline gets linked twice
|
||||||
AC_CHECK_HEADER(readline/history.h, AC_CHECK_LIB(readline, add_history, X= , READLINE_DEF= ), READLINE_DEF= )
|
AC_CHECK_HEADER(readline/history.h, AC_CHECK_LIB(readline, add_history, X= , READLINE_DEF= ), READLINE_DEF= )
|
||||||
else
|
|
||||||
READLINE_DEF=
|
|
||||||
fi
|
|
||||||
AC_SUBST(READLINE_DEF)
|
AC_SUBST(READLINE_DEF)
|
||||||
|
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ then
|
|||||||
-e 's/<b>Libburn drives:<\/b>/\ <BR><b>Libburn drives:<\/b>/' \
|
-e 's/<b>Libburn drives:<\/b>/\ <BR><b>Libburn drives:<\/b>/' \
|
||||||
-e 's/^-dev /\ \ -dev /' \
|
-e 's/^-dev /\ \ -dev /' \
|
||||||
-e 's/^-devices /\ \ -devices /' \
|
-e 's/^-devices /\ \ -devices /' \
|
||||||
-e 's/<b>Rock Ridge, POSIX, X\/Open, and El Torito:<\/b>/\ <BR><b>Rock Ridge, POSIX, X\/Open, and El Torito:<\/b>/' \
|
-e 's/<b>Rock Ridge, POSIX, X\/Open:<\/b>/\ <BR><b>Rock Ridge, POSIX, X\/Open:<\/b>/' \
|
||||||
-e 's/<b>Command processing:<\/b>/\ <BR><b>Command processing:<\/b>/' \
|
-e 's/<b>Command processing:<\/b>/\ <BR><b>Command processing:<\/b>/' \
|
||||||
-e 's/<b>Dialog, Readline, Result pager:<\/b>/\ <BR><b>Dialog, Readline, Result pager:<\/b>/' \
|
-e 's/<b>Dialog, Readline, Result pager:<\/b>/\ <BR><b>Dialog, Readline, Result pager:<\/b>/' \
|
||||||
-e 's/<b>Aquiring source and target drive:<\/b>/\ <BR><b>Aquiring source and target drive:<\/b><BR>\ <BR>/' \
|
-e 's/<b>Aquiring source and target drive:<\/b>/\ <BR><b>Aquiring source and target drive:<\/b><BR>\ <BR>/' \
|
||||||
@ -65,14 +65,11 @@ then
|
|||||||
-e 's/<b>Settings for result writing:<\/b>/\ <BR><b>Settings for result writing:<\/b><BR>\ <BR>/' \
|
-e 's/<b>Settings for result writing:<\/b>/\ <BR><b>Settings for result writing:<\/b><BR>\ <BR>/' \
|
||||||
-e 's/^706k = 706kB/\ \ 706k = 706kB/' \
|
-e 's/^706k = 706kB/\ \ 706k = 706kB/' \
|
||||||
-e 's/^5540k = 5540kB/\ \ 5540k = 5540kB/' \
|
-e 's/^5540k = 5540kB/\ \ 5540k = 5540kB/' \
|
||||||
-e 's/<b>Character sets:<\/b>/\ <BR><b>Character sets:<\/b><BR>\ <BR>/' \
|
|
||||||
-e 's/<b>Exception processing:<\/b>/\ <BR><b>Exception processing:<\/b><BR>\ <BR>/' \
|
-e 's/<b>Exception processing:<\/b>/\ <BR><b>Exception processing:<\/b><BR>\ <BR>/' \
|
||||||
-e 's/<b>El Torito bootable ISO images:<\/b>/\ <BR><b>El Torito bootable ISO images:<\/b><BR>\ <BR>/' \
|
|
||||||
-e 's/<b>Dialog mode control:<\/b>/\ <BR><b>Dialog mode control:<\/b><BR>\ <BR>/' \
|
-e 's/<b>Dialog mode control:<\/b>/\ <BR><b>Dialog mode control:<\/b><BR>\ <BR>/' \
|
||||||
-e 's/<b>Drive and media related inquiry actions:<\/b>/\ <BR><b>Drive and media related inquiry actions:<\/b><BR>\ <BR>/' \
|
-e 's/<b>Drive and media related inquiry actions:<\/b>/\ <BR><b>Drive and media related inquiry actions:<\/b><BR>\ <BR>/' \
|
||||||
-e 's/<b>Navigation in ISO image/\ <BR><b>Navigation in ISO image/' \
|
-e 's/<b>Navigation in ISO image/\ <BR><b>Navigation in ISO image/' \
|
||||||
-e 's/^filesystem:<\/b>/filesystem:<\/b><BR>\ <BR>/' \
|
-e 's/^filesystem:<\/b>/filesystem:<\/b><BR>\ <BR>/' \
|
||||||
-e 's/<b>Evaluation of readability and recovery:<\/b>/\ <BR><b>Evaluation of readability and recovery:<\/b><BR>\ <BR>/' \
|
|
||||||
-e 's/<b>osirrox restore options:<\/b>/\ <BR><b>osirrox restore options:<\/b><BR>\ <BR>/' \
|
-e 's/<b>osirrox restore options:<\/b>/\ <BR><b>osirrox restore options:<\/b><BR>\ <BR>/' \
|
||||||
-e 's/<b>Command compatibility emulations:<\/b>/\ <BR><b>Command compatibility emulations:<\/b><BR>\ <BR>/' \
|
-e 's/<b>Command compatibility emulations:<\/b>/\ <BR><b>Command compatibility emulations:<\/b><BR>\ <BR>/' \
|
||||||
-e 's/^<p><b>−as</<p>\ <BR><b>\−as</' \
|
-e 's/^<p><b>−as</<p>\ <BR><b>\−as</' \
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
# make_xorriso_standalone.sh
|
# make_xorriso_standalone.sh
|
||||||
# Copyright 2008 - 2009 Thomas Schmitt, scdbackup@gmx.net, GPL
|
# Copyright 2008 Thomas Schmitt, scdbackup@gmx.net, GPL
|
||||||
#
|
#
|
||||||
# Not intended for general use in production installations !
|
# Not intended for general use in production installations !
|
||||||
#
|
#
|
||||||
@ -25,7 +25,7 @@
|
|||||||
current_dir=$(pwd)
|
current_dir=$(pwd)
|
||||||
lone_dir="$current_dir"/"xorriso-standalone"
|
lone_dir="$current_dir"/"xorriso-standalone"
|
||||||
|
|
||||||
xorriso_rev=0.3.2
|
xorriso_rev=0.2.2
|
||||||
# For unstable uploads:
|
# For unstable uploads:
|
||||||
# xorriso_pl=""
|
# xorriso_pl=""
|
||||||
# For stable releases:
|
# For stable releases:
|
||||||
|
File diff suppressed because it is too large
Load Diff
4669
xorriso/xorriso.c
4669
xorriso/xorriso.c
File diff suppressed because it is too large
Load Diff
@ -2,7 +2,7 @@
|
|||||||
/* Command line oriented batch and dialog tool which creates, loads,
|
/* Command line oriented batch and dialog tool which creates, loads,
|
||||||
manipulates and burns ISO 9660 filesystem images.
|
manipulates and burns ISO 9660 filesystem images.
|
||||||
|
|
||||||
Copyright 2007-2009 Thomas Schmitt, <scdbackup@gmx.net>
|
Copyright 2007-2008 Thomas Schmitt, <scdbackup@gmx.net>
|
||||||
|
|
||||||
Provided under GPL version 2.
|
Provided under GPL version 2.
|
||||||
|
|
||||||
@ -150,104 +150,6 @@ int Xorriso_process_msg_queues(struct XorrisO *xorriso, int flag);
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* The outlist stack allows to redirect the info and result messages from
|
|
||||||
their normal channels into a pair of string lists which can at some
|
|
||||||
later time be retrieved by the application.
|
|
||||||
These redirection caches can be stacked to allow stacked applications.
|
|
||||||
xorriso itself uses them for internal purposes.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* A list item able of forming double chained lists */
|
|
||||||
struct Xorriso_lsT;
|
|
||||||
|
|
||||||
/** Maximum number of stacked redirections */
|
|
||||||
#define Xorriso_max_outlist_stacK 32
|
|
||||||
|
|
||||||
/** Enable a new redirection of info and/or result channel. The normal message
|
|
||||||
output and eventual older redirections will not see new messages until
|
|
||||||
the redirection is ended by a call to Xorriso_pull_outlists() with the
|
|
||||||
stack_handle value returned by this call.
|
|
||||||
Redirected output is not written to the files of Xorriso_option_logfile()
|
|
||||||
and the Xorriso_option_pkt_output() protocol will not be applied.
|
|
||||||
@param xorriso The environment handle
|
|
||||||
@param stack_handle returns an id number which is unique as long as
|
|
||||||
its redirection is stacked. It may be re-used after
|
|
||||||
its redirection was pulled from the stack.
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
bit0= redirect result channel
|
|
||||||
bit1= redirect info channel
|
|
||||||
If bit0 and bit1 are 0, both channels get redirected.
|
|
||||||
@return 1 on success, <=0 if failure
|
|
||||||
*/
|
|
||||||
int Xorriso_push_outlists(struct XorrisO *xorriso, int *stack_handle,
|
|
||||||
int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/** Disable the redirection given by stack_handle. If it was the current
|
|
||||||
receiver of messages then switch output to the next older redirection
|
|
||||||
resp. to the normal channels if no redirections are stacked any more.
|
|
||||||
The messages collected by the disabled redirection are handed out as
|
|
||||||
two lists. Both lists have to be disposed via Xorriso_lst_destroy_all()
|
|
||||||
when they are no longer needed.
|
|
||||||
The message lists are either NULL or represented by their first
|
|
||||||
Xorriso_lsT item.
|
|
||||||
@param xorriso The environment handle
|
|
||||||
@param stack_handle The id number returned by Xorriso_push_outlists()
|
|
||||||
@param result_list Result and mark messages (usually directed to stdout)
|
|
||||||
@param info_list Info and mark messages (usually directed to stderr)
|
|
||||||
@param flag unused yet, submit 0
|
|
||||||
@return 1 on success, <=0 if failure
|
|
||||||
*/
|
|
||||||
int Xorriso_pull_outlists(struct XorrisO *xorriso, int stack_handle,
|
|
||||||
struct Xorriso_lsT **result_list,
|
|
||||||
struct Xorriso_lsT **info_list, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/** Obtain the text message from the current list item.
|
|
||||||
@param entry The current list item
|
|
||||||
@param flag unused yet, submit 0
|
|
||||||
@return Pointer to the text content of the list item.
|
|
||||||
This pointer does not have to be freed.
|
|
||||||
*/
|
|
||||||
char *Xorriso_lst_get_text(struct Xorriso_lsT *entry, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/** Obtain the address of the next item in the chain of messages.
|
|
||||||
An iteration over the output of Xorriso_pull_outlists() starts at the
|
|
||||||
returned result_list resp. info_list and ends when this function returns
|
|
||||||
NULL.
|
|
||||||
@param entry The current list item
|
|
||||||
@param flag unused yet, submit 0
|
|
||||||
@return Pointer to the next list item or NULL if end of list.
|
|
||||||
This pointer does not have to be freed.
|
|
||||||
*/
|
|
||||||
struct Xorriso_lsT *Xorriso_lst_get_next(struct Xorriso_lsT *entry, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/** Obtain the address of the previous item in the chain of messages.
|
|
||||||
@param entry The current list item
|
|
||||||
@param flag unused yet, submit 0
|
|
||||||
@return Pointer to the previous list item or NULL if start of list.
|
|
||||||
This pointer does not have to be freed.
|
|
||||||
*/
|
|
||||||
struct Xorriso_lsT *Xorriso_lst_get_prev(struct Xorriso_lsT *entry, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/** Destroy all list items which are directly or indirectly connected to
|
|
||||||
the given link item.
|
|
||||||
Apply this to each of the two list handles obtained by
|
|
||||||
Xorriso_pull_outlists() when the lists are no longer needed.
|
|
||||||
@param lstring *lstring will be freed and set to NULL.
|
|
||||||
It is not dangerous to submit a pointer to a NULL-pointer.
|
|
||||||
@param flag unused yet, submit 0
|
|
||||||
@return -1= lstring was NULL (i.e. wrong use of this call),
|
|
||||||
0= *lstring was already NULL,
|
|
||||||
1= item actually disposed
|
|
||||||
*/
|
|
||||||
int Xorriso_lst_destroy_all(struct Xorriso_lsT **lstring, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* ---------------------------- Options API ------------------------ */
|
/* ---------------------------- Options API ------------------------ */
|
||||||
/* See man 1 xorriso for explanation of the particular options */
|
/* See man 1 xorriso for explanation of the particular options */
|
||||||
/*
|
/*
|
||||||
@ -282,25 +184,6 @@ int Xorriso_option_alter_date(struct XorrisO *xorriso,
|
|||||||
char *time_type, char *timestring,
|
char *time_type, char *timestring,
|
||||||
int argc, char **argv, int *idx, int flag);
|
int argc, char **argv, int *idx, int flag);
|
||||||
|
|
||||||
/* Option -application_id */
|
|
||||||
int Xorriso_option_application_id(struct XorrisO *xorriso, char *name,
|
|
||||||
int flag);
|
|
||||||
|
|
||||||
/* Option -as */
|
|
||||||
/* @param flag bit0=do not report the added item
|
|
||||||
bit1=do not reset pacifier, no final pacifier message
|
|
||||||
*/
|
|
||||||
int Xorriso_option_as(struct XorrisO *xorriso, int argc, char **argv,
|
|
||||||
int *idx, int flag);
|
|
||||||
|
|
||||||
/* Option -assert_volid */
|
|
||||||
int Xorriso_option_assert_volid(struct XorrisO *xorriso, char *pattern,
|
|
||||||
char *severity, int flag);
|
|
||||||
|
|
||||||
/* Option -backslash_codes */
|
|
||||||
int Xorriso_option_backslash_codes(struct XorrisO *xorriso, char *mode,
|
|
||||||
int flag);
|
|
||||||
|
|
||||||
/* Option -ban_stdio_write */
|
/* Option -ban_stdio_write */
|
||||||
int Xorriso_option_ban_stdio_write(struct XorrisO *xorriso, int flag);
|
int Xorriso_option_ban_stdio_write(struct XorrisO *xorriso, int flag);
|
||||||
|
|
||||||
@ -320,20 +203,6 @@ int Xorriso_option_cdi(struct XorrisO *xorriso, char *iso_rr_path, int flag);
|
|||||||
/* Option -cdx */
|
/* Option -cdx */
|
||||||
int Xorriso_option_cdx(struct XorrisO *xorriso, char *disk_path, int flag);
|
int Xorriso_option_cdx(struct XorrisO *xorriso, char *disk_path, int flag);
|
||||||
|
|
||||||
/* Option -charset */
|
|
||||||
/* @param flag bit0= set in_charset
|
|
||||||
bit1= set out_charset
|
|
||||||
*/
|
|
||||||
int Xorriso_option_charset(struct XorrisO *xorriso, char *name, int flag);
|
|
||||||
|
|
||||||
/* Option -check_media */
|
|
||||||
int Xorriso_option_check_media(struct XorrisO *xorriso,
|
|
||||||
int argc, char **argv, int *idx, int flag);
|
|
||||||
|
|
||||||
/* Option -check_media_defaults */
|
|
||||||
int Xorriso_option_check_media_defaults(struct XorrisO *xorriso,
|
|
||||||
int argc, char **argv, int *idx, int flag);
|
|
||||||
|
|
||||||
/* Option -chgrp alias -chgrpi , chgrp_r alias chgrpi */
|
/* Option -chgrp alias -chgrpi , chgrp_r alias chgrpi */
|
||||||
/* @param flag bit0=recursive (-chgrp_r)
|
/* @param flag bit0=recursive (-chgrp_r)
|
||||||
*/
|
*/
|
||||||
@ -439,10 +308,6 @@ int Xorriso_option_error_behavior(struct XorrisO *xorriso,
|
|||||||
int Xorriso_option_extract(struct XorrisO *xorriso, char *disk_path,
|
int Xorriso_option_extract(struct XorrisO *xorriso, char *disk_path,
|
||||||
char *iso_path, int flag);
|
char *iso_path, int flag);
|
||||||
|
|
||||||
/* Option -extract_cut */
|
|
||||||
int Xorriso_option_extract_cut(struct XorrisO *xorriso, char *iso_rr_path,
|
|
||||||
char *start, char *count, char *disk_path, int flag);
|
|
||||||
|
|
||||||
/* Option -follow */
|
/* Option -follow */
|
||||||
int Xorriso_option_follow(struct XorrisO *xorriso, char *mode, int flag);
|
int Xorriso_option_follow(struct XorrisO *xorriso, char *mode, int flag);
|
||||||
|
|
||||||
@ -476,10 +341,6 @@ int Xorriso_option_iso_rr_pattern(struct XorrisO *xorriso, char *mode,
|
|||||||
/* Option -joliet "on"|"off" */
|
/* Option -joliet "on"|"off" */
|
||||||
int Xorriso_option_joliet(struct XorrisO *xorriso, char *mode, int flag);
|
int Xorriso_option_joliet(struct XorrisO *xorriso, char *mode, int flag);
|
||||||
|
|
||||||
/* Option -list_delimiter */
|
|
||||||
int Xorriso_option_list_delimiter(struct XorrisO *xorriso, char *text,
|
|
||||||
int flag);
|
|
||||||
|
|
||||||
/* Option -list_formats */
|
/* Option -list_formats */
|
||||||
int Xorriso_option_list_formats(struct XorrisO *xorriso, int flag);
|
int Xorriso_option_list_formats(struct XorrisO *xorriso, int flag);
|
||||||
|
|
||||||
@ -537,13 +398,6 @@ int Xorriso_option_mark(struct XorrisO *xorriso, char *mark, int flag);
|
|||||||
int Xorriso_option_mkdiri(struct XorrisO *xorriso, int argc, char **argv,
|
int Xorriso_option_mkdiri(struct XorrisO *xorriso, int argc, char **argv,
|
||||||
int *idx, int flag);
|
int *idx, int flag);
|
||||||
|
|
||||||
/* Option -mount */
|
|
||||||
/* @param bit0= print mount command to result channel rather than performing it
|
|
||||||
*/
|
|
||||||
int Xorriso_option_mount(struct XorrisO *xorriso, char *dev, char *adr_mode,
|
|
||||||
char *adr, char *cmd, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/* Option -mv alias -mvi */
|
/* Option -mv alias -mvi */
|
||||||
int Xorriso_option_mvi(struct XorrisO *xorriso, int argc, char **argv,
|
int Xorriso_option_mvi(struct XorrisO *xorriso, int argc, char **argv,
|
||||||
int *idx, int flag);
|
int *idx, int flag);
|
||||||
@ -554,15 +408,14 @@ int Xorriso_option_no_rc(struct XorrisO *xorriso, int flag);
|
|||||||
/* Option -not_leaf */
|
/* Option -not_leaf */
|
||||||
int Xorriso_option_not_leaf(struct XorrisO *xorriso, char *pattern, int flag);
|
int Xorriso_option_not_leaf(struct XorrisO *xorriso, char *pattern, int flag);
|
||||||
|
|
||||||
/* Option -not_list , -quoted_not_list */
|
/* Option -not_list */
|
||||||
/* @param flag bit0= -quoted_not_list */
|
|
||||||
int Xorriso_option_not_list(struct XorrisO *xorriso, char *adr, int flag);
|
int Xorriso_option_not_list(struct XorrisO *xorriso, char *adr, int flag);
|
||||||
|
|
||||||
/* Option -not_paths */
|
/* Option -not_paths */
|
||||||
int Xorriso_option_not_paths(struct XorrisO *xorriso, int argc, char **argv,
|
int Xorriso_option_not_paths(struct XorrisO *xorriso, int argc, char **argv,
|
||||||
int *idx, int flag);
|
int *idx, int flag);
|
||||||
|
|
||||||
/* Option -options_from_file */
|
/* Option -options_from_file*/
|
||||||
/* @return <=0 error , 1 = success , 3 = request to end program run */
|
/* @return <=0 error , 1 = success , 3 = request to end program run */
|
||||||
int Xorriso_option_options_from_file(struct XorrisO *xorriso, char *adr,
|
int Xorriso_option_options_from_file(struct XorrisO *xorriso, char *adr,
|
||||||
int flag);
|
int flag);
|
||||||
@ -586,8 +439,7 @@ int Xorriso_option_page(struct XorrisO *xorriso, int len, int width, int flag);
|
|||||||
int Xorriso_option_paste_in(struct XorrisO *xorriso, char *iso_rr_path,
|
int Xorriso_option_paste_in(struct XorrisO *xorriso, char *iso_rr_path,
|
||||||
char *disk_path, char *start, char *count, int flag);
|
char *disk_path, char *start, char *count, int flag);
|
||||||
|
|
||||||
/* Option -path_list , -quoted_path_list */
|
/* Option -path-list */
|
||||||
/* @param flag bit0= -quoted_path_list */
|
|
||||||
int Xorriso_option_path_list(struct XorrisO *xorriso, char *adr, int flag);
|
int Xorriso_option_path_list(struct XorrisO *xorriso, char *adr, int flag);
|
||||||
|
|
||||||
/* Option -pathspecs */
|
/* Option -pathspecs */
|
||||||
@ -622,10 +474,6 @@ int Xorriso_option_pwdx(struct XorrisO *xorriso, int flag);
|
|||||||
/* Option -reassure "on"|"tree"|"off" */
|
/* Option -reassure "on"|"tree"|"off" */
|
||||||
int Xorriso_option_reassure(struct XorrisO *xorriso, char *mode, int flag);
|
int Xorriso_option_reassure(struct XorrisO *xorriso, char *mode, int flag);
|
||||||
|
|
||||||
/* Option -relax_compliance */
|
|
||||||
int Xorriso_option_relax_compliance(struct XorrisO *xorriso, char *mode,
|
|
||||||
int flag);
|
|
||||||
|
|
||||||
/* Option -report_about */
|
/* Option -report_about */
|
||||||
int Xorriso_option_report_about(struct XorrisO *xorriso, char *severity,
|
int Xorriso_option_report_about(struct XorrisO *xorriso, char *severity,
|
||||||
int flag);
|
int flag);
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<HEAD>
|
<HEAD>
|
||||||
<META NAME="description" CONTENT="xorriso, creates, loads, manipulates and writes ISO 9660 filesystem images with Rock Ridge extensions">
|
<META NAME="description" CONTENT="xorriso, creates, loads, manipulates and writes ISO 9660 filesystem images with Rock Ridge extensions">
|
||||||
<META NAME="keywords" CONTENT="xorriso, libburn, libburnia, burn, CD, DVD, ISO, ISO 9660, RockRidge, Rock Ridge, Linux, FreeBSD, recording, burning, CD-R, CD-RW, DVD-R, DVD-RW, DVD+RW, DVD+R, DVD+R DL, BD-RE, BD-R, scdbackup">
|
<META NAME="keywords" CONTENT="xorriso, libburn, libburnia, burn, CD, DVD, ISO, ISO 9660, RockRidge, Rock Ridge, linux, recording, burning, CD-R, CD-RW, DVD-R, DVD-RW, DVD+RW, DVD+R, DVD+R DL, BD-RE, scdbackup">
|
||||||
<META NAME="robots" CONTENT="follow">
|
<META NAME="robots" CONTENT="follow">
|
||||||
<TITLE>xorriso homepage english</TITLE>
|
<TITLE>xorriso homepage english</TITLE>
|
||||||
</HEAD>
|
</HEAD>
|
||||||
@ -14,12 +14,12 @@
|
|||||||
<P><H2> Homepage of </H2>
|
<P><H2> Homepage of </H2>
|
||||||
<H1> xorriso </H1>
|
<H1> xorriso </H1>
|
||||||
|
|
||||||
<H2>ISO 9660 Rock Ridge Filesystem Manipulator for Linux and FreeBSD</H2>
|
<H2>ISO 9660 Rock Ridge Filesystem Manipulator for Linux</H2>
|
||||||
</CENTER>
|
</CENTER>
|
||||||
|
|
||||||
<P>
|
<P>
|
||||||
<H2>Purpose:</H2>
|
<H2>Purpose:</H2>
|
||||||
xorriso copies file objects from POSIX compliant filesystems
|
xorriso maps file objects from POSIX compliant filesystems
|
||||||
into Rock Ridge enhanced ISO 9660 filesystems and allows
|
into Rock Ridge enhanced ISO 9660 filesystems and allows
|
||||||
session-wise manipulation of such filesystems. It can load the management
|
session-wise manipulation of such filesystems. It can load the management
|
||||||
information of existing ISO images and it writes the session results to
|
information of existing ISO images and it writes the session results to
|
||||||
@ -48,8 +48,6 @@ and to MMC-5 for DVD or BD).
|
|||||||
<DT>Linux with kernel 2.4 or higher (and libc, of course) :</DT>
|
<DT>Linux with kernel 2.4 or higher (and libc, of course) :</DT>
|
||||||
<DD>With kernel 2.4 an ATA drive has to be under ide-scsi emulation.</DD>
|
<DD>With kernel 2.4 an ATA drive has to be under ide-scsi emulation.</DD>
|
||||||
<DD>With kernel 2.6 the drive should not be under ide-scsi.</DD>
|
<DD>With kernel 2.6 the drive should not be under ide-scsi.</DD>
|
||||||
<DT>or FreeBSD (with libc, of course) :</DT>
|
|
||||||
<DD>ATAPI/CAM support has to be enabled in the kernel, see atapicam(4).</DD>
|
|
||||||
<DT>libpthread</DT>
|
<DT>libpthread</DT>
|
||||||
<DD>is supposed to be a standard system component.</DD>
|
<DD>is supposed to be a standard system component.</DD>
|
||||||
<DT>libreadline and libreadline-dev</DT>
|
<DT>libreadline and libreadline-dev</DT>
|
||||||
@ -62,15 +60,15 @@ and to MMC-5 for DVD or BD).
|
|||||||
GPL software included:<BR>
|
GPL software included:<BR>
|
||||||
</H2>
|
</H2>
|
||||||
<DL>
|
<DL>
|
||||||
<DT>libburn-0.6.1</DT>
|
<DT>libburn-0.5.1</DT>
|
||||||
<DD>reads and writes data from and to CD, DVD, BD.</DD>
|
<DD>reads and writes data from and to CD, DVD, BD-RE.</DD>
|
||||||
<DD>(founded by Derek Foreman and Ben Jansens,
|
<DD>(founded by Derek Foreman and Ben Jansens,
|
||||||
developed and maintained since August 2006 by
|
furthered since August 2006 by
|
||||||
Thomas Schmitt from team of libburnia-project.org)</DD>
|
Thomas Schmitt from team of libburnia-project.org)</DD>
|
||||||
<DT>libisofs-0.6.12</DT>
|
<DT>libisofs-0.6.6</DT>
|
||||||
<DD>operates on ISO 9660 filesystem images.</DD>
|
<DD>operates on ISO 9660 filesystem images.</DD>
|
||||||
<DD>(By Vreixo Formoso and Mario Danic from team of libburnia-project.org)</DD>
|
<DD>(By Vreixo Formoso and Mario Danic from team of libburnia-project.org)</DD>
|
||||||
<DT>libisoburn-0.3.2</DT>
|
<DT>libisoburn-0.2.2</DT>
|
||||||
<DD>coordinates libburn and libisofs, emulates multi-session where needed.</DD>
|
<DD>coordinates libburn and libisofs, emulates multi-session where needed.</DD>
|
||||||
<DD>(By Vreixo Formoso and Thomas Schmitt
|
<DD>(By Vreixo Formoso and Thomas Schmitt
|
||||||
from team of libburnia-project.org)</DD>
|
from team of libburnia-project.org)</DD>
|
||||||
@ -81,8 +79,7 @@ cdrecord and mkisofs.</A>
|
|||||||
</P>
|
</P>
|
||||||
|
|
||||||
<P>
|
<P>
|
||||||
This program has been tested on Intel/AMD Linux
|
This program system has been tested on Intel/AMD Linux systems only.<BR>
|
||||||
and on FreeBSD systems.<BR>
|
|
||||||
For ports to other usable systems <A HREF="#contact">contact us</A>.
|
For ports to other usable systems <A HREF="#contact">contact us</A>.
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
@ -101,7 +98,10 @@ Operates on an existing ISO image or creates a new one.
|
|||||||
Copies files from filesystem into the ISO image.
|
Copies files from filesystem into the ISO image.
|
||||||
</LI>
|
</LI>
|
||||||
<LI>
|
<LI>
|
||||||
Changes file properties, renames or deletes file objects in the ISO image.
|
Renames or deletes file objects in the ISO image.
|
||||||
|
</LI>
|
||||||
|
<LI>
|
||||||
|
Changes file properties in the ISO image.
|
||||||
</LI>
|
</LI>
|
||||||
<LI>
|
<LI>
|
||||||
Updates ISO subtrees incrementally to match given disk subtrees.
|
Updates ISO subtrees incrementally to match given disk subtrees.
|
||||||
@ -111,21 +111,12 @@ Writes result as completely new image or as add-on session
|
|||||||
to optical media or filesystem objects.
|
to optical media or filesystem objects.
|
||||||
</LI>
|
</LI>
|
||||||
<LI>
|
<LI>
|
||||||
Can activate ISOLINUX boot images by El Torito boot record and by MBR.
|
|
||||||
</LI>
|
|
||||||
<LI>
|
|
||||||
Can perform multi-session tasks as emulation of mkisofs and cdrecord.
|
Can perform multi-session tasks as emulation of mkisofs and cdrecord.
|
||||||
</LI>
|
</LI>
|
||||||
<LI>
|
<LI>
|
||||||
Can restore single files and whole trees from ISO image to disk filesystem.
|
Can restore single files and whole trees from ISO image to disk filesystem.
|
||||||
</LI>
|
</LI>
|
||||||
<LI>
|
<LI>
|
||||||
Can issue commands to mount older sessions on Linux or FreeBSD.
|
|
||||||
</LI>
|
|
||||||
<LI>
|
|
||||||
Can check media for damages and copy readable blocks to disk.
|
|
||||||
</LI>
|
|
||||||
<LI>
|
|
||||||
Scans for optical drives, blanks re-useable optical media, formats media.
|
Scans for optical drives, blanks re-useable optical media, formats media.
|
||||||
</LI>
|
</LI>
|
||||||
<LI>
|
<LI>
|
||||||
@ -138,6 +129,9 @@ Reads its instructions from command line arguments, dialog, and batch files.
|
|||||||
<LI>
|
<LI>
|
||||||
Provides navigation commands for interactive ISO image manipulation.
|
Provides navigation commands for interactive ISO image manipulation.
|
||||||
</LI>
|
</LI>
|
||||||
|
<LI>
|
||||||
|
Adjustable thresholds for abort, exit value, and problem reporting.
|
||||||
|
</LI>
|
||||||
|
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
@ -145,14 +139,8 @@ Provides navigation commands for interactive ISO image manipulation.
|
|||||||
<P>
|
<P>
|
||||||
<H2>Command Examples:</H2>
|
<H2>Command Examples:</H2>
|
||||||
<DL>
|
<DL>
|
||||||
|
|
||||||
<DT>Get an overview of drives and their addresses</DT>
|
<DT>Get an overview of drives and their addresses</DT>
|
||||||
<DD>#<KBD> xorriso -devices</KBD></DD>
|
<DD>#<KBD> xorriso -devices</KBD></DD>
|
||||||
<DD><KBD>...</KBD></DD>
|
|
||||||
<DD><KBD>0 -dev '/dev/sr0' rwrw-- : 'TSSTcorp' 'CDDVDW SH-S203B'</KBD></DD>
|
|
||||||
<DD><KBD>1 -dev '/dev/scd1' rwrw-- : 'PHILIPS ' 'SPD3300L'</KBD></DD>
|
|
||||||
<DD><KBD>2 -dev '/dev/hda' rwrw-- : 'HL-DT-ST' 'DVD-ROM GDR8162B'</KBD></DD>
|
|
||||||
<DD><KBD>...</KBD></DD>
|
|
||||||
<DT>Being superuser avoids permission problems with /dev/srN resp. /dev/hdX .
|
<DT>Being superuser avoids permission problems with /dev/srN resp. /dev/hdX .
|
||||||
</DT>
|
</DT>
|
||||||
<DT>Ordinary users should then get granted rw access to the /dev files
|
<DT>Ordinary users should then get granted rw access to the /dev files
|
||||||
@ -181,7 +169,7 @@ eventually prepare yet unused BD-RE:</DT>
|
|||||||
<DD>$<KBD> xorriso -dev /dev/sr0 -add /home/me/sounds /home/me/pictures
|
<DD>$<KBD> xorriso -dev /dev/sr0 -add /home/me/sounds /home/me/pictures
|
||||||
</KBD></DD>
|
</KBD></DD>
|
||||||
|
|
||||||
<DT>Have a look at the result:</DT>
|
<DT>Check the result:</DT>
|
||||||
<DD>$<KBD> xorriso -indev /dev/sr0 -du / -- -toc 2>&1 | less</KBD></DD>
|
<DD>$<KBD> xorriso -indev /dev/sr0 -du / -- -toc 2>&1 | less</KBD></DD>
|
||||||
|
|
||||||
<DT>
|
<DT>
|
||||||
@ -264,19 +252,18 @@ already been done by a previous -commit.</DT>
|
|||||||
<HR>
|
<HR>
|
||||||
</DT>
|
</DT>
|
||||||
|
|
||||||
<DT>The following command performs incremental backup.
|
<DT>The following command can be run on blank media to create a
|
||||||
It can be run on blank media to create a copy of the mentioned disk
|
copy of the mentioned disk directory trees, and it can be run on appendable
|
||||||
directory trees, and it can be run on appendable media to perform a
|
media to perform a minimal set of change operations which update the
|
||||||
minimal set of change operations which update the old ISO copies
|
old ISO copies to match the new disk trees.
|
||||||
to match the new disk trees.
|
Older states can be retrieved by help of mount option "session=" from CD-R[W],
|
||||||
Older states can be retrieved by help of mount options like "sbsector="
|
by help of "sbsector=" from other media.
|
||||||
or by help of xorriso option -mount.
|
So this constitutes true incremental backup.
|
||||||
<BR>
|
<BR>
|
||||||
Only blank media or media with volume id "PROJECTS_MAIL_..." will be accepted.
|
The copies will be complete, except all file names ending
|
||||||
Files with names ending by ".o" or ".swp" are excluded by options -not_leaf.
|
with ".o" or ".swp" which are excluded by options -not_leaf.
|
||||||
</DT>
|
</DT>
|
||||||
<DD>$<KBD> xorriso -assert_volid 'PROJECTS_MAIL_*' FATAL \ \</KBD></DD>
|
<DD>$<KBD> xorriso -dev /dev/sr0 \</KBD></DD>
|
||||||
<DD><KBD> -dev /dev/sr0 \</KBD></DD>
|
|
||||||
<DD><KBD> -volid PROJECTS_MAIL_"$(date '+%Y_%m_%d_%H%M%S')" \</KBD></DD>
|
<DD><KBD> -volid PROJECTS_MAIL_"$(date '+%Y_%m_%d_%H%M%S')" \</KBD></DD>
|
||||||
<DD><KBD> -not_leaf '*.o' -not_leaf '*.swp' \</KBD></DD>
|
<DD><KBD> -not_leaf '*.o' -not_leaf '*.swp' \</KBD></DD>
|
||||||
<DD><KBD> -update_r /home/thomas/open_source_projects /open_source_projects \</KBD></DD>
|
<DD><KBD> -update_r /home/thomas/open_source_projects /open_source_projects \</KBD></DD>
|
||||||
@ -287,62 +274,6 @@ Files with names ending by ".o" or ".swp" are excluded by options -not_leaf.
|
|||||||
<HR>
|
<HR>
|
||||||
</DT>
|
</DT>
|
||||||
|
|
||||||
<DT>
|
|
||||||
Operating systems usually mount the most recent session on media.
|
|
||||||
xorriso can issue the appropriate mount commands for older sessions.
|
|
||||||
First get an overview of the sessions on disk:
|
|
||||||
</DT>
|
|
||||||
<DD>$<KBD> xorriso -outdev /dev/sr0 -toc</KBD></DD>
|
|
||||||
<PRE>
|
|
||||||
TOC layout : Idx , sbsector , Size , Volume Id
|
|
||||||
ISO session : 1 , 0 , 104719s , PROJECTS_MAIL_2008_08_10_231435
|
|
||||||
ISO session : 2 , 106928 , 6785s , PROJECTS_MAIL_2008_08_14_184548
|
|
||||||
...
|
|
||||||
ISO session : 76 , 820384 , 11035s , PROJECTS_MAIL_2009_01_04_191150
|
|
||||||
</PRE>
|
|
||||||
|
|
||||||
<DT>
|
|
||||||
Then become superuser and let xorriso mount the session of August 14, 2008
|
|
||||||
to directory /mnt:
|
|
||||||
</DT>
|
|
||||||
<DD>#<KBD> xorriso -mount /dev/sr0 volid '*_2008_08_14_*' /mnt </KBD></DD>
|
|
||||||
<DT>
|
|
||||||
To be later unmounted by: <KBD>umount /mnt</KBD>
|
|
||||||
</DT>
|
|
||||||
|
|
||||||
<DT>
|
|
||||||
<HR>
|
|
||||||
</DT>
|
|
||||||
|
|
||||||
<DT>
|
|
||||||
After the user has already created a suitable file tree on disk
|
|
||||||
and copied the ISOLINUX files into subdirectory ./boot/isolinux of
|
|
||||||
that tree, xorriso can burn an El Torito bootable media:
|
|
||||||
</DT>
|
|
||||||
<DD>$<KBD> xorriso -outdev /dev/sr0 -blank as_needed \</KBD></DD>
|
|
||||||
<DD><KBD> -map /home/me/ISOLINUX_prepared_tree / \</KBD></DD>
|
|
||||||
<DD><KBD> -boot_image isolinux dir=/boot/isolinux</KBD></DD>
|
|
||||||
<DT>
|
|
||||||
An additional MBR is generated if the file isolinux.bin is modern enough
|
|
||||||
(syslinux version 3.72) and ready for "isohybrid". An MBR enables booting
|
|
||||||
from hard disk or USB stick.
|
|
||||||
<HR>
|
|
||||||
</DT>
|
|
||||||
|
|
||||||
<DT>ISO images may not only be stored on optical media but also in
|
|
||||||
regular disk files or block devices for full multi-session operation.
|
|
||||||
</DT>
|
|
||||||
<DD>$<KBD> xorriso -dev /tmp/regular_file ...other.options...</DD>
|
|
||||||
<DT>
|
|
||||||
A default setting for safety reasons requires that files below /dev/
|
|
||||||
need prefix "stdio:" if they do not lead to MMC burner devices.
|
|
||||||
Be cautious not to overwrite your hard disk instead of your USB stick:
|
|
||||||
</DT>
|
|
||||||
<DD>$<KBD> xorriso -dev stdio:/dev/sdb ...other.options...</DD>
|
|
||||||
|
|
||||||
<DT>Other file types are suitable only for writing but not for reading:</DT>
|
|
||||||
<DD>$<KBD> xorriso -outdev /tmp/named_pipe ...other.options...</DD>
|
|
||||||
|
|
||||||
<DT>In batch mode it is possible to operate xorriso in a pipeline
|
<DT>In batch mode it is possible to operate xorriso in a pipeline
|
||||||
with an external consumer of the generated ISO image. Any message
|
with an external consumer of the generated ISO image. Any message
|
||||||
output will be redirected to stderr in this case.</DT>
|
output will be redirected to stderr in this case.</DT>
|
||||||
@ -370,17 +301,14 @@ One may switch from mkisofs emulation to xorriso's own command mode:
|
|||||||
<HR>
|
<HR>
|
||||||
</DT>
|
</DT>
|
||||||
|
|
||||||
<DT>If for any reason the reading operating system mishandles the ISO image
|
<DT>Enable reverse operation of xorriso and copy some files and a tree to disk:
|
||||||
or some files in it, one may enable reverse operation of xorriso and copy
|
|
||||||
files or trees to disk:
|
|
||||||
<DD>$<KBD> xorriso -indev /dev/sr0 \</KBD></DD>
|
<DD>$<KBD> xorriso -indev /dev/sr0 \</KBD></DD>
|
||||||
<DD><KBD> -osirrox on \</KBD></DD>
|
<DD><KBD> -osirrox on \</KBD></DD>
|
||||||
<DD><KBD> -cpx '/pictures/private/horses*/*buttercup*' \</KBD></DD>
|
<DD><KBD> -cpx /pictures/private/horses*/*buttercup* \</KBD></DD>
|
||||||
<DD><KBD> /home/her/buttercup_dir -- \</KBD>
|
<DD><KBD> /home/her/buttercup_dir -- \</KBD>
|
||||||
<DD><KBD> -extract /sounds /home/her/sounds_from_me</KBD></DD>
|
<DD><KBD> -extract /sounds /home/her/sounds_from_me</KBD></DD>
|
||||||
</DD>
|
</DD>
|
||||||
<DT>Consider to enter dialog mode and use commands like
|
|
||||||
<KBD>-cd , -du , -lsl , -find<KBD>.
|
|
||||||
<DT>
|
<DT>
|
||||||
<HR>
|
<HR>
|
||||||
</DT>
|
</DT>
|
||||||
@ -393,6 +321,10 @@ files or trees to disk:
|
|||||||
<DD>$<KBD> <A HREF="man_1_xorriso.html">man xorriso</A></KBD></DD>
|
<DD>$<KBD> <A HREF="man_1_xorriso.html">man xorriso</A></KBD></DD>
|
||||||
</DL>
|
</DL>
|
||||||
|
|
||||||
|
|
||||||
|
Testers wanted who are willing to risk some double layer DVD media or
|
||||||
|
are interested in using BD-R media.
|
||||||
|
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<HR>
|
<HR>
|
||||||
@ -400,8 +332,8 @@ files or trees to disk:
|
|||||||
<P>
|
<P>
|
||||||
<DL>
|
<DL>
|
||||||
<DT><H3>Download as source code (see README):</H3></DT>
|
<DT><H3>Download as source code (see README):</H3></DT>
|
||||||
<DD><A HREF="xorriso-0.3.2.pl00.tar.gz">xorriso-0.3.2.pl00.tar.gz</A>
|
<DD><A HREF="xorriso-0.2.2.pl00.tar.gz">xorriso-0.2.2.pl00.tar.gz</A>
|
||||||
(1100 KB).
|
(1020 KB).
|
||||||
</DD>
|
</DD>
|
||||||
</DL>
|
</DL>
|
||||||
</DD>
|
</DD>
|
||||||
@ -425,27 +357,31 @@ an <A HREF="http://www.opensource.org/">Open Source</A> approved license</DD>
|
|||||||
</P>
|
</P>
|
||||||
|
|
||||||
<HR>
|
<HR>
|
||||||
|
|
||||||
<P>
|
<P>
|
||||||
Bug fixes towards xorriso-0.3.0.pl00:
|
Bug fixes towards xorriso-0.2.0.pl00:
|
||||||
<UL>
|
<UL>
|
||||||
<LI>Options -extract and -extract_single were not disabled with -osirrox off
|
|
||||||
<!--
|
<LI>libburn could not access drives /dev/scdN without existing /dev/srN</LI>
|
||||||
<LI>- none -</LI>
|
|
||||||
-->
|
|
||||||
|
|
||||||
</UL>
|
</UL>
|
||||||
|
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<P>
|
<P>
|
||||||
Enhancements towards previous stable version xorriso-0.3.0.pl00:
|
Enhancements towards previous stable version xorriso-0.2.0.pl00:
|
||||||
<UL>
|
<UL>
|
||||||
<LI>New options -mount, -mount_cmd, -session_string</LI>
|
|
||||||
<LI>By using libburn-0.6.1: support for BD-R media</LI>
|
<LI>New option -grow_blindly</LI>
|
||||||
<LI>New -format modes by_size_ and fast_by_size_</LI>
|
<LI>Options -C and -M with -as mkisofs emulation</LI>
|
||||||
<LI>New option -assert_volid</LI>
|
<LI>Options with -as cdrecord emulation:<BR>
|
||||||
<LI>New option -drive_class for safety management of pseudo-drive access</LI>
|
-multi , -msinfo , --grow_overwriteable_iso , write_start_address= ,
|
||||||
|
-isosize , tsize=
|
||||||
|
</LI>
|
||||||
|
<LI>make install creates xorriso aliases as symbolic links:
|
||||||
|
osirrox, xorrisofs, xorrecord
|
||||||
|
</LI>
|
||||||
|
<LI>
|
||||||
|
Can serve growisofs if started as xorrisofs, genisofs, mkisofs, genisoimage
|
||||||
|
</LI>
|
||||||
|
|
||||||
</UL>
|
</UL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
@ -453,17 +389,15 @@ Enhancements towards previous stable version xorriso-0.3.0.pl00:
|
|||||||
|
|
||||||
<P>
|
<P>
|
||||||
<DL>
|
<DL>
|
||||||
<DT><H3>Development snapshot, version 0.3.3 :</H3></DT>
|
<DT><H3>Development snapshot, version 0.2.3 :</H3></DT>
|
||||||
<DD>Bug fixes towards xorriso-0.3.2.pl00:
|
<DD>Bug fixes towards xorriso-0.2.2.pl00:
|
||||||
<UL>
|
<UL>
|
||||||
|
|
||||||
</LI>
|
|
||||||
<LI>- none yet -</LI>
|
<LI>- none yet -</LI>
|
||||||
<!--
|
<!--
|
||||||
-->
|
-->
|
||||||
</UL>
|
</UL>
|
||||||
</DD>
|
</DD>
|
||||||
<DD>Enhancements towards stable version 0.3.2.pl00:
|
<DD>Enhancements towards stable version 0.2.2.pl00:
|
||||||
<UL>
|
<UL>
|
||||||
<LI>- none yet -</LI>
|
<LI>- none yet -</LI>
|
||||||
<!--
|
<!--
|
||||||
@ -471,9 +405,9 @@ Enhancements towards previous stable version xorriso-0.3.0.pl00:
|
|||||||
</UL>
|
</UL>
|
||||||
</DD>
|
</DD>
|
||||||
<DD> </DD>
|
<DD> </DD>
|
||||||
<DD><A HREF="README_xorriso_devel">README 0.3.3</A>
|
<DD><A HREF="README_xorriso_devel">README 0.2.3</A>
|
||||||
<DD><A HREF="xorriso_help_devel">xorriso_0.3.3 -help</A></DD>
|
<DD><A HREF="xorriso_help_devel">xorriso_0.2.3 -help</A></DD>
|
||||||
<DD><A HREF="man_1_xorriso_devel.html">man xorriso (as of 0.3.3)</A></DD>
|
<DD><A HREF="man_1_xorriso_devel.html">man xorriso (as of 0.2.3)</A></DD>
|
||||||
<DD> </DD>
|
<DD> </DD>
|
||||||
<DT>If you want to distribute development versions of xorriso, then use
|
<DT>If you want to distribute development versions of xorriso, then use
|
||||||
this tarball which produces static linking between xorriso and the
|
this tarball which produces static linking between xorriso and the
|
||||||
@ -483,8 +417,8 @@ libburnia libraries.
|
|||||||
installation see README)
|
installation see README)
|
||||||
</DD>
|
</DD>
|
||||||
<DD>
|
<DD>
|
||||||
<A HREF="xorriso-0.3.3.tar.gz">xorriso-0.3.3.tar.gz</A>
|
<A HREF="xorriso-0.2.3.tar.gz">xorriso-0.2.3.tar.gz</A>
|
||||||
(1100 KB).
|
(1020 KB).
|
||||||
</DD>
|
</DD>
|
||||||
<DT>A dynamically linked development version of xorriso can be obtained
|
<DT>A dynamically linked development version of xorriso can be obtained
|
||||||
from repositories of
|
from repositories of
|
||||||
|
@ -16,21 +16,19 @@ xorriso_xorriso_CPPFLAGS = -I./libburn -I./libisofs -I./libisoburn -I./xorriso
|
|||||||
|
|
||||||
# No readline in the vanilla version because the necessary headers
|
# No readline in the vanilla version because the necessary headers
|
||||||
# are in a separate readline-development package.
|
# are in a separate readline-development package.
|
||||||
xorriso_xorriso_CFLAGS = -DXorriso_standalonE -DXorriso_with_maiN $(READLINE_DEF)
|
xorriso_xorriso_CFLAGS = -DXorriso_standalonE -DXorriso_with_maiN -DXorriso_with_regeX $(READLINE_DEF)
|
||||||
|
|
||||||
xorriso_xorriso_LDADD = $(THREAD_LIBS)
|
xorriso_xorriso_LDADD = $(THREAD_LIBS)
|
||||||
|
|
||||||
|
|
||||||
# This looks quite ugly with make install: xorriso.c is compiled twice again
|
|
||||||
#
|
|
||||||
# Trying to create a build timestamp file
|
# Trying to create a build timestamp file
|
||||||
#
|
#
|
||||||
# BUILT_SOURCES = xorriso/xorriso_buildstamp.h
|
BUILT_SOURCES = xorriso/xorriso_buildstamp.h
|
||||||
# phony targets get rebuilt every time
|
# phony targets get rebuilt every time
|
||||||
# .PHONY: xorriso/xorriso_buildstamp.h
|
.PHONY: xorriso/xorriso_buildstamp.h
|
||||||
# xorriso/xorriso_buildstamp.h:
|
xorriso/xorriso_buildstamp.h:
|
||||||
# date -u '+#define Xorriso_build_timestamP "%Y.%m.%d.%H%M%S"' >xorriso/xorriso_buildstamp.h
|
date -u '+#define Xorriso_build_timestamP "%Y.%m.%d.%H%M%S"' >xorriso/xorriso_buildstamp.h
|
||||||
# cat xorriso/xorriso_buildstamp.h
|
cat xorriso/xorriso_buildstamp.h
|
||||||
|
|
||||||
|
|
||||||
xorriso_xorriso_SOURCES = \
|
xorriso_xorriso_SOURCES = \
|
||||||
@ -96,9 +94,6 @@ xorriso_xorriso_SOURCES = \
|
|||||||
libisofs/filter.h \
|
libisofs/filter.h \
|
||||||
libisofs/filter.c \
|
libisofs/filter.c \
|
||||||
libisofs/filters/xor_encrypt.c \
|
libisofs/filters/xor_encrypt.c \
|
||||||
libisofs/system_area.h \
|
|
||||||
libisofs/system_area.c \
|
|
||||||
libisofs/make_isohybrid_mbr.c \
|
|
||||||
\
|
\
|
||||||
libburn/async.c \
|
libburn/async.c \
|
||||||
libburn/async.h \
|
libburn/async.h \
|
||||||
@ -170,17 +165,18 @@ test_compare_file_SOURCES = test/compare_file.c
|
|||||||
# Install symbolic links to the xorriso binary
|
# Install symbolic links to the xorriso binary
|
||||||
#
|
#
|
||||||
install-exec-hook:
|
install-exec-hook:
|
||||||
if test -e "$(DESTDIR)$(bindir)"/xorrisofs ; then rm "$(DESTDIR)$(bindir)"/xorrisofs ; else echo ; fi
|
if test -e $(bindir)/xorrisofs ; then rm $(bindir)/xorrisofs ; else echo ; fi
|
||||||
ln -s xorriso "$(DESTDIR)$(bindir)"/xorrisofs
|
ln -s xorriso $(bindir)/xorrisofs
|
||||||
if test -e "$(DESTDIR)$(bindir)"/osirrox ; then rm "$(DESTDIR)$(bindir)"/osirrox ; else echo ; fi
|
if test -e $(bindir)/osirrox ; then rm $(bindir)/osirrox ; else echo ; fi
|
||||||
ln -s xorriso "$(DESTDIR)$(bindir)"/osirrox
|
ln -s xorriso $(bindir)/osirrox
|
||||||
if test -e "$(DESTDIR)$(bindir)"/xorrecord ; then rm "$(DESTDIR)$(bindir)"/xorrecord ; else echo ; fi
|
if test -e $(bindir)/xorrecord ; then rm $(bindir)/xorrecord ; else echo ; fi
|
||||||
ln -s xorriso "$(DESTDIR)$(bindir)"/xorrecord
|
ln -s xorriso $(bindir)/xorrecord
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Alternative to the disabled .PHONY above.
|
# <<< seems to be outperformed by the .PHONY above
|
||||||
# Trying to create a build timestamp file semi-manually: make buildstamped
|
|
||||||
|
# Trying to create a build timestamp file
|
||||||
#
|
#
|
||||||
buildstamp:
|
buildstamp:
|
||||||
date -u '+#define Xorriso_build_timestamP "%Y.%m.%d.%H%M%S"' >xorriso/xorriso_buildstamp.h
|
date -u '+#define Xorriso_build_timestamP "%Y.%m.%d.%H%M%S"' >xorriso/xorriso_buildstamp.h
|
||||||
@ -189,7 +185,17 @@ buildstamp:
|
|||||||
# For now make buildstamped has to be performed manually.
|
# For now make buildstamped has to be performed manually.
|
||||||
buildstamped: buildstamp
|
buildstamped: buildstamp
|
||||||
make
|
make
|
||||||
|
#
|
||||||
|
# Processing of the "all:" rule happens too late.
|
||||||
|
# How to create a dependency of xorriso.c on buildstamp ?
|
||||||
|
# Not working:
|
||||||
|
# Add xorriso_buildstamp.h to xorriso_xorriso_SOURCES and make it depend
|
||||||
|
# on buildstamp. It runs. But at quite random occasions.
|
||||||
|
# xorriso/xorriso_buildstamp.h: buildstamp
|
||||||
|
#
|
||||||
|
# all: buildstamp
|
||||||
|
|
||||||
|
# <<< seems to be outperformed by the .PHONY above
|
||||||
|
|
||||||
## ========================================================================= ##
|
## ========================================================================= ##
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
/* Command line oriented batch and dialog tool which creates, loads,
|
/* Command line oriented batch and dialog tool which creates, loads,
|
||||||
manipulates and burns ISO 9660 filesystem images.
|
manipulates and burns ISO 9660 filesystem images.
|
||||||
|
|
||||||
Copyright 2007-2009 Thomas Schmitt, <scdbackup@gmx.net>
|
Copyright 2007-2008 Thomas Schmitt, <scdbackup@gmx.net>
|
||||||
|
|
||||||
Provided under GPL version 2.
|
Provided under GPL version 2.
|
||||||
|
|
||||||
@ -18,7 +18,7 @@
|
|||||||
#ifndef Xorriso_private_includeD
|
#ifndef Xorriso_private_includeD
|
||||||
#define Xorriso_private_includeD yes
|
#define Xorriso_private_includeD yes
|
||||||
|
|
||||||
#define Xorriso_program_versioN "0.3.2"
|
#define Xorriso_program_versioN "0.2.2"
|
||||||
|
|
||||||
/** The source code release timestamp */
|
/** The source code release timestamp */
|
||||||
#include "xorriso_timestamp.h"
|
#include "xorriso_timestamp.h"
|
||||||
@ -34,19 +34,23 @@
|
|||||||
#define Xorriso_build_timestamP "-none-given-"
|
#define Xorriso_build_timestamP "-none-given-"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Because regex_t is mentioned in struct XorrisO */
|
||||||
|
#ifdef Xorriso_with_regeX
|
||||||
#include <regex.h>
|
#include <regex.h>
|
||||||
|
#endif /* Xorriso_with_regeX */
|
||||||
|
|
||||||
|
|
||||||
#define Smem_malloC malloc
|
#define Smem_malloC malloc
|
||||||
#define Smem_freE free
|
#define Smem_freE free
|
||||||
#define SfileadrL 4096
|
#define SfileadrL 4096
|
||||||
|
|
||||||
|
/* <<< ??? */
|
||||||
|
typedef int (*Cleanup_app_handler_T)();
|
||||||
|
|
||||||
struct LinkiteM; /* Trace of hops during symbolic link resolution */
|
struct LinkiteM; /* Trace of hops during symbolic link resolution */
|
||||||
struct ExclusionS; /* List of -not_* conditions */
|
struct ExclusionS; /* List of -not_* conditions */
|
||||||
struct PermiteM; /* Stack of temporarily altered access permissions */
|
struct PermiteM; /* Stack of temporarily altered access permissions */
|
||||||
struct SpotlisT; /* List of intervals with different read qualities */
|
|
||||||
struct CheckmediajoB; /* Parameters for Xorriso_check_media() */
|
|
||||||
struct SectorbitmaP; /* Distiniction between valid and invalid sectors */
|
|
||||||
|
|
||||||
|
|
||||||
/* maximum number of history lines to be reported with -status:long_history */
|
/* maximum number of history lines to be reported with -status:long_history */
|
||||||
@ -61,13 +65,6 @@ struct SectorbitmaP; /* Distiniction between valid and invalid sectors */
|
|||||||
#define Xorriso_rc_nuM 4
|
#define Xorriso_rc_nuM 4
|
||||||
|
|
||||||
|
|
||||||
/* Default setting for the size limit of single data files:
|
|
||||||
100 extents with 4 GB - 2 kB each = 400 GB - 200 kB
|
|
||||||
*/
|
|
||||||
#define Xorriso_default_file_size_limiT \
|
|
||||||
(((off_t) 400) * ((off_t) 1024*1024*1024) - (off_t) 204800)
|
|
||||||
|
|
||||||
|
|
||||||
struct XorrisO { /* the global context of xorriso */
|
struct XorrisO { /* the global context of xorriso */
|
||||||
|
|
||||||
int libs_are_started;
|
int libs_are_started;
|
||||||
@ -95,12 +92,9 @@ struct XorrisO { /* the global context of xorriso */
|
|||||||
int add_plainly;
|
int add_plainly;
|
||||||
off_t split_size;
|
off_t split_size;
|
||||||
|
|
||||||
char list_delimiter[81];
|
|
||||||
|
|
||||||
/* >>> put libisofs aspects here <<< */
|
/* >>> put libisofs aspects here <<< */
|
||||||
|
|
||||||
int do_joliet;
|
int do_joliet;
|
||||||
int relax_compliance; /* opaque bitfield to be set by xorrisoburn */
|
|
||||||
int do_follow_pattern;
|
int do_follow_pattern;
|
||||||
int do_follow_param;
|
int do_follow_param;
|
||||||
int do_follow_links;
|
int do_follow_links;
|
||||||
@ -120,11 +114,8 @@ struct XorrisO { /* the global context of xorriso */
|
|||||||
char volid[33];
|
char volid[33];
|
||||||
int volid_default;
|
int volid_default;
|
||||||
char loaded_volid[33];
|
char loaded_volid[33];
|
||||||
char assert_volid[SfileadrL];
|
|
||||||
char assert_volid_sev[80];
|
|
||||||
|
|
||||||
char publisher[129];
|
char publisher[129];
|
||||||
char application_id[129];
|
|
||||||
|
|
||||||
char session_logfile[SfileadrL];
|
char session_logfile[SfileadrL];
|
||||||
int session_lba;
|
int session_lba;
|
||||||
@ -132,14 +123,8 @@ struct XorrisO { /* the global context of xorriso */
|
|||||||
|
|
||||||
/* >>> put libburn/isoburn aspects here */
|
/* >>> put libburn/isoburn aspects here */
|
||||||
|
|
||||||
struct Xorriso_lsT *drive_blacklist;
|
|
||||||
struct Xorriso_lsT *drive_greylist;
|
|
||||||
struct Xorriso_lsT *drive_whitelist;
|
|
||||||
|
|
||||||
int toc_emulation_flag; /* bit0= bit3 for isoburn_drive_aquire()
|
int toc_emulation_flag; /* bit0= bit3 for isoburn_drive_aquire()
|
||||||
scan -ROM profiles for ISO sessions
|
scan -ROM profiles for ISO sessions
|
||||||
bit1= bit4 for isoburn_drive_aquire()
|
|
||||||
do not emulate TOC on overwriteable media
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int image_start_mode; /* From what address to load the ISO image
|
int image_start_mode; /* From what address to load the ISO image
|
||||||
@ -162,18 +147,12 @@ struct XorrisO { /* the global context of xorriso */
|
|||||||
char indev[SfileadrL];
|
char indev[SfileadrL];
|
||||||
void *in_drive_handle; /* interpreted only by xorrisoburn.c */
|
void *in_drive_handle; /* interpreted only by xorrisoburn.c */
|
||||||
void *in_volset_handle; /* interpreted only by xorrisoburn.c */
|
void *in_volset_handle; /* interpreted only by xorrisoburn.c */
|
||||||
char *in_charset; /* The charset to interpret the filename bytes */
|
|
||||||
|
|
||||||
int volset_change_pending; /* whether -commit would make sense */
|
int volset_change_pending; /* whether -commit would make sense */
|
||||||
int no_volset_present; /* set to 1 on first failure */
|
int no_volset_present; /* set to 1 on first failure */
|
||||||
|
|
||||||
struct CheckmediajoB *check_media_default;
|
|
||||||
struct SectorbitmaP *in_sector_map; /* eventual sector validity bitmap */
|
|
||||||
|
|
||||||
|
|
||||||
char outdev[SfileadrL];
|
char outdev[SfileadrL];
|
||||||
void *out_drive_handle; /* interpreted only by xorrisoburn.c */
|
void *out_drive_handle; /* interpreted only by xorrisoburn.c */
|
||||||
char *out_charset; /* The charset to produce the filename bytes for */
|
|
||||||
int dev_fd_1; /* The fd which substitutes for /dev/fd/1 and is
|
int dev_fd_1; /* The fd which substitutes for /dev/fd/1 and is
|
||||||
connected to externaly perveived stdout.
|
connected to externaly perveived stdout.
|
||||||
*/
|
*/
|
||||||
@ -189,28 +168,11 @@ struct XorrisO { /* the global context of xorriso */
|
|||||||
int speed; /* in libburn units : 1000 bytes/second , 0 = Max, -1 = Min */
|
int speed; /* in libburn units : 1000 bytes/second , 0 = Max, -1 = Min */
|
||||||
int fs; /* fifo size in 2048 byte chunks : at most 1 GB */
|
int fs; /* fifo size in 2048 byte chunks : at most 1 GB */
|
||||||
int padding; /* number of bytes to add after ISO 9660 image */
|
int padding; /* number of bytes to add after ISO 9660 image */
|
||||||
|
|
||||||
int alignment; /* if > 0 : image size alignment in 2048 byt blocks */
|
|
||||||
/* <<< not sure whether to keep this after libisofs will have
|
|
||||||
learned to pad up MBR images to full MB */
|
|
||||||
|
|
||||||
int do_stream_recording;
|
int do_stream_recording;
|
||||||
|
|
||||||
int keep_boot_image;
|
int keep_boot_image;
|
||||||
int patch_isolinux_image;
|
int patch_isolinux_image;
|
||||||
char boot_image_bin_path[SfileadrL];
|
|
||||||
int boot_image_emul; /* 0=no emulation
|
|
||||||
(1=emulation as hard disk)
|
|
||||||
(2=emulation as floppy)
|
|
||||||
*/
|
|
||||||
char boot_image_cat_path[SfileadrL];
|
|
||||||
off_t boot_image_load_size;
|
|
||||||
int boot_image_isohybrid; /* 0=off , 1=auto , 2=on , 3=force */
|
|
||||||
|
|
||||||
/* LBA of boot image after image loading */
|
|
||||||
int loaded_boot_bin_lba;
|
|
||||||
/* Path of the catalog node after image loading */
|
|
||||||
char loaded_boot_cat_path[SfileadrL];
|
|
||||||
|
|
||||||
/* XORRISO options */
|
/* XORRISO options */
|
||||||
int allow_graft_points;
|
int allow_graft_points;
|
||||||
@ -223,20 +185,8 @@ struct XorrisO { /* the global context of xorriso */
|
|||||||
of self-owned directories during restore
|
of self-owned directories during restore
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int dialog; /* 0=off , 1=single-line , 2=multi-line */
|
int dialog;
|
||||||
|
|
||||||
int bsl_interpretation;
|
|
||||||
/* whether to run input through Sfile_bsl_interpreter():
|
|
||||||
bit0-1= dialog and quoted file reading
|
|
||||||
0= no interpretation, leave unchanged
|
|
||||||
1= only inside double quotes
|
|
||||||
2= outside single quotes
|
|
||||||
3= everywhere
|
|
||||||
bit2-3= reserved as future expansion of bit0-1
|
|
||||||
bit4= interpretation within program start arguments
|
|
||||||
bit5= perform backslash encoding with results
|
|
||||||
bit6= perform backslash encoding with info texts
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Pattern matching facility. It still carries legacy from scdbackup/askme.c
|
/* Pattern matching facility. It still carries legacy from scdbackup/askme.c
|
||||||
but is fully functional for xorriso.
|
but is fully functional for xorriso.
|
||||||
@ -262,8 +212,6 @@ struct XorrisO { /* the global context of xorriso */
|
|||||||
|
|
||||||
int temp_mem_limit;
|
int temp_mem_limit;
|
||||||
|
|
||||||
off_t file_size_limit;
|
|
||||||
|
|
||||||
struct ExclusionS *disk_exclusions;
|
struct ExclusionS *disk_exclusions;
|
||||||
int disk_excl_mode; /* bit0= on (else off)
|
int disk_excl_mode; /* bit0= on (else off)
|
||||||
bit1= parameter too (else rekursion only)
|
bit1= parameter too (else rekursion only)
|
||||||
@ -278,17 +226,7 @@ struct XorrisO { /* the global context of xorriso */
|
|||||||
char mark_text[SfileadrL]; /* ( stdout+stderr, M: ) */
|
char mark_text[SfileadrL]; /* ( stdout+stderr, M: ) */
|
||||||
int packet_output;
|
int packet_output;
|
||||||
char logfile[4][SfileadrL];
|
char logfile[4][SfileadrL];
|
||||||
FILE *logfile_fp[4];
|
|
||||||
FILE *pktlog_fp;
|
|
||||||
struct Xorriso_lsT *result_msglists[Xorriso_max_outlist_stacK];
|
|
||||||
struct Xorriso_lsT *info_msglists[Xorriso_max_outlist_stacK];
|
|
||||||
int msglist_flags[Xorriso_max_outlist_stacK]; /* bit0= result is redirected
|
|
||||||
bit1= info is redirected
|
|
||||||
*/
|
|
||||||
int msglist_stackfill;
|
|
||||||
|
|
||||||
int status_history_max; /* for -status long_history */
|
int status_history_max; /* for -status long_history */
|
||||||
|
|
||||||
|
|
||||||
char report_about_text[20];
|
char report_about_text[20];
|
||||||
int report_about_severity;
|
int report_about_severity;
|
||||||
@ -303,7 +241,6 @@ struct XorrisO { /* the global context of xorriso */
|
|||||||
FILE *errfile_fp;
|
FILE *errfile_fp;
|
||||||
|
|
||||||
int img_read_error_mode; /* 0=best_effort , 1=failure , 2=fatal */
|
int img_read_error_mode; /* 0=best_effort , 1=failure , 2=fatal */
|
||||||
int extract_error_mode; /* 0=best_effort , 1=keep , 2=delete */
|
|
||||||
|
|
||||||
char return_with_text[20];
|
char return_with_text[20];
|
||||||
int return_with_severity;
|
int return_with_severity;
|
||||||
@ -312,8 +249,10 @@ struct XorrisO { /* the global context of xorriso */
|
|||||||
char eternal_problem_status_text[20];
|
char eternal_problem_status_text[20];
|
||||||
|
|
||||||
/* temporary search facilities */
|
/* temporary search facilities */
|
||||||
|
#ifdef Xorriso_with_regeX
|
||||||
regex_t *re;
|
regex_t *re;
|
||||||
regmatch_t match[1];
|
regmatch_t match[1];
|
||||||
|
#endif /* Xorriso_with_regeX */
|
||||||
char **re_constants;
|
char **re_constants;
|
||||||
int re_count;
|
int re_count;
|
||||||
int re_fill;
|
int re_fill;
|
||||||
@ -350,7 +289,7 @@ struct XorrisO { /* the global context of xorriso */
|
|||||||
struct PermiteM *perm_stack; /* Temporarily altered dir access permissions */
|
struct PermiteM *perm_stack; /* Temporarily altered dir access permissions */
|
||||||
|
|
||||||
/* result (stdout, R: ) */
|
/* result (stdout, R: ) */
|
||||||
char result_line[10*SfileadrL];
|
char result_line[5*SfileadrL];
|
||||||
int result_line_counter;
|
int result_line_counter;
|
||||||
int result_page_counter;
|
int result_page_counter;
|
||||||
int result_open_line_len;
|
int result_open_line_len;
|
||||||
@ -516,100 +455,6 @@ int Xorriso_auto_chmod(struct XorrisO *xorriso, char *disk_path, int flag);
|
|||||||
int Xorriso_protect_stdout(struct XorrisO *xorriso, int flag);
|
int Xorriso_protect_stdout(struct XorrisO *xorriso, int flag);
|
||||||
|
|
||||||
|
|
||||||
/* @param flag bit0= mark untested areas as valid
|
|
||||||
*/
|
|
||||||
int Xorriso_spotlist_to_sectormap(struct XorrisO *xorriso,
|
|
||||||
struct SpotlisT *spotlist,
|
|
||||||
int read_chunk,
|
|
||||||
struct SectorbitmaP **map,
|
|
||||||
int flag);
|
|
||||||
|
|
||||||
int Xorriso_toc_to_string(struct XorrisO *xorriso, char **toc_text, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/* @param flag bit0+1= what to aquire after giving up outdev
|
|
||||||
0=none, 1=indev, 2=outdev, 3=both
|
|
||||||
*/
|
|
||||||
int Xorriso_reaquire_outdev(struct XorrisO *xorriso, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
struct Xorriso_lsT {
|
|
||||||
char *text;
|
|
||||||
struct Xorriso_lsT *prev,*next;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Create a new list item with arbitrary byte content.
|
|
||||||
@param lstring The newly created object or NULL on failure
|
|
||||||
@param data An array of bytes to be copied into the new object
|
|
||||||
@param data_len Number of bytes to be copied
|
|
||||||
@param link Xorriso_lsT object to which the new object shall be linked
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
bit0= insert before link rather than after it
|
|
||||||
bit1= do not copy data (e.g. because *data is invalid)
|
|
||||||
@return <=0 error, 1 ok
|
|
||||||
*/
|
|
||||||
int Xorriso_lst_new_binary(struct Xorriso_lsT **lstring, char *data,
|
|
||||||
int data_len, struct Xorriso_lsT *link, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/** Create a new list item with a 0-terminated text as content.
|
|
||||||
@param lstring The newly created object or NULL on failure
|
|
||||||
@param text A 0-terminated array of bytes
|
|
||||||
@param link Xorriso_lsT object to which the new object shall be linked
|
|
||||||
@param flag Bitfield for control purposes
|
|
||||||
bit0= insert before link rather than after it
|
|
||||||
@return <=0 error, 1 ok
|
|
||||||
*/
|
|
||||||
int Xorriso_lst_new(struct Xorriso_lsT **lstring, char *text,
|
|
||||||
struct Xorriso_lsT *link, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/** Create a new list item at the end of a given list.
|
|
||||||
@param lstring Contains as input a pointer to a pointer to any existing
|
|
||||||
list item. As output this list item pointer will be
|
|
||||||
changed to the address of the new list item.
|
|
||||||
@param data An array of bytes to be copied into the new object
|
|
||||||
@param data_len Number of bytes to be copied
|
|
||||||
@param flag unused yet, submit 0
|
|
||||||
@return <=0 error, 1 ok
|
|
||||||
*/
|
|
||||||
int Xorriso_lst_append_binary(struct Xorriso_lsT **entry,
|
|
||||||
char *data, int data_len, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/** Destroy a single list item and connect its eventual list neighbors.
|
|
||||||
@param lstring pointer to the pointer to be freed and set to NULL
|
|
||||||
@param flag unused yet, submit 0
|
|
||||||
@return 0= *lstring was alredy NULL, 1= ok
|
|
||||||
*/
|
|
||||||
int Xorriso_lst_destroy(struct Xorriso_lsT **lstring, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/* Opens the -check_media data copy in for reading and writing
|
|
||||||
*/
|
|
||||||
int Xorriso_open_job_data_to(struct XorrisO *xorriso,
|
|
||||||
struct CheckmediajoB *job, int flag);
|
|
||||||
|
|
||||||
int Xorriso_no_findjob(struct XorrisO *xorriso, char *cmd, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
int Xorriso_make_mount_cmd(struct XorrisO *xorriso, char *cmd,
|
|
||||||
int lba, int track, int session, char *volid,
|
|
||||||
char *devadr, char result[SfileadrL], int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/* @param flag bit0= use env_path to find the desired program
|
|
||||||
*/
|
|
||||||
int Xorriso_execv(struct XorrisO *xorriso, char *cmd, char *env_path,
|
|
||||||
int *status, int flag);
|
|
||||||
|
|
||||||
int Xorriso_is_in_patternlist(struct XorrisO *xorriso,
|
|
||||||
struct Xorriso_lsT *patternlist, char *path, int flag);
|
|
||||||
|
|
||||||
char *Xorriso_get_pattern(struct XorrisO *xorriso,
|
|
||||||
struct Xorriso_lsT *patternlist, int index, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
int Sfile_str(char target[SfileadrL], char *source, int flag);
|
int Sfile_str(char target[SfileadrL], char *source, int flag);
|
||||||
|
|
||||||
double Sfile_microtime(int flag);
|
double Sfile_microtime(int flag);
|
||||||
@ -659,9 +504,6 @@ char *Ftypetxt(mode_t st_mode, int flag);
|
|||||||
*/
|
*/
|
||||||
char *Ftimetxt(time_t t, char timetext[40], int flag);
|
char *Ftimetxt(time_t t, char timetext[40], int flag);
|
||||||
|
|
||||||
int System_uname(char **sysname, char **release, char **version,
|
|
||||||
char **machine, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
struct DirseQ;
|
struct DirseQ;
|
||||||
|
|
||||||
@ -677,12 +519,6 @@ int Linkitem_reset_stack(struct LinkiteM **o, struct LinkiteM *to, int flag);
|
|||||||
|
|
||||||
struct FindjoB;
|
struct FindjoB;
|
||||||
|
|
||||||
|
|
||||||
int Findjob_new(struct FindjoB **o, char *start_path, int flag);
|
|
||||||
|
|
||||||
int Findjob_destroy(struct FindjoB **job, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/* @return 0=no match , 1=match , <0 = error
|
/* @return 0=no match , 1=match , <0 = error
|
||||||
*/
|
*/
|
||||||
int Findjob_test(struct FindjoB *job, char *name,
|
int Findjob_test(struct FindjoB *job, char *name,
|
||||||
@ -721,26 +557,8 @@ int Findjob_set_action_ad(struct FindjoB *o, int type, time_t date, int flag);
|
|||||||
|
|
||||||
int Findjob_set_start_path(struct FindjoB *o, char *start_path, int flag);
|
int Findjob_set_start_path(struct FindjoB *o, char *start_path, int flag);
|
||||||
|
|
||||||
int Findjob_set_action_found_path(struct FindjoB *o, int flag);
|
|
||||||
|
|
||||||
int Findjob_get_start_path(struct FindjoB *o, char **start_path, int flag);
|
int Findjob_get_start_path(struct FindjoB *o, char **start_path, int flag);
|
||||||
|
|
||||||
int Findjob_set_lba_range(struct FindjoB *o, int start_lba, int count,
|
|
||||||
int flag);
|
|
||||||
|
|
||||||
int Findjob_get_lba_damage_filter(struct FindjoB *o, int *start_lba,
|
|
||||||
int *end_lba, int *damage_filter, int flag);
|
|
||||||
|
|
||||||
int Findjob_get_commit_filter(struct FindjoB *o, int *commit_filter, int flag);
|
|
||||||
|
|
||||||
int Findjob_set_wanted_node(struct FindjoB *o, void *wanted_node, int flag);
|
|
||||||
|
|
||||||
int Findjob_get_wanted_node(struct FindjoB *o, void **wanted_node, int flag);
|
|
||||||
|
|
||||||
int Findjob_set_found_path(struct FindjoB *o, char *path, int flag);
|
|
||||||
|
|
||||||
int Findjob_get_found_path(struct FindjoB *o, char **path, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
struct SplitparT;
|
struct SplitparT;
|
||||||
|
|
||||||
@ -764,6 +582,33 @@ int Splitpart__compose(char *adr, int partno, int total_parts,
|
|||||||
|
|
||||||
int Splitparts_sort(struct SplitparT *o, int count, int flag);
|
int Splitparts_sort(struct SplitparT *o, int count, int flag);
|
||||||
|
|
||||||
|
struct LstrinG {
|
||||||
|
char *text;
|
||||||
|
struct LstrinG *prev,*next;
|
||||||
|
};
|
||||||
|
|
||||||
|
int Lstring_destroy(struct LstrinG **lstring, int flag);
|
||||||
|
|
||||||
|
int Lstring_destroy_all(struct LstrinG **lstring, int flag);
|
||||||
|
|
||||||
|
/*
|
||||||
|
@param flag Bitfield for control purposes
|
||||||
|
bit0= insert before link rather than after it
|
||||||
|
bit1= do not copy data (e.g. because *data is invalid)
|
||||||
|
*/
|
||||||
|
int Lstring_new_binary(struct LstrinG **lstring, char *data, int data_len,
|
||||||
|
struct LstrinG *link, int flag);
|
||||||
|
|
||||||
|
/*
|
||||||
|
@param flag Bitfield for control purposes
|
||||||
|
bit0= insert before link rather than after it
|
||||||
|
*/
|
||||||
|
int Lstring_new(struct LstrinG **lstring, char *text, struct LstrinG *link,
|
||||||
|
int flag);
|
||||||
|
|
||||||
|
int Lstring_append_binary(struct LstrinG **entry, char *data, int data_len,
|
||||||
|
int flag);
|
||||||
|
|
||||||
|
|
||||||
int Permstack_push(struct PermiteM **o, char *disk_path, struct stat *stbuf,
|
int Permstack_push(struct PermiteM **o, char *disk_path, struct stat *stbuf,
|
||||||
int flag);
|
int flag);
|
||||||
@ -772,69 +617,5 @@ int Permstack_pop(struct PermiteM **o, struct PermiteM *stopper,
|
|||||||
struct XorrisO *xorriso, int flag);
|
struct XorrisO *xorriso, int flag);
|
||||||
|
|
||||||
|
|
||||||
int Spotlist_new(struct SpotlisT **o, int flag);
|
|
||||||
|
|
||||||
int Spotlist_destroy(struct SpotlisT **o, int flag);
|
|
||||||
|
|
||||||
int Spotlist_add_item(struct SpotlisT *o, int start_lba, int blocks,
|
|
||||||
int quality, int flag);
|
|
||||||
|
|
||||||
int Spotlist_count(struct SpotlisT *o, int flag);
|
|
||||||
|
|
||||||
int Spotlist_block_count(struct SpotlisT *o, int flag);
|
|
||||||
|
|
||||||
int Spotlist_sector_size(struct SpotlisT *o, int read_chunk, int flag);
|
|
||||||
|
|
||||||
int Spotlist_get_item(struct SpotlisT *o, int idx,
|
|
||||||
int *start_lba, int *blocks, int *quality, int flag);
|
|
||||||
|
|
||||||
char *Spotlist__quality_name(int quality, char name[80], int flag);
|
|
||||||
|
|
||||||
|
|
||||||
#define Xorriso_read_quality_gooD 0x7fffffff
|
|
||||||
#define Xorriso_read_quality_sloW 0x60000000
|
|
||||||
#define Xorriso_read_quality_partiaL 0x50000000
|
|
||||||
#define Xorriso_read_quality_valiD 0x40000000
|
|
||||||
#define Xorriso_read_quality_untesteD 0x3fffffff
|
|
||||||
#define Xorriso_read_quality_invaliD 0x3ffffffe
|
|
||||||
#define Xorriso_read_quality_tao_enD 0x28000000
|
|
||||||
#define Xorriso_read_quality_off_tracK 0x20000000
|
|
||||||
#define Xorriso_read_quality_unreadablE 0x00000000
|
|
||||||
|
|
||||||
|
|
||||||
int Checkmediajob_new(struct CheckmediajoB **o, int flag);
|
|
||||||
|
|
||||||
int Checkmediajob_destroy(struct CheckmediajoB **o, int flag);
|
|
||||||
|
|
||||||
int Checkmediajob_copy(struct CheckmediajoB *from, struct CheckmediajoB *to,
|
|
||||||
int flag);
|
|
||||||
|
|
||||||
int Sectorbitmap_new(struct SectorbitmaP **o, int sectors, int sector_size,
|
|
||||||
int flag);
|
|
||||||
int Sectorbitmap_destroy(struct SectorbitmaP **o, int flag);
|
|
||||||
int Sectorbitmap_from_file(struct SectorbitmaP **o, char *path, char *msg,
|
|
||||||
int *os_errno, int flag);
|
|
||||||
int Sectorbitmap_to_file(struct SectorbitmaP *o, char *path, char *info,
|
|
||||||
char *msg, int *os_errno, int flag);
|
|
||||||
int Sectorbitmap_set(struct SectorbitmaP *o, int sector, int flag);
|
|
||||||
int Sectorbitmap_set_range(struct SectorbitmaP *o,
|
|
||||||
int start_sector, int sectors, int flag);
|
|
||||||
int Sectorbitmap_is_set(struct SectorbitmaP *o, int sector, int flag);
|
|
||||||
int Sectorbitmap_bytes_are_set(struct SectorbitmaP *o,
|
|
||||||
off_t start_byte, off_t end_byte, int flag);
|
|
||||||
|
|
||||||
int Sectorbitmap_get_layout(struct SectorbitmaP *o,
|
|
||||||
int *sectors, int *sector_size, int flag);
|
|
||||||
|
|
||||||
int Sectorbitmap_copy(struct SectorbitmaP *from, struct SectorbitmaP *to,
|
|
||||||
int flag);
|
|
||||||
|
|
||||||
/* bit0= append (text!=NULL) */
|
|
||||||
int Sregex_string(char **handle, char *text, int flag);
|
|
||||||
|
|
||||||
/* @param flag bit0= only test expression whether compilable
|
|
||||||
*/
|
|
||||||
int Sregex_match(char *pattern, char *text, int flag);
|
|
||||||
|
|
||||||
#endif /* Xorriso_private_includeD */
|
#endif /* Xorriso_private_includeD */
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
#define Xorriso_timestamP "2009.01.05.123001"
|
#define Xorriso_timestamP "2008.07.18.120001"
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -4,7 +4,7 @@
|
|||||||
a command line oriented batch and dialog tool which creates, loads,
|
a command line oriented batch and dialog tool which creates, loads,
|
||||||
manipulates and burns ISO 9660 filesystem images.
|
manipulates and burns ISO 9660 filesystem images.
|
||||||
|
|
||||||
Copyright 2007-2009 Thomas Schmitt, <scdbackup@gmx.net>
|
Copyright 2007-2008 Thomas Schmitt, <scdbackup@gmx.net>
|
||||||
|
|
||||||
Provided under GPL version 2.
|
Provided under GPL version 2.
|
||||||
|
|
||||||
@ -14,11 +14,13 @@
|
|||||||
#ifndef Xorrisoburn_includeD
|
#ifndef Xorrisoburn_includeD
|
||||||
#define Xorrisoburn_includeD yes
|
#define Xorrisoburn_includeD yes
|
||||||
|
|
||||||
|
struct XorrisO;
|
||||||
|
struct FindjoB;
|
||||||
|
|
||||||
/* The minimum version of libisoburn to be used with this version of xorriso
|
/* The minimum version of libisoburn to be used with this version of xorriso
|
||||||
*/
|
*/
|
||||||
#define xorriso_libisoburn_req_major 0
|
#define xorriso_libisoburn_req_major 0
|
||||||
#define xorriso_libisoburn_req_minor 3
|
#define xorriso_libisoburn_req_minor 2
|
||||||
#define xorriso_libisoburn_req_micro 2
|
#define xorriso_libisoburn_req_micro 2
|
||||||
|
|
||||||
int Xorriso_startup_libraries(struct XorrisO *xorriso, int flag);
|
int Xorriso_startup_libraries(struct XorrisO *xorriso, int flag);
|
||||||
@ -52,16 +54,9 @@ int Xorriso__text_to_sev(char *severity_name, int *severity_number,int flag);
|
|||||||
|
|
||||||
/* @param flag bit0=report about output drive
|
/* @param flag bit0=report about output drive
|
||||||
bit1=short report form
|
bit1=short report form
|
||||||
bit2=do not try to read ISO heads
|
|
||||||
bit3=report to info channel (else to result channel)
|
|
||||||
*/
|
*/
|
||||||
int Xorriso_toc(struct XorrisO *xorriso, int flag);
|
int Xorriso_toc(struct XorrisO *xorriso, int flag);
|
||||||
|
|
||||||
/* @param flag bit0= no output if no boot record was found
|
|
||||||
bit3= report to info channel (else to result channel)
|
|
||||||
*/
|
|
||||||
int Xorriso_show_boot_info(struct XorrisO *xorriso, int flag);
|
|
||||||
|
|
||||||
int Xorriso_show_devices(struct XorrisO *xorriso, int flag);
|
int Xorriso_show_devices(struct XorrisO *xorriso, int flag);
|
||||||
|
|
||||||
int Xorriso_tell_media_space(struct XorrisO *xorriso,
|
int Xorriso_tell_media_space(struct XorrisO *xorriso,
|
||||||
@ -74,14 +69,10 @@ int Xorriso_tell_media_space(struct XorrisO *xorriso,
|
|||||||
int Xorriso_blank_media(struct XorrisO *xorriso, int flag);
|
int Xorriso_blank_media(struct XorrisO *xorriso, int flag);
|
||||||
|
|
||||||
/* @param flag bit0= try to achieve faster formatting
|
/* @param flag bit0= try to achieve faster formatting
|
||||||
bit1= use parameter size (else use default size)
|
|
||||||
bit2= do not re-aquire drive
|
|
||||||
bit7= by_index mode:
|
|
||||||
bit8 to bit15 contain the index of the format to use.
|
|
||||||
@return 0=failure, did not touch media , -1=failure, altered media
|
@return 0=failure, did not touch media , -1=failure, altered media
|
||||||
1=success, altered media , 2=success, did not touch media
|
1=success, altered media , 2=success, did not touch media
|
||||||
*/
|
*/
|
||||||
int Xorriso_format_media(struct XorrisO *xorriso, off_t size, int flag);
|
int Xorriso_format_media(struct XorrisO *xorriso, int flag);
|
||||||
|
|
||||||
/* @return <=0 error, 1 success
|
/* @return <=0 error, 1 success
|
||||||
*/
|
*/
|
||||||
@ -211,15 +202,9 @@ int Xorriso_burn_track(struct XorrisO *xorriso, off_t write_start_address,
|
|||||||
int Xorriso_get_profile(struct XorrisO *xorriso, int *profile_number,
|
int Xorriso_get_profile(struct XorrisO *xorriso, int *profile_number,
|
||||||
char profile_name[80], int flag);
|
char profile_name[80], int flag);
|
||||||
|
|
||||||
#ifdef NIX
|
|
||||||
|
|
||||||
/* @param flag bit0= do not mark image as changed */
|
/* @param flag bit0= do not mark image as changed */
|
||||||
int Xorriso_set_publisher(struct XorrisO *xorriso, char *name, int flag);
|
int Xorriso_set_publisher(struct XorrisO *xorriso, char *name, int flag);
|
||||||
|
|
||||||
/* @param flag bit0= do not mark image as changed */
|
|
||||||
int Xorriso_set_application_id(struct XorrisO *xorriso, char *name, int flag);
|
|
||||||
|
|
||||||
#endif /* NIX */
|
|
||||||
|
|
||||||
/* @param flag bit0= node_pt is a valid ISO object handle, ignore pathname
|
/* @param flag bit0= node_pt is a valid ISO object handle, ignore pathname
|
||||||
*/
|
*/
|
||||||
@ -294,99 +279,6 @@ int Xorriso_libburn_adr(struct XorrisO *xorriso, char *address_string,
|
|||||||
*/
|
*/
|
||||||
int Xorriso_msinfo(struct XorrisO *xorriso, int *msc1, int *msc2, int flag);
|
int Xorriso_msinfo(struct XorrisO *xorriso, int *msc1, int *msc2, int flag);
|
||||||
|
|
||||||
/*
|
|
||||||
@param flag bit0= obtain iso_lba from indev
|
|
||||||
bit1= head_buffer already contains a valid head
|
|
||||||
bit2= issue message about success
|
|
||||||
bit3= check whether source blocks are banned by in_sector_map
|
|
||||||
*/
|
|
||||||
int Xorriso_update_iso_lba0(struct XorrisO *xorriso, int iso_lba, int isosize,
|
|
||||||
char *head_buffer, struct CheckmediajoB *job,
|
|
||||||
int flag);
|
|
||||||
|
|
||||||
int Xorriso_get_local_charset(struct XorrisO *xorriso, char **name, int flag);
|
|
||||||
|
|
||||||
int Xorriso_set_local_charset(struct XorrisO *xorriso, char *name, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct CheckmediajoB {
|
|
||||||
int use_dev; /* 0= use indev , 1= use outdev , 2= use sector map*/
|
|
||||||
|
|
||||||
int min_lba; /* if >=0 : begin checking at this address */
|
|
||||||
int max_lba; /* if >=0 : read up to this address, else use mode */
|
|
||||||
|
|
||||||
int min_block_size; /* >>> not yet implemented:
|
|
||||||
granularity desired by user
|
|
||||||
*/
|
|
||||||
int mode; /* 0= track by track
|
|
||||||
1= single sweep over libisoburn media capacity
|
|
||||||
>>> 2= single sweep over libburn media capacity
|
|
||||||
*/
|
|
||||||
time_t start_time;
|
|
||||||
int time_limit; /* Number of seconds after which to abort */
|
|
||||||
|
|
||||||
int item_limit; /* Maximum number of media check list items as result */
|
|
||||||
|
|
||||||
char abort_file_path[SfileadrL];
|
|
||||||
|
|
||||||
char data_to_path[SfileadrL];
|
|
||||||
int data_to_fd;
|
|
||||||
off_t data_to_offset; /* usually 0 with image copy, negative with file copy */
|
|
||||||
off_t data_to_limit; /* used with file copy */
|
|
||||||
int patch_lba0;
|
|
||||||
int patch_lba0_msc1;
|
|
||||||
|
|
||||||
char sector_map_path[SfileadrL];
|
|
||||||
struct SectorbitmaP *sector_map;
|
|
||||||
int map_with_volid; /* 0=add quick toc to map file,
|
|
||||||
1=read ISO heads for toc
|
|
||||||
*/
|
|
||||||
|
|
||||||
int retry; /* -1= only try full read_chunk, 1=retry with 2k blocks
|
|
||||||
0= retry with CD, full chunk else
|
|
||||||
*/
|
|
||||||
|
|
||||||
int report_mode; /* 0= print MCL items
|
|
||||||
1= print damaged files
|
|
||||||
*/
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
int Xorriso_check_media(struct XorrisO *xorriso, struct SpotlisT **spotlist,
|
|
||||||
struct CheckmediajoB *job, int flag);
|
|
||||||
|
|
||||||
int Xorriso_extract_cut(struct XorrisO *xorriso,
|
|
||||||
char *img_path, char *disk_path,
|
|
||||||
off_t img_offset, off_t bytes, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
int Xorriso_relax_compliance(struct XorrisO *xorriso, char *mode,
|
|
||||||
int flag);
|
|
||||||
|
|
||||||
/* @return 1=ok 2=ok, is default setting */
|
|
||||||
int Xorriso_get_relax_text(struct XorrisO *xorriso, char mode[1024],
|
|
||||||
int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
@param flag bit0= print mount command to result channel rather than
|
|
||||||
performing it
|
|
||||||
*/
|
|
||||||
int Xorriso_mount(struct XorrisO *xorriso, char *dev, int adr_mode,
|
|
||||||
char *adr_value, char *cmd, int flag);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int Xorriso_auto_driveadr(struct XorrisO *xorriso, char *adr, char *result,
|
|
||||||
int flag);
|
|
||||||
|
|
||||||
|
|
||||||
/* A pseudo file type for El-Torito bootsectors as in man 2 stat :
|
|
||||||
For now take the highest possible value.
|
|
||||||
*/
|
|
||||||
#define Xorriso_IFBOOT S_IFMT
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* Xorrisoburn_includeD */
|
#endif /* Xorrisoburn_includeD */
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user