Compare commits
250 Commits
ZeroFourTw
...
ZeroSixZer
Author | SHA1 | Date | |
---|---|---|---|
f8bec5d746 | |||
0be8414929 | |||
5ed122161b | |||
47aee12caf | |||
7b9088f8c9 | |||
5272cc0afb | |||
4b59808ee3 | |||
31782dc75b | |||
ac463ac7a4 | |||
66efb225eb | |||
f0a9a0e29a | |||
6f371778c6 | |||
e57f8bf8f3 | |||
10233adb87 | |||
6ab8ffc137 | |||
5e8c60713a | |||
ad1c2fa1b8 | |||
cfd39f3d96 | |||
f38e4ff854 | |||
67139de9be | |||
26ac86f78a | |||
dc57c2bbb9 | |||
32b7c33e10 | |||
bd82bf66e3 | |||
bf24ba81c5 | |||
c54b5bc6a2 | |||
5a6024a1cc | |||
ec1cb90cba | |||
eb5639b017 | |||
cf8f6cb888 | |||
d1c2ec7a5b | |||
b20313f6a0 | |||
21b484f644 | |||
b511fe46aa | |||
c9e6c44be3 | |||
ed3eede4aa | |||
58f1bb249c | |||
2cda559ed9 | |||
e5e52cdf09 | |||
8f5d65aeef | |||
5633c228b1 | |||
97e4d35595 | |||
2de7a761eb | |||
569905e456 | |||
ee606de555 | |||
fd87b1b070 | |||
8a4698bd58 | |||
371bbde3c2 | |||
1b1ccc8a18 | |||
50373321dd | |||
576af43c98 | |||
673906b084 | |||
1482eb02f1 | |||
b69f1c5b66 | |||
e82b7005ad | |||
1402341264 | |||
bcc6a38094 | |||
d3f770827f | |||
5ac178ddda | |||
050059a388 | |||
afcc57f2c0 | |||
f8130af94e | |||
2bb5d973c3 | |||
8097dd57ab | |||
585075af1b | |||
bf20ca5dfb | |||
99e498057f | |||
a2b20e3ca2 | |||
9bbcc3118c | |||
4479f2fec6 | |||
d62d617f82 | |||
b2d7283f51 | |||
30615ac752 | |||
d38bd09987 | |||
c4cf1ced64 | |||
853d71b947 | |||
a411150abe | |||
ab84ae81e6 | |||
121d40e38c | |||
10ef2e346f | |||
7aae77f2ac | |||
83e41ceabd | |||
8bf6e31379 | |||
dea7b75549 | |||
e2ed639fec | |||
f103206221 | |||
6f7fd7faed | |||
3aa64bf40d | |||
19b5a64a3a | |||
38d296423b | |||
83216597c2 | |||
5b369d3c52 | |||
f4b46cf499 | |||
1a18491b03 | |||
270fdd77f2 | |||
3076ce56fb | |||
932a7e84e1 | |||
dfd0466291 | |||
8a3b4e2207 | |||
ee4f766c27 | |||
9832edf4a1 | |||
4c91872b2a | |||
f75d454b6a | |||
7b0c712719 | |||
ae874e4d5b | |||
4f7a2556bd | |||
45c12f0844 | |||
d1855c8895 | |||
fd0f3467ad | |||
642a2bc48e | |||
006fb7078e | |||
2bd7307dfa | |||
cc0ddbeb10 | |||
a65aa4f804 | |||
6f63c6388c | |||
1afe1443be | |||
df5d4a2f90 | |||
8d7df2b2ff | |||
24bbe47f18 | |||
7878f1f039 | |||
1e4e51edfe | |||
2fc5bf7849 | |||
d5e640d788 | |||
576af9ea89 | |||
214d6e6741 | |||
0c655d438e | |||
f68f875a6c | |||
13c327e370 | |||
3f42df50a3 | |||
9e78c78e43 | |||
99e2df2208 | |||
04c6625024 | |||
f68ee78352 | |||
b76161a698 | |||
2eec5bf40a | |||
2d11c253e3 | |||
a2a778c72f | |||
78fc4007ba | |||
27ba46494d | |||
0aec43a06a | |||
5656343e94 | |||
a08a616676 | |||
62777e93aa | |||
f4507fca34 | |||
4374d984d1 | |||
6a9c99cbd8 | |||
eec4dd9915 | |||
7ae90cc334 | |||
38e16d9370 | |||
91e0b07080 | |||
fe63ef9481 | |||
3451559feb | |||
829c0404c3 | |||
b353d04204 | |||
c139b45c26 | |||
2ee8fa58d7 | |||
60454fbf63 | |||
ccb22c3ef3 | |||
b4d9c81fe8 | |||
50e5349d09 | |||
d348c6dac6 | |||
ffbcb13040 | |||
7d389e0889 | |||
e7bde25551 | |||
bd18a89bc2 | |||
f5c66d9e14 | |||
6ae505a0a2 | |||
425932eb68 | |||
3686509e91 | |||
9f9985f06f | |||
6950650a82 | |||
42cf661ef8 | |||
3a10093e3d | |||
f39b0be7d6 | |||
249190ede2 | |||
5a48f5542a | |||
25ba888769 | |||
581caf1007 | |||
320eadaf0b | |||
ab1336dc29 | |||
ea9cb3ab4b | |||
45277ed62b | |||
aebaca8b99 | |||
c7a6796ba7 | |||
f223373b0b | |||
2b9b7974f0 | |||
af39f58e71 | |||
6f5cb55568 | |||
2669117d84 | |||
192518f70b | |||
e9f9d03fac | |||
8666adfe70 | |||
2d00b2075b | |||
9e6c43ed0b | |||
59dec6ac9e | |||
783ad87750 | |||
74d9c0069b | |||
5f23abebf1 | |||
cc67c36003 | |||
f7e469528d | |||
7b653579a0 | |||
f95011d5e0 | |||
64d8349316 | |||
a93589ecba | |||
73e740f822 | |||
071a7c8279 | |||
4e52b191b6 | |||
b97e328da2 | |||
b5847a4633 | |||
87d263de34 | |||
5405e08b5c | |||
b3ea97f18c | |||
0e3dafe5e4 | |||
13746bfc58 | |||
e3610ee989 | |||
9444c7f1cb | |||
bafe16c3a3 | |||
dafcb1e56a | |||
7288680d48 | |||
a811361577 | |||
cf046f9533 | |||
259e00f8c8 | |||
e1b1e09d71 | |||
f99e2cc41a | |||
38a3059748 | |||
9766c28d4f | |||
7a5d8ca174 | |||
9f26cadda4 | |||
3adb23071f | |||
57da7013d3 | |||
35c760ba30 | |||
de4f98c03e | |||
4feba8b2df | |||
d9665979ab | |||
72ac8a4ab1 | |||
7a1f61afaa | |||
22e2d6d12d | |||
b2192ec4f7 | |||
5fde82ba76 | |||
18438856c8 | |||
b43d90d736 | |||
23e4f34482 | |||
a6b287db7d | |||
b638398a75 | |||
7b3bfed4d4 | |||
2bcb098612 | |||
8c49031f4b | |||
a5ba8cc3be | |||
e9f27e15a1 | |||
5f6bc35b3a |
12
COPYRIGHT
12
COPYRIGHT
@ -1,16 +1,16 @@
|
||||
Mario Danic <mario.danic@gmail.com>,
|
||||
Vreixo Formoso <metalpain2002@yahoo.es>
|
||||
Thomas Schmitt <scdbackup@gmx.net>
|
||||
libisoburn is Copyright (C) 2007-2009 Vreixo Formoso, Thomas Schmitt
|
||||
xorriso is Copyright (C) 2007-2009 Thomas Schmitt
|
||||
libisofs (if included) is Copyright (C) 2007-2009 Vreixo Formoso, Mario Danic
|
||||
libisoburn is Copyright (C) 2007-2010 Vreixo Formoso, Thomas Schmitt
|
||||
xorriso is Copyright (C) 2007-2010 Thomas Schmitt
|
||||
libisofs (if included) is Copyright (C) 2007-2010 Vreixo Formoso, Mario Danic
|
||||
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-2010 Mario Danic, Thomas Schmitt
|
||||
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License version 2 as
|
||||
published by the Free Software Foundation.
|
||||
it under the terms of the GNU General Public License version 2
|
||||
or later as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
|
94
Makefile.am
94
Makefile.am
@ -13,12 +13,65 @@ lib_LTLIBRARIES = libisoburn/libisoburn.la
|
||||
libisoburn_libisoburn_la_LDFLAGS = \
|
||||
-version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
|
||||
libisoburn_libisoburn_la_SOURCES = \
|
||||
libisoburn/isoburn.h \
|
||||
libisoburn/libisoburn.h \
|
||||
libisoburn/burn_wrap.c \
|
||||
libisoburn/data_source.c \
|
||||
libisoburn/isoburn.c \
|
||||
libisoburn/isoburn.h \
|
||||
libisoburn/isofs_wrap.c \
|
||||
libisoburn/libisoburn.h \
|
||||
\
|
||||
xorriso/xorriso.h \
|
||||
xorriso/xorriso_private.h \
|
||||
xorriso/sfile.h \
|
||||
xorriso/sfile.c \
|
||||
xorriso/aux_objects.h \
|
||||
xorriso/aux_objects.c \
|
||||
xorriso/findjob.h \
|
||||
xorriso/findjob.c \
|
||||
xorriso/check_media.h \
|
||||
xorriso/check_media.c \
|
||||
xorriso/misc_funct.h \
|
||||
xorriso/misc_funct.c \
|
||||
xorriso/text_io.h \
|
||||
xorriso/text_io.c \
|
||||
xorriso/match.h \
|
||||
xorriso/match.c \
|
||||
xorriso/emulators.h \
|
||||
xorriso/emulators.c \
|
||||
xorriso/disk_ops.h \
|
||||
xorriso/disk_ops.c \
|
||||
xorriso/cmp_update.h \
|
||||
xorriso/cmp_update.c \
|
||||
xorriso/parse_exec.h \
|
||||
xorriso/parse_exec.c \
|
||||
xorriso/opts_a_c.c \
|
||||
xorriso/opts_d_h.c \
|
||||
xorriso/opts_i_o.c \
|
||||
xorriso/opts_p_z.c \
|
||||
\
|
||||
xorriso/xorrisoburn.h \
|
||||
xorriso/base_obj.h \
|
||||
xorriso/base_obj.c \
|
||||
xorriso/lib_mgt.h \
|
||||
xorriso/lib_mgt.c \
|
||||
xorriso/sort_cmp.h \
|
||||
xorriso/sort_cmp.c \
|
||||
xorriso/drive_mgt.h \
|
||||
xorriso/drive_mgt.c \
|
||||
xorriso/iso_img.h \
|
||||
xorriso/iso_img.c \
|
||||
xorriso/iso_tree.h \
|
||||
xorriso/iso_tree.c \
|
||||
xorriso/iso_manip.h \
|
||||
xorriso/iso_manip.c \
|
||||
xorriso/write_run.h \
|
||||
xorriso/write_run.c \
|
||||
xorriso/read_run.h \
|
||||
xorriso/read_run.c \
|
||||
xorriso/filters.h \
|
||||
xorriso/filters.c \
|
||||
xorriso/xorriso_timestamp.h \
|
||||
xorriso/xorriso_buildstamp.h \
|
||||
version.h
|
||||
|
||||
libisoburn_libisoburn_la_LIBADD = \
|
||||
@ -26,7 +79,12 @@ libisoburn_libisoburn_la_LIBADD = \
|
||||
-lburn
|
||||
|
||||
libinclude_HEADERS = \
|
||||
libisoburn/libisoburn.h
|
||||
libisoburn/libisoburn.h \
|
||||
xorriso/xorriso.h
|
||||
|
||||
# libisoburn_libisoburn_la_CFLAGS = $(READLINE_DEF) $(LIBACL_DEF) $(XATTR_DEF) \
|
||||
# $(EXTF_DEF) $(EXTF_SUID_DEF) $(ZLIB_DEF) \
|
||||
# $(XORRISO_DVD_OBS_64K)
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
@ -50,21 +108,16 @@ bin_PROGRAMS = \
|
||||
# cat xorriso/xorriso_buildstamp.h
|
||||
|
||||
xorriso_xorriso_CPPFLAGS = -Ilibisoburn
|
||||
xorriso_xorriso_CFLAGS = -DXorriso_with_maiN \
|
||||
$(READLINE_DEF) $(LIBACL_DEF) $(XATTR_DEF) \
|
||||
$(EXTF_DEF) $(EXTF_SUID_DEF) $(ZLIB_DEF)
|
||||
# xorriso_xorriso_CFLAGS = $(READLINE_DEF) $(LIBACL_DEF) $(XATTR_DEF) \
|
||||
# $(EXTF_DEF) $(EXTF_SUID_DEF) $(ZLIB_DEF) \
|
||||
# $(XORRISO_DVD_OBS_64K)
|
||||
|
||||
xorriso_xorriso_LDADD = libisoburn/libisoburn.la -lisofs -lburn \
|
||||
$(THREAD_LIBS) $(LIBBURN_ARCH_LIBS)
|
||||
|
||||
xorriso_xorriso_SOURCES = \
|
||||
xorriso/xorriso.h \
|
||||
xorriso/xorriso_private.h \
|
||||
xorriso/xorriso.c \
|
||||
xorriso/xorrisoburn.h \
|
||||
xorriso/xorrisoburn.c \
|
||||
xorriso/xorriso_timestamp.h \
|
||||
xorriso/xorriso_buildstamp.h
|
||||
xorriso/xorriso_main.c
|
||||
|
||||
|
||||
# Install symbolic links to the xorriso binary
|
||||
@ -91,9 +144,10 @@ buildstamped: buildstamp
|
||||
|
||||
|
||||
|
||||
## Build test applications
|
||||
## Build companion applications
|
||||
noinst_PROGRAMS = \
|
||||
test/compare_file
|
||||
test/compare_file \
|
||||
xorriso/make_xorriso_1
|
||||
|
||||
# A program to compare two files in mirrored trees in mounted filesystems
|
||||
# To compare tree /media/dvd and /original/dir :
|
||||
@ -104,6 +158,12 @@ test_compare_file_CFLAGS =
|
||||
test_compare_file_LDADD =
|
||||
test_compare_file_SOURCES = test/compare_file.c
|
||||
|
||||
# Specialized converter from xorriso/xorriso.texi to xorriso/xorriso.1
|
||||
#
|
||||
xorriso_make_xorriso_1_CPPFLAGS =
|
||||
xorriso_make_xorriso_1_CFLAGS =
|
||||
xorriso_make_xorriso_1_LDADD =
|
||||
xorriso_make_xorriso_1_SOURCES = xorriso/make_xorriso_1.c
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
@ -158,6 +218,8 @@ nodist_pkgconfig_DATA = \
|
||||
|
||||
man_MANS = xorriso/xorriso.1
|
||||
|
||||
info_TEXINFOS = xorriso/xorriso.texi
|
||||
|
||||
EXTRA_DIST = \
|
||||
libisoburn-1.pc.in \
|
||||
version.h.in \
|
||||
@ -171,6 +233,8 @@ EXTRA_DIST = \
|
||||
INSTALL \
|
||||
xorriso/changelog.txt \
|
||||
xorriso/xorriso_buildstamp_none.h \
|
||||
xorriso/README \
|
||||
xorriso/README_gnu_xorriso \
|
||||
xorriso/make_docs.sh \
|
||||
$(man_MANS)
|
||||
|
||||
|
||||
|
86
README
86
README
@ -1,12 +1,12 @@
|
||||
------------------------------------------------------------------------------
|
||||
http:libburnia-project.org
|
||||
------------------------------------------------------------------------------
|
||||
libisoburn. By Vreixo Formoso <metalpain2002@yahoo.es>
|
||||
and Thomas Schmitt <scdbackup@gmx.net>
|
||||
libisoburn and xorriso. By Vreixo Formoso <metalpain2002@yahoo.es>
|
||||
and Thomas Schmitt <scdbackup@gmx.net>
|
||||
Integrated sub project of libburnia-project.org.
|
||||
http://files.libburnia-project.org/releases/libisoburn-0.4.0.pl00.tar.gz
|
||||
Copyright (C) 2006-2009 Vreixo Formoso, Thomas Schmitt.
|
||||
Provided under GPL version 2.
|
||||
http://files.libburnia-project.org/releases/libisoburn-0.6.0.pl00.tar.gz
|
||||
Copyright (C) 2006-2010 Vreixo Formoso, Thomas Schmitt.
|
||||
Provided under GPL version 2 or later.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
libisoburn is a frontend for libraries libburn and libisofs which enables
|
||||
@ -18,8 +18,13 @@ 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
|
||||
other CD layout which does not entirely consist of ISO-9660 sessions.
|
||||
|
||||
Currently it is fully supported on Linux with kernels >= 2.4 and on
|
||||
FreeBSD versions with ATAPI/CAM support enabled in the kernel, see atapicam(4).
|
||||
xorriso is an application of libisoburn, libisofs, and libburn, which reads
|
||||
commands from program arguments, files, stdin, or readline.
|
||||
Its features are also available via a C language API of libisoburn.
|
||||
|
||||
Currently they are fully supported on Linux with kernels >= 2.4,
|
||||
on FreeBSD with ATAPI/CAM support enabled in the kernel, see atapicam(4),
|
||||
and on OpenSolaris (tested with kernel 5.11).
|
||||
On other X/Open compliant systems libburn will only offer POSIX i/o with disk
|
||||
file objects, but no direct MMC operation on CD/DVD/BD drives.
|
||||
|
||||
@ -29,17 +34,17 @@ By using this software you agree to the disclaimer at the end of this text:
|
||||
|
||||
Compilation, First Glimpse, Installation
|
||||
|
||||
Dynamic library and compile time header requirements for libisoburn-0.4.0 :
|
||||
- libburn.so.4 , version libburn-0.6.4 or higher
|
||||
- libisofs.so.6 , version libisofs-0.6.20 or higher
|
||||
Dynamic library and compile time header requirements for libisoburn-0.6.0 :
|
||||
- libburn.so.4 , version libburn-0.8.4 or higher
|
||||
- libisofs.so.6 , version libisofs-0.6.34 or higher
|
||||
libisoburn and xorriso will not start with libraries which are older than their
|
||||
headers seen at compile time.
|
||||
|
||||
Obtain libisoburn-0.4.0.pl00.tar.gz, take it to a directory of your choice
|
||||
Obtain libisoburn-0.6.0.pl00.tar.gz, take it to a directory of your choice
|
||||
and do:
|
||||
|
||||
tar xzf libisoburn-0.4.0.pl00.tar.gz
|
||||
cd libisoburn-0.4.0
|
||||
tar xzf libisoburn-0.6.0.pl00.tar.gz
|
||||
cd libisoburn-0.6.0
|
||||
|
||||
Within that directory execute:
|
||||
|
||||
@ -61,8 +66,9 @@ as well as
|
||||
|
||||
libisoburn comes with a command line and dialog application named xorriso,
|
||||
which offers a substantial part of libisoburn features to shell scripts and
|
||||
users. Its file xorriso/README describes a standalone tarball as first
|
||||
preference for statically linked xorriso installation.
|
||||
users. Its file xorriso/README_gnu_xorriso describes the tarball of the
|
||||
derived package GNU xorriso as first preference for a statically linked
|
||||
xorriso installation.
|
||||
The libisoburn installation described above produces a dynamically linked
|
||||
xorriso binary depending on libburn.so, libisofs.so, libisoburn.so.
|
||||
|
||||
@ -91,13 +97,43 @@ By default the filter feature is disabled if effective user id and real
|
||||
user id differ. This ban can be lifted by
|
||||
--enable-external-filters-setuid
|
||||
|
||||
In some situations Linux may deliver a better write performance to DVD drives
|
||||
if 64 KB rather than 32 KB are transmitted in each write operation.
|
||||
64k can be made default at configure time by:
|
||||
--enable-dvd-obs-64k
|
||||
|
||||
|
||||
xorriso C language API
|
||||
|
||||
Actually the dynamically linked xorriso binary is only a small start program
|
||||
for the xorriso API that is implemented inside libisoburn.
|
||||
There are API calls for command readers and interpreters, and there are
|
||||
API calls for each single command of xorriso.
|
||||
|
||||
Interested programmers should have a look into the API definition at
|
||||
xorriso/xorriso.h
|
||||
and the start program
|
||||
xorriso/xorriso_main.c
|
||||
|
||||
The header file xorriso.h gets installed suitable for
|
||||
#include <libisoburn/xorriso.h>
|
||||
|
||||
So after installation of a binary libisoburn package you may find it e.g. as
|
||||
/usr/local/include/libisoburn/xorriso.h
|
||||
|
||||
|
||||
Drives and Disk File Objects
|
||||
|
||||
The user of libisoburn applications needs rw-permission for the CD/DVD burner
|
||||
devices which shall be used.
|
||||
The user of libisoburn applications needs operating system dependent
|
||||
permissions for the CD/DVD/BD drives which shall be used.
|
||||
On Linux and FreeBSD this means -rw-permissions, even if only reading is
|
||||
intended. On Solaris one needs privileges "basic,sys_devices" and r-permission,
|
||||
even if writing is intended.
|
||||
|
||||
A list of rw-accessible drives can be obtained by
|
||||
xorriso -devices
|
||||
resp. by xorriso API call
|
||||
Xorriso_option_devices()
|
||||
resp. by libburn API call
|
||||
burn_drive_scan()
|
||||
|
||||
@ -129,7 +165,7 @@ test program which compares files from the mounted image with the orignals
|
||||
on disk. It uses the normal POSIX filesystem calls, i.e. no libburnia stuff.
|
||||
|
||||
This program is not installed systemwide but stays in the installation
|
||||
directory of the xorriso tarball as test/compare_file . Usually it is
|
||||
directory of the libisoburn tarball as test/compare_file . Usually it is
|
||||
run as -exec payload of a find command. It demands at least three arguments:
|
||||
The path of the file to compare, the prefix1 to be cut off from path
|
||||
and the prefix2 which gets prepended afterwards to obtain the path of the
|
||||
@ -153,8 +189,8 @@ and vice versa:
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License version 2 as
|
||||
published by the Free Software Foundation.
|
||||
it under the terms of the GNU General Public License version 2 or later
|
||||
as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
@ -171,11 +207,19 @@ libburnia-project.org
|
||||
By Mario Danic <mario.danic@gmail.com>,
|
||||
Vreixo Formoso <metalpain2002@yahoo.es>
|
||||
Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (C) 2006-2009 Mario Danic, Vreixo Formoso, Thomas Schmitt.
|
||||
Copyright (C) 2006-2010 Mario Danic, Vreixo Formoso, Thomas Schmitt.
|
||||
|
||||
We will not raise any legal protest to dynamic linking of our libraries
|
||||
with applications that are not under GPL, as long as they fulfill
|
||||
the condition of offering the library source code used, whether
|
||||
altered or unaltered, under the GPLv2+, along with the application.
|
||||
Nevertheless, the safest legal position is not to link libburn with
|
||||
non-GPL compatible programs.
|
||||
|
||||
libburnia-project.org is inspired by and in other components still containing
|
||||
parts of old
|
||||
Libburn. By Derek Foreman <derek@signalmarketing.com> and
|
||||
Ben Jansens <xor@orodu.net>
|
||||
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
|
||||
libisoburn does not stem from their code.
|
||||
|
||||
|
130
acinclude.m4
130
acinclude.m4
@ -1,3 +1,14 @@
|
||||
AC_DEFUN([LIBBURNIA_SET_FLAGS],
|
||||
[
|
||||
case $target_os in
|
||||
freebsd*)
|
||||
LDFLAGS="$LDFLAGS -L/usr/local/lib"
|
||||
CPPFLAGS="$CPPFLAGS -I/usr/local/include"
|
||||
;;
|
||||
esac
|
||||
])
|
||||
|
||||
|
||||
AC_DEFUN([TARGET_SHIZZLE],
|
||||
[
|
||||
ARCH=""
|
||||
@ -39,8 +50,9 @@ dnl From Bruno Haible.
|
||||
dnl
|
||||
AC_DEFUN([LIBBURNIA_CHECK_ICONV],
|
||||
[
|
||||
|
||||
dnl Check whether it is allowed to link with -liconv
|
||||
AC_MSG_CHECKING([for separate -liconv ])
|
||||
AC_MSG_CHECKING([for iconv() in separate -liconv ])
|
||||
libburnia_liconv="no"
|
||||
libburnia_save_LIBS="$LIBS"
|
||||
LIBS="$LIBS -liconv"
|
||||
@ -54,6 +66,13 @@ AC_DEFUN([LIBBURNIA_CHECK_ICONV],
|
||||
)
|
||||
AC_MSG_RESULT([$libburnia_liconv])
|
||||
|
||||
if test x"$libburnia_save_LIBS" = x"$LIBS"
|
||||
then
|
||||
dnl GNU iconv has no function iconv() but libiconv() and a macro iconv()
|
||||
dnl It is not tested whether this is detected by above macro.
|
||||
AC_CHECK_LIB(iconv, libiconv, , )
|
||||
fi
|
||||
|
||||
dnl Check for iconv(..., const char **inbuf, ...)
|
||||
AC_MSG_CHECKING([for const qualifier with iconv() ])
|
||||
AC_TRY_COMPILE([
|
||||
@ -62,13 +81,118 @@ AC_DEFUN([LIBBURNIA_CHECK_ICONV],
|
||||
size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
|
||||
], [], [libburnia_iconv_const=""], [libburnia_iconv_const="const"]
|
||||
)
|
||||
AC_DEFINE_UNQUOTED([ICONV_CONST], [$libburnia_iconv_const])
|
||||
if test x$libburnia_iconv_const = xconst
|
||||
then
|
||||
AC_DEFINE_UNQUOTED([ICONV_CONST], [const])
|
||||
else
|
||||
AC_DEFINE_UNQUOTED([ICONV_CONST], [])
|
||||
fi
|
||||
test -z "$libburnia_iconv_const" && libburnia_iconv_const="no"
|
||||
AC_MSG_RESULT([$libburnia_iconv_const])
|
||||
])
|
||||
|
||||
|
||||
dnl LIBBURNIA_SET_PKGCONFIG determines the install directory for the *.pc file.
|
||||
dnl LIBBURNIA_ASSERT_ICONV is by Thomas Schmitt, libburnia project
|
||||
dnl
|
||||
AC_DEFUN([LIBBURNIA_ASSERT_ICONV],
|
||||
[
|
||||
if test x$XORRISO_ASSUME_ICONV = x
|
||||
then
|
||||
dnl Check for the essential gestures of libisofs/util.c
|
||||
AC_MSG_CHECKING([for iconv() to be accessible now ])
|
||||
AC_TRY_LINK([
|
||||
#include <stdlib.h>
|
||||
#include <wchar.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <limits.h>
|
||||
#include <iconv.h>
|
||||
#include <locale.h>
|
||||
#include <langinfo.h>
|
||||
#include <unistd.h>],
|
||||
[iconv_t cd = iconv_open("","");
|
||||
iconv(cd,NULL,NULL,NULL,NULL);
|
||||
iconv_close(cd);
|
||||
], [iconv_test="yes"], [iconv_test="no"]
|
||||
)
|
||||
AC_MSG_RESULT([$iconv_test])
|
||||
if test x$iconv_test = xno
|
||||
then
|
||||
echo >&2
|
||||
echo "Cannot get function iconv() to work. Configuration aborted." >&2
|
||||
echo "Check whether your system needs a separate libiconv installed." >&2
|
||||
echo "If it is installed but not found, try something like" >&2
|
||||
echo ' export LDFLAGS="$LDFLAGS -L/usr/local/lib"' >&2
|
||||
echo ' export CPPFLAGS="$CPPFLAGS -I/usr/local/include"' >&2
|
||||
echo ' export LIBS="$LIBS -liconv"' >&2
|
||||
echo "You may override this test by exporting variable" >&2
|
||||
echo " XORRISO_ASSUME_ICONV=yes" >&2
|
||||
echo >&2
|
||||
(exit 1); exit 1;
|
||||
fi
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl LIBBURNIA_TRY_READLINE is by Thomas Schmitt, libburnia project
|
||||
dnl It performs the actual test compilation for readline.
|
||||
dnl Variable LIBS has to be set by the caller.
|
||||
AC_DEFUN([LIBBURNIA_TRY_READLINE],
|
||||
[
|
||||
AC_TRY_LINK([
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <readline/readline.h>
|
||||
#include <readline/history.h>],
|
||||
[HIST_ENTRY **hl;
|
||||
readline("");
|
||||
add_history("");
|
||||
hl= history_list();
|
||||
], [readline_test="yes"], [readline_test="no"]
|
||||
)
|
||||
])
|
||||
|
||||
|
||||
dnl LIBBURNIA_ASSERT_READLINE is by Thomas Schmitt, libburnia project
|
||||
dnl It disables xorriso readline if not all needed functions are present
|
||||
AC_DEFUN([LIBBURNIA_ASSERT_READLINE],
|
||||
[
|
||||
if test x$XORRISO_ASSUME_READLINE = x
|
||||
then
|
||||
dnl Check for the essential gestures of libisofs/util.c
|
||||
AC_MSG_CHECKING([for desired functions in libreadline])
|
||||
readline_msg=
|
||||
libburnia_save_LIBS="$LIBS"
|
||||
LIBS="$LIBS -lreadline"
|
||||
LIBBURNIA_TRY_READLINE
|
||||
if test x$readline_test = xno
|
||||
then
|
||||
LIBS="$libburnia_save_LIBS"
|
||||
LIBS="$LIBS -lreadline -lcurses"
|
||||
LIBBURNIA_TRY_READLINE
|
||||
if test x$readline_test = xyes
|
||||
then
|
||||
readline_msg=", with -lcurses"
|
||||
fi
|
||||
fi
|
||||
if test x$readline_test = xno
|
||||
then
|
||||
READLINE_DEF=
|
||||
LIBS="$libburnia_save_LIBS"
|
||||
fi
|
||||
AC_MSG_RESULT([$readline_test $readline_msg])
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl LIBBURNIA_SET_PKGCONFIG is by Thomas Schmitt, libburnia project
|
||||
dnl It determines the install directory for the *.pc file.
|
||||
dnl Important: Must be performed _after_ TARGET_SHIZZLE
|
||||
dnl
|
||||
AC_DEFUN([LIBBURNIA_SET_PKGCONFIG],
|
||||
|
114
configure.ac
114
configure.ac
@ -1,10 +1,12 @@
|
||||
AC_INIT([libisoburn], [0.4.1], [http://libburnia-project.org])
|
||||
AC_INIT([libisoburn], [0.6.0], [http://libburnia-project.org])
|
||||
AC_PREREQ([2.50])
|
||||
dnl AC_CONFIG_HEADER([config.h])
|
||||
|
||||
AC_CANONICAL_HOST
|
||||
AC_CANONICAL_TARGET
|
||||
|
||||
LIBBURNIA_SET_FLAGS
|
||||
|
||||
AM_INIT_AUTOMAKE([subdir-objects])
|
||||
|
||||
dnl Hint: Search list for version code aspects:
|
||||
@ -20,8 +22,8 @@ dnl LT_CURREN, LT_AGE, LT_REVISION where SONAME becomes LT_CURRENT - LT_AGE
|
||||
dnl
|
||||
dnl These three are only copies to provide libtool with unused LT_RELEASE
|
||||
ISOBURN_MAJOR_VERSION=0
|
||||
ISOBURN_MINOR_VERSION=4
|
||||
ISOBURN_MICRO_VERSION=1
|
||||
ISOBURN_MINOR_VERSION=6
|
||||
ISOBURN_MICRO_VERSION=0
|
||||
|
||||
dnl ISOBURN_VERSION=$ISOBURN_MAJOR_VERSION.$ISOBURN_MINOR_VERSION.$ISOBURN_MICRO_VERSION
|
||||
|
||||
@ -34,16 +36,16 @@ dnl Libtool versioning
|
||||
dnl Generate libisoburn.so.1.x.y
|
||||
dnl SONAME will become LT_CURRENT - LT_AGE
|
||||
dnl
|
||||
dnl ts A90628
|
||||
dnl ### This is the release version 0.4.0 = libisoburn.so.1.29.0
|
||||
dnl This is the development version after above stable release
|
||||
dnl LT_CURRENT++, LT_AGE++ have not happened happened yet.
|
||||
dnl ts B00702
|
||||
dnl This is the release version 0.6.0 = libisoburn.so.1.49.0
|
||||
dnl ### This is the development version after above stable release
|
||||
dnl LT_CURRENT++, LT_AGE++ have not happened yet.
|
||||
dnl ### LT_CURRENT++, LT_AGE++ has happened meanwhile.
|
||||
dnl
|
||||
dnl SONAME = 30 - 29 = 1 . Library name = libisoburn.so.1.29.0
|
||||
dnl SONAME = 50 - 49 = 1 . Library name = libisoburn.so.1.49.0
|
||||
LT_RELEASE=$ISOBURN_MAJOR_VERSION.$ISOBURN_MINOR_VERSION
|
||||
LT_CURRENT=30
|
||||
LT_AGE=29
|
||||
LT_CURRENT=50
|
||||
LT_AGE=49
|
||||
LT_REVISION=0
|
||||
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`
|
||||
|
||||
@ -71,11 +73,22 @@ if test ! $ac_cv_func_fseeko; then
|
||||
AC_ERROR([Libburn requires largefile support.])
|
||||
fi
|
||||
|
||||
if test x$LIBISOBURN_OLD_ICONV_CONFIGURE = x
|
||||
then
|
||||
|
||||
dnl ts B00410 : To detect the need for -liconv and const argument of iconv()
|
||||
LIBBURNIA_CHECK_ICONV
|
||||
|
||||
else
|
||||
|
||||
dnl Outdated: produces double -liconv and warnings about parameter mismatch
|
||||
dnl If iconv(3) is in an extra lib, then it gets added to variable LIBS.
|
||||
dnl If not, then no -liconv will be added.
|
||||
AC_CHECK_LIB(iconv, iconv, , )
|
||||
AC_CHECK_LIB(iconv, iconv, , )
|
||||
dnl GNU iconv has no function iconv() but libiconv() and a macro iconv()
|
||||
AC_CHECK_LIB(iconv, libiconv, , )
|
||||
AC_CHECK_LIB(iconv, libiconv, , )
|
||||
|
||||
fi
|
||||
|
||||
AC_PROG_LIBTOOL
|
||||
AC_SUBST(LIBTOOL_DEPS)
|
||||
@ -107,10 +120,19 @@ if test x$enable_libreadline = xyes; then
|
||||
dnl Check whether there is readline-devel and readline-runtime.
|
||||
dnl If not, erase this macro which would enable use of readline(),add_history()
|
||||
READLINE_DEF="-DXorriso_with_readlinE"
|
||||
|
||||
if test x$XORRISO_OLD_READLINE_CONFIGURE = x
|
||||
then
|
||||
|
||||
dnl ts B00411 : To disable readline if not all needed functions are present
|
||||
LIBBURNIA_ASSERT_READLINE
|
||||
|
||||
else
|
||||
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
|
||||
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= )
|
||||
fi
|
||||
else
|
||||
READLINE_DEF=
|
||||
fi
|
||||
@ -163,15 +185,36 @@ AC_ARG_ENABLE(zlib,
|
||||
if test x$enable_zlib = xyes; then
|
||||
dnl Check whether there is the header for zlib.
|
||||
dnl If not, erase this macro which would enable use of compress2() and others.
|
||||
dnl The empty parameter after "compress2" causes -lz.
|
||||
dnl Linking fails on SuSE 9.0 because zlib has compress2() but lacks
|
||||
dnl compressBound(). So compressBound is the more modern thing to test.
|
||||
dnl The empty parameter after "compressBound" causes -lz.
|
||||
ZLIB_DEF="-DLibisofs_with_zliB"
|
||||
AC_CHECK_HEADER(zlib.h, AC_CHECK_LIB(z, compress2, , ZLIB_DEF= ), ZLIB_DEF= )
|
||||
AC_CHECK_HEADER(zlib.h, AC_CHECK_LIB(z, compressBound, , ZLIB_DEF= ), ZLIB_DEF= )
|
||||
else
|
||||
ZLIB_DEF=
|
||||
fi
|
||||
AC_SUBST(ZLIB_DEF)
|
||||
|
||||
|
||||
dnl ts B00107
|
||||
dnl Just for the case that it is necessary to give link option -lcdio not only
|
||||
dnl with libburn but also with libburn apps like xorriso.
|
||||
dnl On SuSE 10.2 this is not needed. libburn finds libcdio on its own.
|
||||
AC_ARG_ENABLE(libcdio,
|
||||
[ --enable-libcdio Enable EXPERIMENTAL use of libcdio as system adapter, default=no],
|
||||
, enable_libcdio=no)
|
||||
if test x$enable_libcdio = xyes; then
|
||||
dnl Check whether there is libcdio-devel and libcdio-runtime.
|
||||
dnl If not, erase this macro
|
||||
LIBCDIO_DEF="-DLibburn_use_libcdiO"
|
||||
dnl The empty yes case obviously causes -lcdio to be linked
|
||||
AC_CHECK_HEADER(cdio/cdio.h, AC_CHECK_LIB(cdio, mmc_last_cmd_sense, , LIBCDIO_DEF= ), LIBCDIO_DEF= )
|
||||
else
|
||||
LIBCDIO_DEF=
|
||||
fi
|
||||
AC_SUBST(LIBCDIO_DEF)
|
||||
|
||||
|
||||
AC_ARG_ENABLE(external-filters,
|
||||
[ --enable-external-filters Enable use of external filter programs by xorriso, default=yes],
|
||||
, enable_external_filters=yes)
|
||||
@ -196,16 +239,49 @@ else
|
||||
fi
|
||||
AC_SUBST(EXTF_SUID_DEF)
|
||||
|
||||
AC_ARG_ENABLE(dvd-obs-64k,
|
||||
[ --enable-dvd-obs-64k 64 KB default size for xorriso DVD/BD writing, default=no],
|
||||
, enable_fifo_odirect=no)
|
||||
if test x$enable_dvd_obs_64k = xyes; then
|
||||
XORRISO_DVD_OBS_64K="-DXorriso_dvd_obs_default_64K"
|
||||
echo "enabled xorriso write size default 64 KB on DVD and BD"
|
||||
else
|
||||
XORRISO_DVD_OBS_64K=
|
||||
echo "disabled xorriso write size default 64 KB on DVD and BD"
|
||||
fi
|
||||
AC_SUBST(XORRISO_DVD_OBS_64K)
|
||||
|
||||
|
||||
AC_CHECK_HEADER(libburn/libburn.h)
|
||||
AC_CHECK_HEADER(libisofs/libisofs.h)
|
||||
|
||||
|
||||
# ------- Visible mark in configure : Start of library check
|
||||
|
||||
dnl Check for proper library versions
|
||||
LIBBURN_REQUIRED=0.7.0
|
||||
LIBISOFS_REQUIRED=0.6.22
|
||||
LIBBURN_REQUIRED=0.8.4
|
||||
LIBISOFS_REQUIRED=0.6.34
|
||||
PKG_CHECK_MODULES(LIBBURN, libburn-1 >= $LIBBURN_REQUIRED)
|
||||
PKG_CHECK_MODULES(LIBISOFS, libisofs-1 >= $LIBISOFS_REQUIRED)
|
||||
|
||||
# ------- Visible mark in configure : End of library check
|
||||
|
||||
|
||||
if test x$LIBCDIO_DEF = x
|
||||
then
|
||||
if test x$enable_libcdio = xyes
|
||||
then
|
||||
echo "WARNING: could not enable use of libcdio as system adapter"
|
||||
fi
|
||||
else
|
||||
echo "enabled EXPERIMENTAL use of libcdio as system adapter"
|
||||
|
||||
dnl For some reason this check may not be done earlier or else pkg-config
|
||||
dnl is not found.
|
||||
LIBCDIO_REQUIRED=0.83
|
||||
PKG_CHECK_MODULES(LIBCDIO, libcdio >= $LIBCDIO_REQUIRED)
|
||||
fi
|
||||
|
||||
dnl Add compiler-specific flags
|
||||
|
||||
dnl See if the user wants aggressive optimizations of the code
|
||||
@ -225,6 +301,8 @@ else
|
||||
CFLAGS="$CFLAGS -DDEBUG"
|
||||
fi
|
||||
|
||||
CFLAGS="$CFLAGS $READLINE_DEF $LIBACL_DEF $XATTR_DEF $EXTF_DEF $EXTF_SUID_DEF $ZLIB_DEF $XORRISO_DVD_OBS_64K"
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
doc/doxygen.conf
|
||||
|
@ -6,9 +6,14 @@
|
||||
*/
|
||||
/* libburn wrappers for libisoburn
|
||||
|
||||
Copyright 2007 - 2009 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
Copyright 2007 - 2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
/* <<< A70929 : hardcoded CD-RW with fabricated -msinfo
|
||||
#define Hardcoded_cd_rW 1
|
||||
#define Hardcoded_cd_rw_c1 12999
|
||||
@ -267,6 +272,7 @@ int isoburn_is_intermediate_dvd_rw(struct burn_drive *d, int flag)
|
||||
bit4= do not emulate TOC on overwriteable media
|
||||
bit5= ignore ACL from external filesystems
|
||||
bit6= ignore POSIX Extended Attributes from external filesystems
|
||||
bit7= pretend -ROM and scan for table of content
|
||||
*/
|
||||
static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
|
||||
int flag)
|
||||
@ -280,7 +286,9 @@ static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
|
||||
struct isoburn_toc_track **tracks;
|
||||
int num_sessions= 0, num_tracks= 0, track_count= 0, session_no= 0;
|
||||
char msg[80];
|
||||
enum burn_disc_status s;
|
||||
|
||||
s= burn_disc_get_status(d);
|
||||
profile_name[0]= 0;
|
||||
ret= burn_disc_get_profile(d, &profile, profile_name);
|
||||
if(ret<=0)
|
||||
@ -288,8 +296,11 @@ static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
|
||||
ret= burn_disc_get_multi_caps(d, BURN_WRITE_NONE, &caps, 0);
|
||||
if(ret<0) /* == 0 is read-only media, but it is too early to reject it here */
|
||||
goto ex;
|
||||
if(ret==0)
|
||||
if(ret==0 || (flag & 128))
|
||||
readonly= 1;
|
||||
if(flag & 128)
|
||||
flag = (flag & ~ 16) | 8;
|
||||
|
||||
ret= isoburn_new(o, 0);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
@ -305,8 +316,9 @@ static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
|
||||
(*o)->fabricated_disc_status= BURN_DISC_APPENDABLE;
|
||||
#endif
|
||||
|
||||
if(caps->start_adr) { /* set emulation to overwriteable */
|
||||
if(caps->start_adr)
|
||||
(*o)->emulation_mode= 1;
|
||||
if(caps->start_adr && !readonly) { /* set emulation to overwriteable */
|
||||
ret= isoburn_is_intermediate_dvd_rw(d, 0);
|
||||
if(ret>0) {
|
||||
(*o)->min_start_byte= 0;
|
||||
@ -333,7 +345,8 @@ static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
|
||||
|
||||
/* >>> recognize unsuitable media (but allow read-only media) */;
|
||||
|
||||
if(readonly) {
|
||||
if(readonly && s != BURN_DISC_EMPTY) {
|
||||
(*o)->fabricated_disc_status= BURN_DISC_FULL;
|
||||
/* This might be overwriteable media in a -ROM drive.
|
||||
Pitfall:
|
||||
Multi-session media which bear a xorriso image for overwriteables
|
||||
@ -364,8 +377,10 @@ static int isoburn_welcome_media(struct isoburn **o, struct burn_drive *d,
|
||||
ret= isoburn_emulate_toc(d, 1);
|
||||
if(ret<0)
|
||||
goto ex;
|
||||
else if(ret > 0)
|
||||
(*o)->emulation_mode= 1;
|
||||
}
|
||||
if(ret == 0 && profile != 0x08 && (flag&8)) {
|
||||
if(ret == 0 && (profile != 0x08 || (flag & 128)) && (flag & 8)) {
|
||||
/* This might also be multi-session media which do not
|
||||
get shown with a decent TOC.
|
||||
CD-R TOC (profile 0x08) can be trusted. Others not.
|
||||
@ -412,6 +427,7 @@ ex:
|
||||
bit4= do not emulate TOC on overwriteable media
|
||||
bit5= ignore ACL from external filesystems
|
||||
bit6= ignore POSIX Extended Attributes from external filesystems
|
||||
bit7= pretend -ROM profile and scan for table of content
|
||||
*/
|
||||
int isoburn_drive_aquire(struct burn_drive_info *drive_infos[],
|
||||
char *adr, int flag)
|
||||
@ -442,7 +458,7 @@ int isoburn_drive_aquire(struct burn_drive_info *drive_infos[],
|
||||
goto ex;
|
||||
drive_grabbed= 1;
|
||||
ret= isoburn_welcome_media(&o, (*drive_infos)[0].drive,
|
||||
(flag & (8 | 16 | 32 | 64)) | !!(flag&2));
|
||||
(flag & (8 | 16 | 32 | 64 | 128)) | !!(flag&2));
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
|
||||
@ -553,19 +569,26 @@ int isoburn_disc_erasable(struct burn_drive *d)
|
||||
|
||||
void isoburn_disc_erase(struct burn_drive *drive, int fast)
|
||||
{
|
||||
int ret;
|
||||
int ret, do_pseudo_blank= 0;
|
||||
struct isoburn *o;
|
||||
enum burn_disc_status s;
|
||||
char zero_buffer[Libisoburn_target_head_sizE];
|
||||
struct burn_multi_caps *caps= NULL;
|
||||
|
||||
ret= isoburn_find_emulator(&o, drive, 0);
|
||||
if(ret>0) {
|
||||
if(o->emulation_mode==-1) {
|
||||
/* To cause a negative reply with burn_drive_wrote_well() */
|
||||
burn_drive_cancel(drive);
|
||||
return;
|
||||
goto ex;
|
||||
}
|
||||
if(o->emulation_mode>0) {
|
||||
|
||||
if(o->emulation_mode > 0) { /* might be readonly with emulated sessions */
|
||||
ret= burn_disc_get_multi_caps(drive, BURN_WRITE_NONE, &caps, 0);
|
||||
if(ret > 0 && caps->start_adr)
|
||||
do_pseudo_blank= 1;
|
||||
}
|
||||
if(do_pseudo_blank) {
|
||||
s= isoburn_disc_get_status(drive);
|
||||
if(s==BURN_DISC_FULL) { /* unknown data format in first 64 kB */
|
||||
memset(zero_buffer, 0, Libisoburn_target_head_sizE);
|
||||
@ -576,10 +599,13 @@ void isoburn_disc_erase(struct burn_drive *drive, int fast)
|
||||
}
|
||||
if(ret<=0)
|
||||
burn_drive_cancel(drive); /* mark run as failure */
|
||||
return;
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
burn_disc_erase(drive, fast);
|
||||
ex:;
|
||||
if(caps!=NULL)
|
||||
burn_disc_free_multi_caps(&caps);
|
||||
}
|
||||
|
||||
|
||||
@ -774,7 +800,8 @@ void isoburn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
|
||||
ret= lstat(adr, &stbuf);
|
||||
if(ret!=-1)
|
||||
if(S_ISREG(stbuf.st_mode))
|
||||
truncate(adr, nwa * (off_t) 2048);
|
||||
ret= truncate(adr, nwa * (off_t) 2048);
|
||||
/* (result of truncate intentionally ignored) */
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1047,16 +1074,31 @@ int isoburn_read_iso_head(struct burn_drive *d, int lba,
|
||||
int *image_blocks, char *info, int flag)
|
||||
{
|
||||
unsigned char buffer[64*1024];
|
||||
int ret, info_mode;
|
||||
off_t data_count;
|
||||
int ret, info_mode, capacity, role;
|
||||
off_t data_count, to_read;
|
||||
|
||||
info_mode= flag&255;
|
||||
*image_blocks= 0;
|
||||
if(flag&(1<<13)) {
|
||||
memcpy(buffer, info, 64*1024);
|
||||
} else {
|
||||
ret = burn_read_data(d, ((off_t) lba) * (off_t) 2048, (char *) buffer,
|
||||
(off_t) 64*1024, &data_count, 2); /* no error messages */
|
||||
role = burn_drive_get_drive_role(d);
|
||||
ret = burn_get_read_capacity(d, &capacity, 0);
|
||||
if (ret <= 0 && role == 2) {
|
||||
/* Might be a block device on a system where libburn cannot determine its
|
||||
size. Try to read anyway. */
|
||||
capacity = 0x7ffffff0;
|
||||
ret = 1;
|
||||
}
|
||||
memset(buffer, 0, 64 * 1024);
|
||||
to_read= (off_t) capacity * ((off_t) 2048);
|
||||
if(ret > 0 && to_read >= (off_t) (36 * 1024)) {
|
||||
if(to_read >= (off_t) (64 * 1024))
|
||||
to_read= 64 * 1024;
|
||||
ret = burn_read_data(d, ((off_t) lba) * (off_t) 2048, (char *) buffer,
|
||||
to_read, &data_count, 2); /* no error messages */
|
||||
} else
|
||||
ret= 0;
|
||||
if(ret<=0)
|
||||
return(-1*!!(flag&(1<<15)));
|
||||
if(info_mode==2)
|
||||
@ -1117,8 +1159,8 @@ no_memory:;
|
||||
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 scan_start= 0, scan_count= 0, probe_minus_16= 0, growisofs_nwa;
|
||||
int with_enclosure= 0;
|
||||
int scan_start= 0, scan_count= 0, probe_minus_16= 0, growisofs_nwa, role;
|
||||
int with_enclosure= 0, readable_blocks= -1;
|
||||
struct isoburn *o;
|
||||
char msg[160], size_text[80], *sev, volid[33], *volid_pt= NULL;
|
||||
time_t start_time, last_pacifier, now;
|
||||
@ -1132,6 +1174,18 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag)
|
||||
if(o->emulation_mode<=0 && !(flag&1))
|
||||
return(0);
|
||||
|
||||
ret= burn_get_read_capacity(d, &readable_blocks, 0);
|
||||
if(ret <= 0) {
|
||||
|
||||
role = burn_drive_get_drive_role(d);
|
||||
if (role == 2)
|
||||
/* Might be a block device on a system where libburn cannot determine its
|
||||
size. Try to read anyway. */
|
||||
readable_blocks= 0x7ffffff0; /* try to read anyway */
|
||||
else
|
||||
readable_blocks= -1;
|
||||
}
|
||||
|
||||
start_time= last_pacifier= time(NULL);
|
||||
lba= 0;
|
||||
if(!(flag&2)) {
|
||||
@ -1209,6 +1263,12 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag)
|
||||
if(ret==2) /* ISO header was found in first half block */
|
||||
lba-= 16;
|
||||
|
||||
if(readable_blocks >= 0 && lba + track_blocks > readable_blocks) {
|
||||
sprintf(msg, "ISO image size %ds larger than readable size %ds",
|
||||
lba + track_blocks, readable_blocks);
|
||||
isoburn_msgs_submit(o, 0x00060000, msg, 0, "WARNING", 0);
|
||||
track_blocks= readable_blocks - lba;
|
||||
}
|
||||
ret= isoburn_make_toc_entry(o, &session_count, lba, track_blocks, volid_pt,
|
||||
0);
|
||||
if(ret<=0)
|
||||
@ -1242,6 +1302,12 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag)
|
||||
failure:;
|
||||
isoburn_toc_entry_destroy(&(o->toc), 1);
|
||||
if(with_enclosure && o->emulation_mode == 1) {
|
||||
if(readable_blocks >= 0 && image_size > readable_blocks) {
|
||||
sprintf(msg, "ISO image size %ds larger than readable size %ds",
|
||||
image_size, readable_blocks);
|
||||
isoburn_msgs_submit(o, 0x00060000, msg, 0, "WARNING", 0);
|
||||
image_size= readable_blocks;
|
||||
}
|
||||
session_count= 0;
|
||||
ret= isoburn_make_toc_entry(o, &session_count, 0, image_size, NULL, 0);
|
||||
}
|
||||
@ -1579,7 +1645,7 @@ int isoburn_drive_set_msgs_submit(struct burn_drive *d,
|
||||
int isoburn_set_msc1(struct burn_drive *d, int adr_mode, char *adr_value,
|
||||
int flag)
|
||||
{
|
||||
int ret, num_sessions, num_tracks, adr_num, i, j, total_tracks;
|
||||
int ret, num_sessions= 0, num_tracks, adr_num, i, j, total_tracks;
|
||||
int lba, best_lba, size, re_valid= 0, track_count= 0;
|
||||
time_t start_time= 0, last_pacifier= 0, now;
|
||||
char volid[33], msg[160];
|
||||
|
@ -1,10 +1,15 @@
|
||||
/*
|
||||
data source for libisoburn.
|
||||
|
||||
Copyright 2007 - 2009 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
||||
Copyright 2007 - 2010 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
||||
and Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
@ -6,10 +6,16 @@
|
||||
/*
|
||||
Class core of libisoburn.
|
||||
|
||||
Copyright 2007 - 2009 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
||||
Copyright 2007 - 2010 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
||||
Thomas Schmitt <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
/* ( derived from stub generated by CgeN on Sat, 01 Sep 2007 12:04:36 GMT ) */
|
||||
|
||||
#include <sys/types.h>
|
||||
@ -362,12 +368,6 @@ int isoburn_prepare_disc_aux(struct burn_drive *in_d, struct burn_drive *out_d,
|
||||
|
||||
new_img= flag&1;
|
||||
early_indev_release= flag&2;
|
||||
if(new_img && early_indev_release) {
|
||||
isoburn_msgs_submit(in_o, 0x00060000,
|
||||
"Programming error: Wrong session setup: new_img && early_indev_release",
|
||||
0, "FATAL", 0);
|
||||
{ret= -4; goto ex;}
|
||||
}
|
||||
|
||||
ret= isoburn_find_emulator(&in_o, in_d, 0);
|
||||
if(ret<0 || in_o==NULL)
|
||||
@ -378,6 +378,13 @@ int isoburn_prepare_disc_aux(struct burn_drive *in_d, struct burn_drive *out_d,
|
||||
/* early end will be registered as failure */
|
||||
in_o->wrote_well= out_o->wrote_well= 0;
|
||||
|
||||
if(new_img && early_indev_release) {
|
||||
isoburn_msgs_submit(in_o, 0x00060000,
|
||||
"Programming error: Wrong session setup: new_img && early_indev_release",
|
||||
0, "FATAL", 0);
|
||||
{ret= -4; goto ex;}
|
||||
}
|
||||
|
||||
state = isoburn_disc_get_status(in_d);
|
||||
if (state != BURN_DISC_BLANK && state != BURN_DISC_APPENDABLE &&
|
||||
state != BURN_DISC_FULL) {
|
||||
@ -434,6 +441,10 @@ int isoburn_prepare_disc_aux(struct burn_drive *in_d, struct burn_drive *out_d,
|
||||
iso_write_opts_set_aaip_susp_1_10(wopts, opts->aaip_susp_1_10);
|
||||
iso_write_opts_set_sort_files(wopts, opts->sort_files);
|
||||
iso_write_opts_set_record_md5(wopts, opts->session_md5, opts->file_md5 & 3);
|
||||
if(opts->scdbackup_tag_name[0] && opts->scdbackup_tag_time[0])
|
||||
iso_write_opts_set_scdbackup_tag(wopts, opts->scdbackup_tag_name,
|
||||
opts->scdbackup_tag_time,
|
||||
opts->scdbackup_tag_written);
|
||||
iso_write_opts_set_replace_mode(wopts, opts->replace_dir_mode,
|
||||
opts->replace_file_mode, opts->replace_uid, opts->replace_gid);
|
||||
iso_write_opts_set_default_dir_mode(wopts, opts->dir_mode);
|
||||
@ -442,7 +453,27 @@ int isoburn_prepare_disc_aux(struct burn_drive *in_d, struct burn_drive *out_d,
|
||||
iso_write_opts_set_default_gid(wopts, opts->gid);
|
||||
iso_write_opts_set_output_charset(wopts, opts->output_charset);
|
||||
iso_write_opts_set_fifo_size(wopts, fifo_chunks);
|
||||
ret = iso_write_opts_set_system_area(wopts, opts->system_area_data,
|
||||
opts->system_area_options, 0);
|
||||
if (ret < 0) {
|
||||
isoburn_report_iso_error(ret, "Cannot set content of System Area",
|
||||
0, "FAILURE", 0);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
iso_write_opts_set_pvd_times(wopts,
|
||||
opts->vol_creation_time, opts->vol_modification_time,
|
||||
opts->vol_expiration_time, opts->vol_effective_time,
|
||||
opts->vol_uuid);
|
||||
|
||||
if(opts->no_emul_toc) {
|
||||
if(out_o->nwa == out_o->zero_nwa &&
|
||||
out_o->zero_nwa == Libisoburn_overwriteable_starT &&
|
||||
out_o->emulation_mode == 1) {
|
||||
out_o->nwa= 0;
|
||||
out_o->zero_nwa= 0;
|
||||
out_o->min_start_byte= 0;
|
||||
}
|
||||
}
|
||||
ret = isoburn_disc_track_lba_nwa(out_d, NULL, 0, &lba, &nwa);
|
||||
opts->effective_lba= nwa;
|
||||
ret= isoburn_get_msc2(out_o, NULL, &nwa, 0);
|
||||
@ -552,6 +583,7 @@ int isoburn_prepare_blind_grow(struct burn_drive *d, struct burn_disc **disc,
|
||||
o->nwa= o->zero_nwa= 0;
|
||||
else
|
||||
o->zero_nwa= 0;
|
||||
o->min_start_byte= 0;
|
||||
ret= isoburn_prepare_disc_aux(d, out_drive, disc, opts, 2);
|
||||
if (ret<=0)
|
||||
return ret;
|
||||
@ -843,6 +875,12 @@ int isoburn_igopt_new(struct isoburn_imgen_opts **new_o, int flag)
|
||||
o->fifo_size= 4*1024*1024;
|
||||
o->effective_lba= -1;
|
||||
o->data_start_lba= -1;
|
||||
o->system_area_data= NULL;
|
||||
o->system_area_options= 0;
|
||||
o->vol_creation_time= 0;
|
||||
o->vol_modification_time= 0;
|
||||
o->vol_expiration_time= 0;
|
||||
o->vol_effective_time= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
@ -880,6 +918,7 @@ int isoburn_igopt_set_extensions(struct isoburn_imgen_opts *o, int ext)
|
||||
o->aaip= !!(ext & 32);
|
||||
o->session_md5= !!(ext & 64);
|
||||
o->file_md5= (ext & (128 | 256)) >> 7;
|
||||
o->no_emul_toc= !!(ext & 512);
|
||||
return(1);
|
||||
}
|
||||
|
||||
@ -888,18 +927,21 @@ int isoburn_igopt_get_extensions(struct isoburn_imgen_opts *o, int *ext)
|
||||
{
|
||||
*ext= (!!o->rockridge) | ((!!o->joliet)<<1) | ((!!o->iso1999)<<2) |
|
||||
((!!o->hardlinks) << 3) | ((!!o->aaip) << 5) |
|
||||
((!!o->session_md5) << 6) | ((o->file_md5 & 3) << 7);
|
||||
((!!o->session_md5) << 6) | ((o->file_md5 & 3) << 7) |
|
||||
((!!o->no_emul_toc) << 9);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_set_relaxed(struct isoburn_imgen_opts *o, int relax)
|
||||
{
|
||||
o->omit_version_numbers= !!(relax&1);
|
||||
o->omit_version_numbers= (!!(relax&1)) |
|
||||
(2 * !!(relax & isoburn_igopt_only_iso_versions));
|
||||
o->allow_deep_paths= !!(relax&2);
|
||||
o->allow_longer_paths= !!(relax&4);
|
||||
o->max_37_char_filenames= !!(relax&8);
|
||||
o->no_force_dots= !!(relax&16);
|
||||
o->no_force_dots= (!!(relax&16)) |
|
||||
(2 * !!(relax & isoburn_igopt_no_j_force_dots));
|
||||
o->allow_lowercase= !!(relax&32);
|
||||
o->allow_full_ascii= !!(relax&64);
|
||||
o->joliet_longer_paths= !!(relax&128);
|
||||
@ -1027,3 +1069,91 @@ int isoburn_igopt_get_data_start(struct isoburn_imgen_opts *o, int *lba)
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_set_scdbackup_tag(struct isoburn_imgen_opts *o, char *name,
|
||||
char *timestamp, char *tag_written)
|
||||
{
|
||||
strncpy(o->scdbackup_tag_name, name, 80);
|
||||
o->scdbackup_tag_name[80]= 0;
|
||||
strncpy(o->scdbackup_tag_time, timestamp, 18);
|
||||
o->scdbackup_tag_time[18]= 0;
|
||||
o->scdbackup_tag_written = tag_written;
|
||||
if(tag_written != NULL)
|
||||
tag_written[0]= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_get_scdbackup_tag(struct isoburn_imgen_opts *o,
|
||||
char name[81], char timestamp[19],
|
||||
char **tag_written)
|
||||
{
|
||||
strncpy(name, o->scdbackup_tag_name, 80);
|
||||
name[80]= 0;
|
||||
strncpy(timestamp, o->scdbackup_tag_time, 18);
|
||||
timestamp[18]= 0;
|
||||
*tag_written= o->scdbackup_tag_written;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_set_system_area(struct isoburn_imgen_opts *opts,
|
||||
char data[32768], int options)
|
||||
{
|
||||
if (data == NULL) { /* Disable */
|
||||
if (opts->system_area_data != NULL)
|
||||
free(opts->system_area_data);
|
||||
opts->system_area_data = NULL;
|
||||
} else {
|
||||
if (opts->system_area_data == NULL) {
|
||||
opts->system_area_data = calloc(32768, 1);
|
||||
if (opts->system_area_data == NULL)
|
||||
return(-1);
|
||||
}
|
||||
memcpy(opts->system_area_data, data, 32768);
|
||||
}
|
||||
opts->system_area_options = options & 3;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_get_system_area(struct isoburn_imgen_opts *opts,
|
||||
char data[32768], int *options)
|
||||
{
|
||||
*options= opts->system_area_options;
|
||||
if(opts->system_area_data == NULL)
|
||||
return(0);
|
||||
memcpy(data, opts->system_area_data, 32768);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_set_pvd_times(struct isoburn_imgen_opts *opts,
|
||||
time_t vol_creation_time, time_t vol_modification_time,
|
||||
time_t vol_expiration_time, time_t vol_effective_time,
|
||||
char *vol_uuid)
|
||||
{
|
||||
opts->vol_creation_time = vol_creation_time;
|
||||
opts->vol_modification_time = vol_modification_time;
|
||||
opts->vol_expiration_time = vol_expiration_time;
|
||||
opts->vol_effective_time = vol_effective_time;
|
||||
strncpy(opts->vol_uuid, vol_uuid, 16);
|
||||
opts->vol_uuid[16] = 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int isoburn_igopt_get_pvd_times(struct isoburn_imgen_opts *opts,
|
||||
time_t *vol_creation_time, time_t *vol_modification_time,
|
||||
time_t *vol_expiration_time, time_t *vol_effective_time,
|
||||
char vol_uuid[17])
|
||||
{
|
||||
*vol_creation_time = opts->vol_creation_time;
|
||||
*vol_modification_time = opts->vol_modification_time;
|
||||
*vol_expiration_time = opts->vol_expiration_time;
|
||||
*vol_effective_time = opts->vol_effective_time;
|
||||
strcpy(vol_uuid, opts->vol_uuid);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
|
@ -2,8 +2,9 @@
|
||||
/*
|
||||
Class struct of libisoburn.
|
||||
|
||||
Copyright 2007 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
||||
and Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright 2007 - 2010 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
||||
and Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifndef Isoburn_includeD
|
||||
@ -339,6 +340,11 @@ struct isoburn_imgen_opts {
|
||||
*/
|
||||
unsigned int file_md5 :2;
|
||||
|
||||
/* On overwriteable media or random access files do not write the first
|
||||
session to LBA 32, but rather to LBA 0 directly.
|
||||
*/
|
||||
unsigned int no_emul_toc :1;
|
||||
|
||||
/* relaxed constraints */
|
||||
|
||||
/*
|
||||
@ -349,8 +355,10 @@ struct isoburn_imgen_opts {
|
||||
/**
|
||||
* Omit the version number (";1") at the end of the ISO-9660 identifiers.
|
||||
* Version numbers are usually not used.
|
||||
* bit0= omit version number with ECMA-119 and Joliet
|
||||
* bit1= omit version number with Joliet alone
|
||||
*/
|
||||
unsigned int omit_version_numbers :1;
|
||||
unsigned int omit_version_numbers :2;
|
||||
|
||||
/**
|
||||
* Allow ISO-9660 directory hierarchy to be deeper than 8 levels.
|
||||
@ -374,8 +382,10 @@ struct isoburn_imgen_opts {
|
||||
* ISO-9660 forces filenames to have a ".", that separates file name from
|
||||
* extension. libisofs adds it if original filename doesn't has one. Set
|
||||
* this to 1 to prevent this behavior
|
||||
* bit0= no forced dot with ECMA-119
|
||||
* bit1= no forced dot with Joliet
|
||||
*/
|
||||
unsigned int no_force_dots :1;
|
||||
unsigned int no_force_dots :2;
|
||||
|
||||
/**
|
||||
* Allow lowercase characters in ISO-9660 filenames. By default, only
|
||||
@ -471,6 +481,45 @@ struct isoburn_imgen_opts {
|
||||
If >=16: Valid block number. Block size is always 2 KiB.
|
||||
*/
|
||||
int data_start_lba;
|
||||
|
||||
/**
|
||||
* If not empty: Parameters "name" and "timestamp" for a scdbackup stream
|
||||
* checksum tag. See scdbackup/README appendix VERIFY.
|
||||
* It makes sense only for single session images which start at LBA 0.
|
||||
* Such a tag may be part of a libisofs checksum tag block after the
|
||||
* session tag line. It then covers the whole session up to its own start
|
||||
* position.
|
||||
* If scdbackup_tag_written is not NULL then it is a pointer to an
|
||||
* application provided array with at least 512 characters. The effectively
|
||||
* written scdbackup tag will be copied to this memory location.
|
||||
*/
|
||||
char scdbackup_tag_name[81];
|
||||
char scdbackup_tag_time[19];
|
||||
char *scdbackup_tag_written;
|
||||
|
||||
|
||||
/* Content of an embedded boot image. Valid if not NULL.
|
||||
* In that case it must point to a memory buffer at least 32 kB.
|
||||
*/
|
||||
char *system_area_data;
|
||||
/*
|
||||
* bit0= make bytes 446 - 512 of the system area a partition
|
||||
* table which reserves partition 1 from byte 63*512 to the
|
||||
* end of the ISO image. Assumed are 63 secs/hed, 255 head/cyl.
|
||||
* (GRUB protective msdos label.)
|
||||
* This works with and without system_area_data.
|
||||
*/
|
||||
int system_area_options;
|
||||
|
||||
/* User settable PVD time stamps */
|
||||
time_t vol_creation_time;
|
||||
time_t vol_modification_time;
|
||||
time_t vol_expiration_time;
|
||||
time_t vol_effective_time;
|
||||
/* To eventually override vol_modification_time by unconverted string
|
||||
and timezone 0 */
|
||||
char vol_uuid[17];
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
@ -6,10 +6,15 @@
|
||||
/*
|
||||
libisofs related functions of libisoburn.
|
||||
|
||||
Copyright 2007 - 2009 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
||||
Copyright 2007 - 2010 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
||||
Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
@ -214,6 +219,7 @@ create_blank_image:;
|
||||
iso_read_opts_set_default_gid(ropts, read_opts->gid);
|
||||
iso_read_opts_set_input_charset(ropts, read_opts->input_charset);
|
||||
iso_read_opts_auto_input_charset(ropts, read_opts->auto_input_charset);
|
||||
iso_read_opts_load_system_area(ropts, 1);
|
||||
|
||||
ds = isoburn_data_source_new(d);
|
||||
if(o->iso_data_source!=NULL)
|
||||
@ -307,8 +313,8 @@ int isoburn_activate_session(struct burn_drive *drive)
|
||||
*/
|
||||
int isoburn_start_emulation(struct isoburn *o, int flag)
|
||||
{
|
||||
int ret, i;
|
||||
off_t data_count;
|
||||
int ret, i, capacity = -1, role;
|
||||
off_t data_count, to_read;
|
||||
struct burn_drive *drive;
|
||||
struct ecma119_pri_vol_desc *pvm;
|
||||
|
||||
@ -321,13 +327,32 @@ int isoburn_start_emulation(struct isoburn *o, int flag)
|
||||
|
||||
drive= o->drive;
|
||||
|
||||
/* we can assume 0 as start block for image */
|
||||
/* TODO what about ms? where we validate valid iso image in ms disc? */
|
||||
ret = burn_read_data(drive, (off_t) 0, (char*)o->target_iso_head,
|
||||
(off_t) Libisoburn_target_head_sizE, &data_count, 2);
|
||||
|
||||
/* an error means an empty disc */
|
||||
if (ret <= 0) {
|
||||
/* We can assume 0 as start block for image.
|
||||
The data there point to the most recent session.
|
||||
*/
|
||||
role = burn_drive_get_drive_role(drive);
|
||||
ret = burn_get_read_capacity(drive, &capacity, 0);
|
||||
if (ret <= 0)
|
||||
capacity = -1;
|
||||
if (capacity > 0 || role == 2) {
|
||||
/* Might be a block device on a system where libburn cannot determine its
|
||||
size. Try to read anyway. */
|
||||
memset(o->target_iso_head, 0, Libisoburn_target_head_sizE);
|
||||
to_read = Libisoburn_target_head_sizE;
|
||||
if(capacity > 0 && (off_t) capacity * (off_t) 2048 < to_read)
|
||||
to_read = (off_t) capacity * (off_t) 2048;
|
||||
ret = burn_read_data(drive, (off_t) 0, (char*)o->target_iso_head,
|
||||
to_read, &data_count, 2);
|
||||
if (ret <= 0) {
|
||||
/* an error means a disc with no ISO image */
|
||||
if (capacity > 0)
|
||||
o->fabricated_disc_status= BURN_DISC_FULL;
|
||||
else
|
||||
o->fabricated_disc_status= BURN_DISC_BLANK;
|
||||
return 1;
|
||||
}
|
||||
} else {
|
||||
/* No read capacity means blank media */
|
||||
o->fabricated_disc_status= BURN_DISC_BLANK;
|
||||
return 1;
|
||||
}
|
||||
|
@ -1,9 +1,10 @@
|
||||
|
||||
/*
|
||||
API definition of libisoburn.
|
||||
Lower level API definition of libisoburn.
|
||||
|
||||
Copyright 2007-2009 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
||||
Copyright 2007-2010 Vreixo Formoso Lopes <metalpain2002@yahoo.es>
|
||||
and Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
/** Overview
|
||||
@ -17,6 +18,9 @@ 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
|
||||
other CD layout which does not entirely consist of ISO-9660 sessions.
|
||||
|
||||
Note that there is a higher level of API: xorriso.h. One should not mix it
|
||||
with the API calls of libisoburn.h, libisofs.h, and libburn.h.
|
||||
|
||||
|
||||
Connector functions
|
||||
|
||||
@ -132,7 +136,7 @@ file itself: libisoburn/libisoburn.h .
|
||||
They shall link with -lisofs -lburn -lisoburn or with the .o files emerging
|
||||
from building those libraries from their sources.
|
||||
|
||||
Applications must use 64 bit off_t, e.g. on 32-bit Linux by defining
|
||||
Applications must use 64 bit off_t, e.g. on 32-bit GNU/Linux by defining
|
||||
#define _LARGEFILE_SOURCE
|
||||
#define _FILE_OFFSET_BITS 64
|
||||
or take special precautions to interface with the library by 64 bit integers
|
||||
@ -160,7 +164,7 @@ int isoburn_initialize(char msg[1024], int flag);
|
||||
major.minor.micro revision triple can be delivered by the library version
|
||||
which is performing this call.
|
||||
An application of libisoburn can easily memorize the version of the
|
||||
libisofs.h header in its own code. Immediately after isoburn_initialize()
|
||||
libisoburn.h header in its own code. Immediately after isoburn_initialize()
|
||||
it should simply do this check:
|
||||
if (! isoburn_is_compatible(isoburn_header_version_major,
|
||||
isoburn_header_version_minor,
|
||||
@ -216,15 +220,15 @@ void isoburn_version(int *major, int *minor, int *micro);
|
||||
*/
|
||||
#define isoburn_libisofs_req_major 0
|
||||
#define isoburn_libisofs_req_minor 6
|
||||
#define isoburn_libisofs_req_micro 22
|
||||
#define isoburn_libisofs_req_micro 34
|
||||
|
||||
/** The minimum version of libburn to be used with this version of libisoburn
|
||||
at compile time.
|
||||
@since 0.1.0
|
||||
*/
|
||||
#define isoburn_libburn_req_major 0
|
||||
#define isoburn_libburn_req_minor 7
|
||||
#define isoburn_libburn_req_micro 0
|
||||
#define isoburn_libburn_req_minor 8
|
||||
#define isoburn_libburn_req_micro 4
|
||||
|
||||
|
||||
/** The minimum version of libisofs to be used with this version of libisoburn
|
||||
@ -259,8 +263,8 @@ int isoburn_libburn_req(int *major, int *minor, int *micro);
|
||||
@since 0.1.0
|
||||
*/
|
||||
#define isoburn_header_version_major 0
|
||||
#define isoburn_header_version_minor 4
|
||||
#define isoburn_header_version_micro 1
|
||||
#define isoburn_header_version_minor 6
|
||||
#define isoburn_header_version_micro 0
|
||||
/** Note:
|
||||
Above version numbers are also recorded in configure.ac because libtool
|
||||
wants them as parameters at build time.
|
||||
@ -386,10 +390,11 @@ int isoburn_drive_scan_and_grab(struct burn_drive_info *drive_infos[],
|
||||
bit5= ignore ACL from external filesystems
|
||||
bit6= ignore POSIX Extended Attributes from external
|
||||
filesystems
|
||||
bit7= pretend read-only profile and scan for table of content
|
||||
@return 1 = success , 0 = drive not found , <0 = other error
|
||||
*/
|
||||
int isoburn_drive_aquire(struct burn_drive_info *drive_infos[],
|
||||
char* adr, int flag);
|
||||
char* adr, int flag);
|
||||
|
||||
/** Aquire a drive from the burn_drive_info[] array which was obtained by
|
||||
a previous call of burn_drive_scan().
|
||||
@ -437,7 +442,7 @@ enum burn_disc_status isoburn_disc_get_status(struct burn_drive *drive);
|
||||
/** Tells whether the media can be treated by isoburn_disc_erase().
|
||||
Wrapper for: burn_disc_erasable()
|
||||
@since 0.1.0
|
||||
@param drive The drive to inquire.
|
||||
@param d The drive to inquire.
|
||||
@return 0=not erasable , else erasable
|
||||
*/
|
||||
int isoburn_disc_erasable(struct burn_drive *d);
|
||||
@ -462,7 +467,7 @@ void isoburn_disc_erase(struct burn_drive *drive, int fast);
|
||||
of libisoburn and libisofs.
|
||||
Note: Sessions and tracks are counted beginning with 1, not with 0.
|
||||
@since 0.1.6
|
||||
@param drive The drive where msc1 is to be set
|
||||
@param d The drive where msc1 is to be set
|
||||
@param adr_mode Determines how to interpret adr_value and to set msc1.
|
||||
If adr_value shall represent a number then decimal ASCII
|
||||
digits are expected.
|
||||
@ -520,8 +525,8 @@ struct isoburn_toc_track;
|
||||
isoburn_toc_disc_free() when no longer needed.
|
||||
Wrapper for: burn_drive_get_disc()
|
||||
@since 0.1.6
|
||||
@param drive The drive with the media to inspect
|
||||
@return NULL in case there is no content info, else it is a valid handle
|
||||
@param d The drive with the media to inspect
|
||||
@return NULL in case there is no content info, else it is a valid handle
|
||||
*/
|
||||
struct isoburn_toc_disc *isoburn_toc_drive_get_disc(struct burn_drive *d);
|
||||
|
||||
@ -530,8 +535,8 @@ struct isoburn_toc_disc *isoburn_toc_drive_get_disc(struct burn_drive *d);
|
||||
This number includes the eventual gaps between sessions and tracks.
|
||||
So this call is not really a wrapper for burn_disc_get_sectors().
|
||||
@since 0.1.6
|
||||
@param disc The master handle of the media
|
||||
@return number of blocks, <=0 indicates unknown or unreadable state
|
||||
@param disc The master handle of the media
|
||||
@return Number of blocks, <=0 indicates unknown or unreadable state
|
||||
*/
|
||||
int isoburn_toc_disc_get_sectors(struct isoburn_toc_disc *disc);
|
||||
|
||||
@ -621,9 +626,9 @@ void isoburn_toc_disc_free(struct isoburn_toc_disc *disc);
|
||||
image header and obtain its alleged size. Depending on the info mode
|
||||
one other string of text information can be retrieved too.
|
||||
@since 0.1.6
|
||||
@param drive The drive with the media to inspect
|
||||
@param d The drive with the media to inspect
|
||||
@param lba The block number from where to read
|
||||
@param image_blocks The number of 2048 bytes blocks
|
||||
@param image_blocks Returns the number of 2048 bytes blocks in the session
|
||||
@param info Caller provided memory, enough to take eventual info reply
|
||||
@param flag bit0-7: info return mode
|
||||
0= do not return anything in info (do not even touch it)
|
||||
@ -645,7 +650,7 @@ int isoburn_read_iso_head(struct burn_drive *d, int lba,
|
||||
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 d 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.
|
||||
@ -810,7 +815,7 @@ int isoburn_ropt_get_input_charset(struct isoburn_read_opts *o,
|
||||
Enable or disable methods to automatically choose an input charset.
|
||||
This eventually overrides the name set via isoburn_ropt_set_input_charset()
|
||||
@since 0.3.8
|
||||
|
||||
@param o The option set to work on
|
||||
@param mode Bitfield for control purposes:
|
||||
bit0= allow to set the input character set automatically from
|
||||
attribute "isofs.cs" of root directory.
|
||||
@ -915,7 +920,7 @@ int isoburn_igopt_get_level(struct isoburn_imgen_opts *o, int *level);
|
||||
advisable if the designed audience has Unix style systems.
|
||||
bit1= joliet
|
||||
Longer filenames for Windows systems.
|
||||
Weaker than RockRidge, but also readable with Linux.
|
||||
Weaker than RockRidge, but also readable with GNU/Linux.
|
||||
bit2= iso1999
|
||||
This is rather exotic. Better do not surprise the readers.
|
||||
bit3= hardlinks
|
||||
@ -940,6 +945,12 @@ int isoburn_igopt_get_level(struct isoburn_imgen_opts *o, int *level);
|
||||
compare this with the MD5 of the actual copying. If they do
|
||||
not match then issue MISHAP event.
|
||||
See also libisofs.h iso_write_opts_set_record_md5()
|
||||
bit9= no_emul_toc
|
||||
@since 0.5.8
|
||||
On overwriteable media or random access files do not write
|
||||
the first session to LBA 32 and do not copy the first 64kB
|
||||
of the first session to LBA 0, but rather write the first
|
||||
session to LBA 0 directly.
|
||||
@return 1 success, <=0 failure
|
||||
*/
|
||||
#define isoburn_igopt_rockridge 1
|
||||
@ -950,6 +961,7 @@ int isoburn_igopt_get_level(struct isoburn_imgen_opts *o, int *level);
|
||||
#define isoburn_igopt_session_md5 64
|
||||
#define isoburn_igopt_file_md5 128
|
||||
#define isoburn_igopt_file_stability 256
|
||||
#define isoburn_igopt_no_emul_toc 512
|
||||
int isoburn_igopt_set_extensions(struct isoburn_imgen_opts *o, int ext);
|
||||
int isoburn_igopt_get_extensions(struct isoburn_imgen_opts *o, int *ext);
|
||||
|
||||
@ -960,8 +972,8 @@ int isoburn_igopt_get_extensions(struct isoburn_imgen_opts *o, int *ext);
|
||||
@param relax Bitfield:
|
||||
bit0= omit_version_numbers
|
||||
Omit the version number (";1") at the end of the
|
||||
ISO-9660 identifiers. Version numbers are usually
|
||||
not used.
|
||||
ISO-9660 and Joliet identifiers.
|
||||
Version numbers are usually not used by readers.
|
||||
bit1= allow_deep_paths
|
||||
Allow ISO-9660 directory hierarchy to be deeper
|
||||
than 8 levels.
|
||||
@ -1010,7 +1022,18 @@ int isoburn_igopt_get_extensions(struct isoburn_imgen_opts *o, int *ext);
|
||||
prefixed ES fields. This saves 5 to 10 bytes per file and
|
||||
might avoid problems with readers which only accept RRIP.
|
||||
SUSP-1.10 allows it, SUSP-1.12 frowns on it.
|
||||
|
||||
bit12= only_iso_numbers
|
||||
Same as bit1 omit_version_number but restricted to the names
|
||||
in the eventual Joliet tree.
|
||||
@since 0.5.4
|
||||
For reasons of backward compatibility it is not possible yet
|
||||
to disable version numbers for ISO 9660 while enabling them
|
||||
for Joliet.
|
||||
bit13= no_j_force_dots
|
||||
Same as no_force_dots but affecting the names in the eventual
|
||||
Joliet tree rather than the ISO 9660 / ECMA-119 names.
|
||||
@since 0.5.4
|
||||
Previous versions added dots to Joliet names unconditionally.
|
||||
@return 1 success, <=0 failure
|
||||
*/
|
||||
#define isoburn_igopt_omit_version_numbers 1
|
||||
@ -1025,6 +1048,8 @@ int isoburn_igopt_get_extensions(struct isoburn_imgen_opts *o, int *ext);
|
||||
#define isoburn_igopt_rrip_version_1_10 512
|
||||
#define isoburn_igopt_dir_rec_mtime 1024
|
||||
#define isoburn_igopt_aaip_susp_1_10 2048
|
||||
#define isoburn_igopt_only_iso_versions 4096
|
||||
#define isoburn_igopt_no_j_force_dots 8192
|
||||
int isoburn_igopt_set_relaxed(struct isoburn_imgen_opts *o, int relax);
|
||||
int isoburn_igopt_get_relaxed(struct isoburn_imgen_opts *o, int *relax);
|
||||
|
||||
@ -1141,6 +1166,90 @@ int isoburn_igopt_get_effective_lba(struct isoburn_imgen_opts *o, int *lba);
|
||||
int isoburn_igopt_get_data_start(struct isoburn_imgen_opts *o, int *lba);
|
||||
|
||||
|
||||
/** Set resp. get parameters "name" and "timestamp" for a scdbackup checksum
|
||||
tag. It will be appended to the libisofs session tag if the image starts at
|
||||
LBA 0. See isoburn_disc_track_lba_nwa. The scdbackup tag can be used
|
||||
to verify the image by command scdbackup_verify <device> -auto_end.
|
||||
See scdbackup/README appendix VERIFY for its inner details.
|
||||
@since 0.4.4
|
||||
@param o The option set to work on
|
||||
@param name The tag name. 80 characters max.
|
||||
@param timestamp A string of up to 13 characters YYMMDD.hhmmss
|
||||
A9 = 2009, B0 = 2010, B1 = 2011, ... C0 = 2020, ...
|
||||
@param tag_written Either NULL or the address of an array with at least 512
|
||||
characters. In the latter case the eventually produced
|
||||
scdbackup tag will be copied to this array when the image
|
||||
gets written. This call sets scdbackup_tag_written[0] = 0
|
||||
to mark its preliminary invalidity.
|
||||
@return 1 success, <=0 failure
|
||||
*/
|
||||
int isoburn_igopt_set_scdbackup_tag(struct isoburn_imgen_opts *o, char *name,
|
||||
char *timestamp, char *tag_written);
|
||||
int isoburn_igopt_get_scdbackup_tag(struct isoburn_imgen_opts *o,
|
||||
char name[81], char timestamp[19],
|
||||
char **tag_written);
|
||||
|
||||
|
||||
/** Attach 32 kB of binary data which shall get written to the first 32 kB
|
||||
of the ISO image, the System Area.
|
||||
options can cause manipulations of these data before writing happens.
|
||||
If system area data are giveni or options bit0 is set, then bit1 of
|
||||
el_torito_set_isolinux_options() is automatically disabled.
|
||||
@since 0.5.4
|
||||
@param o The option set to work on
|
||||
@param data Either NULL or 32 kB of data. Do not submit less bytes !
|
||||
@param options Can cause manipulations of submitted data before they
|
||||
get written:
|
||||
bit0= apply a --protective-msdos-label as of grub-mkisofs.
|
||||
This means to patch bytes 446 to 512 of the system
|
||||
area so that one partition is defined which begins
|
||||
at the second 512-byte block of the image and ends
|
||||
where the image ends.
|
||||
This works with and without system_area_data.
|
||||
bit1= apply isohybrid MBR patching to the system area.
|
||||
This works only with system area data from
|
||||
SYSLINUX plus an ISOLINUX boot image (see
|
||||
iso_image_set_boot_image()) and only if not bit0
|
||||
is set.
|
||||
@return 1 success, 0 no data to get, <0 failure
|
||||
*/
|
||||
int isoburn_igopt_set_system_area(struct isoburn_imgen_opts *o,
|
||||
char data[32768], int options);
|
||||
int isoburn_igopt_get_system_area(struct isoburn_imgen_opts *o,
|
||||
char data[32768], int *options);
|
||||
|
||||
/** Explicitely set the four timestamps of the emerging ISO image.
|
||||
Default with all parameters is 0.
|
||||
@since 0.5.4
|
||||
ECMA-119 defines the timestamps in the Primary Volume Descriptor as:
|
||||
@param creation_time
|
||||
When "the information in the volume was created."
|
||||
A value of 0 means that the timepoint of write start is to be used.
|
||||
@param modification_time
|
||||
When "the informationin the volume was last modified."
|
||||
A value of 0 means that the timepoint of write start is to be used.
|
||||
@param expiration_time
|
||||
When "the information in the volume may be regarded as obsolete."
|
||||
A value of 0 means that the information never shall expire.
|
||||
@param effective_time
|
||||
When "the information in the volume may be used."
|
||||
A value of 0 means that not such retention is intended.
|
||||
@param uuid
|
||||
If this text is not empty, then it overrides vol_modification_time
|
||||
by copying the first 16 decimal digits from uuid, eventually
|
||||
padding up with decimal '1', and writing a NUL-byte as timezone GMT.
|
||||
It should express a reasonable time in form YYYYMMDDhhmmsscc
|
||||
E.g.: 2010040711405800 = 7 Apr 2010 11:40:58 (+0 centiseconds)
|
||||
@return 1 success, <=0 failure
|
||||
*/
|
||||
int isoburn_igopt_set_pvd_times(struct isoburn_imgen_opts *opts,
|
||||
time_t creation_time, time_t modification_time,
|
||||
time_t expiration_time, time_t effective_time,
|
||||
char *uuid);
|
||||
int isoburn_igopt_get_pvd_times(struct isoburn_imgen_opts *opts,
|
||||
time_t *creation_time, time_t *modification_time,
|
||||
time_t *expiration_time, time_t *effective_time,
|
||||
char uuid[17]);
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
/* End of Options for image generation */
|
||||
@ -1276,7 +1385,7 @@ int isoburn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o,
|
||||
overwriteable media. This value is supposed to be <= 2048 * nwa as of
|
||||
isoburn_disc_track_lba_nwa().
|
||||
@since 0.1.0
|
||||
@param drive The drive holding the media.
|
||||
@param d The drive holding the media.
|
||||
@param start_byte The reply value counted in bytes, not in sectors.
|
||||
@param flag Unused yet. Submit 0.
|
||||
@return 1=stat_byte is valid, 0=not an emulated appendable, -1=error
|
||||
@ -1366,9 +1475,10 @@ int isoburn_prepare_new_image(struct burn_drive *in_drive,
|
||||
the in_drive media.
|
||||
@return <=0 error , 1 = success
|
||||
*/
|
||||
int isoburn_prepare_blind_grow(struct burn_drive *d, struct burn_disc **disc,
|
||||
struct isoburn_imgen_opts *opts,
|
||||
struct burn_drive *out_drive, int nwa);
|
||||
int isoburn_prepare_blind_grow(struct burn_drive *in_drive,
|
||||
struct burn_disc **disc,
|
||||
struct isoburn_imgen_opts *opts,
|
||||
struct burn_drive *out_drive, int nwa);
|
||||
|
||||
|
||||
/**
|
||||
@ -1449,7 +1559,7 @@ int isoburn_drive_wrote_well(struct burn_drive *d);
|
||||
@param d The output drive to which the session was written
|
||||
@return 1 success , <=0 failure
|
||||
*/
|
||||
int isoburn_activate_session(struct burn_drive *drive);
|
||||
int isoburn_activate_session(struct burn_drive *d);
|
||||
|
||||
|
||||
/** Wait after normal end of operations until libisofs ended all write
|
||||
@ -1498,6 +1608,6 @@ void isoburn_finish(void);
|
||||
1 is emulated multi-session
|
||||
-1 is not suitable for isoburn
|
||||
*/
|
||||
int isoburn_needs_emulation(struct burn_drive *drive);
|
||||
int isoburn_needs_emulation(struct burn_drive *d);
|
||||
|
||||
|
||||
|
@ -5,14 +5,18 @@
|
||||
To compare tree /media/dvd and /original/dir :
|
||||
find /media/dvd -exec compare_file '{}' /media/dvd /original/dir ';'
|
||||
|
||||
Copyright 2008 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
Copyright 2008 - 2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2.
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
|
||||
cc -g -o compare_file compare_file.c
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
@ -126,11 +130,13 @@ int Compare_2_files(char *adr1, char *adr2, char *adrc, int flag)
|
||||
differs= 1;
|
||||
}
|
||||
if(s1.st_uid != s2.st_uid) {
|
||||
printf("%s : st_uid : %d <> %d\n", a, s1.st_uid, s2.st_uid);
|
||||
printf("%s : st_uid : %lu <> %lu\n",
|
||||
a, (unsigned long) s1.st_uid, (unsigned long) s2.st_uid);
|
||||
differs= 1;
|
||||
}
|
||||
if(s1.st_gid != s2.st_gid) {
|
||||
printf("%s : st_gid : %d <> %d\n", a, s1.st_gid, s2.st_gid);
|
||||
printf("%s : st_gid : %lu <> %lu\n",
|
||||
a, (unsigned long) s1.st_gid, (unsigned long) s2.st_gid);
|
||||
differs= 1;
|
||||
}
|
||||
if((S_ISCHR(s1.st_mode) && S_ISCHR(s2.st_mode)) ||
|
||||
@ -248,6 +254,12 @@ int main(int argc, char **argv)
|
||||
int ret, i, with_ctime= 1;
|
||||
char adr1[4096], adr2[4096], adrc[4096];
|
||||
|
||||
if(sizeof(off_t) < 8) {
|
||||
fprintf(stderr,
|
||||
"%s : FATAL : Compile time misconfiguration. sizeof(off_t) too small.\n\n",
|
||||
argv[0]);
|
||||
exit(4);
|
||||
}
|
||||
if(argc<4) {
|
||||
fprintf(stderr, "usage: %s path prefix1 prefix2\n", argv[0]);
|
||||
exit(2);
|
||||
@ -257,7 +269,7 @@ int main(int argc, char **argv)
|
||||
with_ctime= 0;
|
||||
else {
|
||||
fprintf(stderr, "%s : Option not recognized: '%s'\n", argv[0], argv[i]);
|
||||
exit(1);
|
||||
exit(2);
|
||||
}
|
||||
}
|
||||
|
||||
|
6
xorriso/AUTHORS_gnu_xorriso
Normal file
6
xorriso/AUTHORS_gnu_xorriso
Normal file
@ -0,0 +1,6 @@
|
||||
Derek Foreman
|
||||
Ben Jansens
|
||||
Thomas Schmitt
|
||||
Mario Danic
|
||||
Vreixo Formoso Lopes
|
||||
|
674
xorriso/COPYING_gnu_xorriso
Normal file
674
xorriso/COPYING_gnu_xorriso
Normal file
@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
27
xorriso/COPYRIGHT_gnu_xorriso
Normal file
27
xorriso/COPYRIGHT_gnu_xorriso
Normal file
@ -0,0 +1,27 @@
|
||||
Derek Foreman <derek@signalmarketing.com>
|
||||
Ben Jansens <xor@orodu.net>
|
||||
Thomas Schmitt <scdbackup@gmx.net>
|
||||
Mario Danic <mario.danic@gmail.com>,
|
||||
Vreixo Formoso <metalpain2002@yahoo.es>
|
||||
|
||||
GNU xorriso is a compilation of
|
||||
xorriso Copyright (C) 2007-2010 Thomas Schmitt
|
||||
libisoburn Copyright (C) 2007-2010 Vreixo Formoso, Thomas Schmitt
|
||||
libisofs Copyright (C) 2007-2010 Vreixo Formoso, Mario Danic, Thomas Schmitt
|
||||
libburn Copyright (C) 2002-2006 Derek Foreman, Ben Jansens
|
||||
2006-2010 Mario Danic, Thomas Schmitt
|
||||
from libburnia-project.org with a license derived from GPLv2+.
|
||||
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License version 3
|
||||
or later as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
263
xorriso/README
263
xorriso/README
@ -1,263 +0,0 @@
|
||||
------------------------------------------------------------------------------
|
||||
libburnia-project.org scdbackup.sourceforge.net/xorriso_eng.html
|
||||
------------------------------------------------------------------------------
|
||||
xorriso. By Thomas Schmitt <scdbackup@gmx.net>
|
||||
Integrated sub project of libburnia-project.org but also published via:
|
||||
http://scdbackup.sourceforge.net/xorriso_eng.html
|
||||
http://scdbackup.sourceforge.net/xorriso-0.4.1.tar.gz
|
||||
Copyright (C) 2006-2009 Thomas Schmitt, provided under GPL version 2.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
xorriso is a program which maps file objects from POSIX compliant
|
||||
filesystems into Rock Ridge enhanced ISO 9660 filesystems and allows
|
||||
session-wise manipulation of such filesystems. It can load the management
|
||||
information of existing ISO images and it writes the session results to
|
||||
optical media or to filesystem objects.
|
||||
Vice versa xorriso is able to restore file objects from ISO 9660 filesystems.
|
||||
|
||||
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
|
||||
incorporates the libraries of libburnia-project.org .
|
||||
|
||||
Currently it is fully supported on Linux with kernels >= 2.4 and on
|
||||
FreeBSD versions with ATAPI/CAM support enabled in the kernel, see atapicam(4).
|
||||
On other X/Open compliant systems there will only be POSIX i/o with disk
|
||||
file objects, but no direct MMC operation on CD/DVD/BD drives.
|
||||
|
||||
By using this software you agree to the disclaimer at the end of this text:
|
||||
"... without even the implied warranty ..."
|
||||
|
||||
|
||||
Compilation, First Glimpse, Installation
|
||||
|
||||
The most simple way to get xorriso from source code is the xorriso standalone
|
||||
tarball.
|
||||
|
||||
Prerequisites:
|
||||
The tarball contains anything that is needed except the following system
|
||||
components:
|
||||
libc, libpthread
|
||||
plus on FreeBSD: libiconv, libcam
|
||||
Optional at compile time are:
|
||||
libreadline and the readline-dev headers make dialog mode more convenient.
|
||||
on Linux: libacl and libacl-devel allow getting and setting ACLs.
|
||||
zlib and zlib-devel allow zisofs compression.
|
||||
If they were present at compile time, then the optional libraries have to
|
||||
be present at runtime, too.
|
||||
|
||||
Obtain xorriso-0.4.1.tar.gz, take it to a directory of your choice and do:
|
||||
|
||||
tar xzf xorriso-0.4.1.tar.gz
|
||||
cd xorriso-0.4.1
|
||||
|
||||
Within that directory execute:
|
||||
|
||||
./configure --prefix=/usr
|
||||
make
|
||||
|
||||
This will produce a binary named
|
||||
./xorriso/xorriso
|
||||
|
||||
which you may strip to reduce it in size
|
||||
strip ./xorriso/xorriso
|
||||
|
||||
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,
|
||||
or you may execute as superuser:
|
||||
make install
|
||||
|
||||
For general concepts, options and usage examples see
|
||||
man 1 xorriso
|
||||
|
||||
This man page is part of the tarball as
|
||||
xorriso/xorriso.1
|
||||
You may get a first glimpse by
|
||||
man ./xorriso/xorriso.1
|
||||
|
||||
It gets installed with "make install" but may also be placed manually in the
|
||||
./man1 directory below one of the directories mentioned in environment
|
||||
variable $MANPATH.
|
||||
|
||||
The installation creates several alias links pointing to the xorriso binary:
|
||||
xorrisofs starts xorriso with -as mkisofs emulation already enabled
|
||||
xorrecord starts xorriso with -as cdrecord emulation 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.
|
||||
Other deliberate dependency reduction options of ./configure are:
|
||||
--disable-libacl avoid use of ACL functions like acl_to_text()
|
||||
--disable-xattr avoid use of xattr functions like listxattr()
|
||||
--disable-zlib avoid use of zlib functions like compress2()
|
||||
|
||||
xorriso allows to use external processes as file content filters. This is
|
||||
a potential security risk which may be avoided by ./configure option
|
||||
--disable-external-filters
|
||||
|
||||
By default the filter feature is disabled if effective user id and real
|
||||
user id differ. This ban can be lifted by
|
||||
--enable-external-filters-setuid
|
||||
|
||||
If you want xorriso to report a "Build timestamp" with its option -version:
|
||||
make buildstamped
|
||||
|
||||
|
||||
Drives and Disk File Objects
|
||||
|
||||
The user of xorriso needs rw-permission for the CD burner device.
|
||||
A list of rw-accessible drives can be obtained by
|
||||
|
||||
xorriso -devices
|
||||
|
||||
CD devices which offer no rw-permission are invisible to normal users.
|
||||
The superuser should be able to see any usable drive and then set the
|
||||
permissions as needed.
|
||||
|
||||
The output of xorriso -devices might look like
|
||||
|
||||
0 -dev '/dev/sr0' rwrw-- : 'TSSTcorp' 'CDDVDW SH-S203B'
|
||||
1 -dev '/dev/hda' rwrw-- : 'HL-DT-ST' 'DVD-ROM GDR8162B'
|
||||
|
||||
Full and insecure enabling of both for everybody would look like
|
||||
chmod a+rw /dev/sr0 /dev/hda
|
||||
This is equivalent to the traditional setup chmod a+x,u+s cdrecord.
|
||||
|
||||
I strongly discourage to run xorriso with setuid root or via sudo !
|
||||
It is not checked for the necessary degree of hacker safety.
|
||||
|
||||
Consider to put all authorized users into group "floppy", to chgrp the
|
||||
device file to that group and to disallow w-access to others.
|
||||
|
||||
|
||||
A possible source of problems are hald or other automounters.
|
||||
If you can spot a process "hald-addon-storage" with the address of
|
||||
your desired drive, then consider to kill it.
|
||||
|
||||
If you cannot get rid of the automounter that easily, try whether it helps
|
||||
to always load the drive tray manually before starting a write run of
|
||||
xorriso. Wait until the drive light is off.
|
||||
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
|
||||
output drives. By default paths to files under /dev are accepted only if the
|
||||
device represents a real optical drive. Other device files may be addressed
|
||||
by prepending "stdio:" to the path.
|
||||
Like:
|
||||
xorriso -dev stdio:/dev/sdb ...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
|
||||
which is accessible by generic SCSI/MMC commands.
|
||||
|
||||
|
||||
Testing
|
||||
|
||||
We are quite sure that libisofs produces accurate representations of the disk
|
||||
files. This opinion is founded on a lot of test burns and checks by a little
|
||||
test program which compares files from the mounted image with the orignals
|
||||
on disk. It uses the normal POSIX filesystem calls, i.e. no libburnia stuff.
|
||||
|
||||
This program is not installed systemwide but stays in the installation
|
||||
directory of the xorriso tarball as test/compare_file . Usually it is
|
||||
run as -exec payload of a find command. It demands at least three arguments:
|
||||
The path of the first file to compare, the prefix1 to be cut off from path
|
||||
and the prefix2 which gets prepended afterwards to obtain the path of the
|
||||
second file to compare.
|
||||
As further argument there can be -no_ctime which suppresses the comparison
|
||||
of ctime date stamps.
|
||||
The exit value is 0 if no difference was detected, non-0 else.
|
||||
|
||||
Example: After
|
||||
xorriso ... -pathspecs on -add /=/original/dir -- -commit_eject all
|
||||
mount /media/dvd
|
||||
cd test
|
||||
compare tree /media/dvd with tree /original/dir :
|
||||
find /original/dir -exec ./compare_file '{}' /original/dir /media/dvd ';' \
|
||||
| less
|
||||
and vice versa:
|
||||
find /media/dvd -exec ./compare_file '{}' /media/dvd /original/dir ';' \
|
||||
| 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
|
||||
|
||||
xorriso is based on libisofs which does ISO 9600 filesystem aspects and on
|
||||
libburn which does the input and output aspects. Parts of this foundation
|
||||
are accessed via libisoburn, which is closely related to xorriso.
|
||||
|
||||
libisoburn provides two services:
|
||||
- Encapsulation of coordination between libisofs and libburn.
|
||||
- Emulation of ISO 9660 multi-session on overwriteable media
|
||||
or random access files.
|
||||
|
||||
The sourcecode of all three libraries is included in the xorriso standalone
|
||||
tarball. It is compiled with xorriso and linked statically.
|
||||
But you may as well get and install releases of libburn and libisofs, in order
|
||||
to be able to install a release of libisoburn which produces libisoburn.so.1
|
||||
and a matching dynamically linked xorriso binary.
|
||||
This binary is leaner but depends on properly installed libraries of suitable
|
||||
revision.
|
||||
|
||||
Dynamic library and compile time header requirements for libisoburn-0.4.0 :
|
||||
- libburn.so.4 , version libburn-0.6.4 or higher
|
||||
- libisofs.so.6 , version libisofs-0.6.20 or higher
|
||||
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
|
||||
setup unless you have reason to enforce a newer bug fix level.
|
||||
|
||||
Standalone xorriso has less runtime dependencies and can be moved more freely.
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License version 2 as
|
||||
published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
Based on and sub project of:
|
||||
libburnia-project.org
|
||||
By Mario Danic <mario.danic@gmail.com>,
|
||||
Vreixo Formoso <metalpain2002@yahoo.es>
|
||||
Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (C) 2006-2009 Mario Danic, Vreixo Formoso, Thomas Schmitt.
|
||||
|
||||
libburnia-project.org is inspired by and in other components still containing
|
||||
parts of old
|
||||
Libburn. By Derek Foreman <derek@signalmarketing.com> and
|
||||
Ben Jansens <xor@orodu.net>
|
||||
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
|
||||
|
428
xorriso/README_gnu_xorriso
Normal file
428
xorriso/README_gnu_xorriso
Normal file
@ -0,0 +1,428 @@
|
||||
------------------------------------------------------------------------------
|
||||
Contribution of libburnia-project.org to the GNU Operating System
|
||||
------------------------------------------------------------------------------
|
||||
GNU xorriso. By Thomas Schmitt <scdbackup@gmx.net>
|
||||
Derived from and supported by libburnia-project.org, published via:
|
||||
http://www.gnu.org/software/xorriso/xorriso_eng.html
|
||||
ftp://ftp.gnu.org/gnu/xorriso/xorriso-0.6.0.tar.gz
|
||||
Provided under GPL version 3 or later. No warranty.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
xorriso is a program which copies file objects from POSIX compliant
|
||||
filesystems into Rock Ridge enhanced ISO 9660 filesystems and allows
|
||||
session-wise manipulation of such filesystems. It can load the management
|
||||
information of existing ISO images and it writes the session results to
|
||||
optical media or to filesystem objects.
|
||||
Vice versa xorriso is able to restore file objects from ISO 9660 filesystems.
|
||||
|
||||
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
|
||||
incorporates the libraries of libburnia-project.org .
|
||||
|
||||
Currently it is fully supported on GNU/Linux with kernels >= 2.4,
|
||||
on FreeBSD with ATAPI/CAM support enabled in the kernel, see atapicam(4),
|
||||
and on OpenSolaris (tested with kernel 5.11).
|
||||
On other X/Open compliant systems there will only be POSIX i/o with disk
|
||||
file objects, but no direct MMC operation on CD/DVD/BD drives.
|
||||
|
||||
By using this software you agree to the disclaimer at the end of this text:
|
||||
"... without even the implied warranty ..."
|
||||
|
||||
|
||||
Compilation, First Glimpse, Installation
|
||||
|
||||
The most simple way to get xorriso from source code is the GNU xorriso tarball.
|
||||
|
||||
Prerequisites:
|
||||
The tarball contains everything that is needed except the following system
|
||||
components:
|
||||
libc, libpthread
|
||||
plus on FreeBSD: libiconv, libcam, IDE and SATA drives need atapicam
|
||||
Optional at compile time are:
|
||||
libreadline and the readline-dev headers make dialog mode more convenient.
|
||||
zlib and zlib-devel allow zisofs compression.
|
||||
on GNU/Linux: libacl and libacl-devel allow getting and setting ACLs.
|
||||
If they were present at compile time, then the optional libraries have to
|
||||
be present at runtime, too.
|
||||
|
||||
Obtain xorriso-0.6.0.tar.gz, take it to a directory of your choice and do:
|
||||
|
||||
tar xzf xorriso-0.6.0.tar.gz
|
||||
cd xorriso-0.6.0
|
||||
|
||||
Within that directory execute:
|
||||
|
||||
./configure --prefix=/usr
|
||||
make
|
||||
|
||||
This will produce a binary named
|
||||
./xorriso/xorriso
|
||||
|
||||
If you want xorriso to report a "Build timestamp" with its option -version :
|
||||
make buildstamped
|
||||
|
||||
You may strip the binary to reduce it in size
|
||||
strip ./xorriso/xorriso
|
||||
|
||||
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,
|
||||
or you may execute as superuser:
|
||||
make install
|
||||
|
||||
For general concepts, options and usage examples see
|
||||
info xorriso
|
||||
or
|
||||
man 1 xorriso
|
||||
|
||||
The documents are part of the tarball as
|
||||
xorriso/xorriso.info
|
||||
xorriso/xorriso.1
|
||||
Original source text of both is
|
||||
xorriso/xorriso.texi
|
||||
You may get a first glimpse by
|
||||
info ./xorriso/xorriso.info
|
||||
man ./xorriso/xorriso.1
|
||||
|
||||
The installation creates several alias links pointing to the xorriso binary:
|
||||
xorrisofs starts xorriso with -as mkisofs emulation already enabled
|
||||
xorrecord starts xorriso with -as cdrecord emulation 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.
|
||||
Other deliberate dependency reduction options of ./configure are:
|
||||
--disable-libacl avoid use of ACL functions like acl_to_text()
|
||||
--disable-xattr avoid use of xattr functions like listxattr()
|
||||
--disable-zlib avoid use of zlib functions like compress2()
|
||||
|
||||
xorriso brings own system adapters which allow burning optical media on
|
||||
GNU/Linux, FreeBSD, Solaris.
|
||||
Alternatively it can use libcdio-0.83 or later for sending commands to
|
||||
optical drives:
|
||||
--enable-libcdio
|
||||
|
||||
xorriso allows to use external processes as file content filters. This is
|
||||
a potential security risk which may be avoided by ./configure option
|
||||
--disable-external-filters
|
||||
|
||||
By default the filter feature is disabled if effective user id and real
|
||||
user id differ. This ban can be lifted by
|
||||
--enable-external-filters-setuid
|
||||
|
||||
Sometimes xorriso will yield better write performance on GNU/Linux if 64 KB are
|
||||
transmitted in each write operation rather than 32 KB. See option -dvd_obs .
|
||||
64k can be made default at configure time by:
|
||||
--enable-dvd-obs-64k
|
||||
|
||||
For xorriso -as cdrecord emulation only:
|
||||
In some situations GNU/Linux may deliver a better write performance to drives
|
||||
if the track input is read with O_DIRECT (see man 2 open). The included libburn
|
||||
and the cdrecord emulation of xorriso can be told to use this peculiar read
|
||||
mode by:
|
||||
--enable-track-src-odirect
|
||||
|
||||
|
||||
Drives and Disk File Objects
|
||||
|
||||
The user of libisoburn applications needs rw-permission for the CD/DVD/BD
|
||||
drives which shall be used, even if only reading is intended.
|
||||
A list of rw-accessible drives can be obtained by
|
||||
|
||||
xorriso -devices
|
||||
|
||||
CD devices which offer not enough permission are invisible to normal users.
|
||||
The superuser should be able to see any usable drive and then set the
|
||||
permissions as needed.
|
||||
On Linux and FreeBSD, rw-permissions are needed.
|
||||
On Solaris, the privilege "sys_devices" and r-permission are needed.
|
||||
|
||||
The output of xorriso -devices might look like
|
||||
|
||||
0 -dev '/dev/sr0' rwrw-- : 'TSSTcorp' 'CDDVDW SH-S203B'
|
||||
1 -dev '/dev/hda' rwrw-- : 'HL-DT-ST' 'DVD-ROM GDR8162B'
|
||||
|
||||
On Linux, full and insecure enabling of both for everybody would look like
|
||||
chmod a+rw /dev/sr0 /dev/hda
|
||||
This is equivalent to the traditional setup chmod a+x,u+s cdrecord.
|
||||
|
||||
On FreeBSD, device permissions are to be set in /etc/devfs.rules.
|
||||
On Solaris, pfexec privileges may be restricted to "basic,sys_devices".
|
||||
See below "System Dependend Drive Permission Examples".
|
||||
|
||||
I strongly discourage to run xorriso with setuid root or via sudo !
|
||||
It is not checked for the necessary degree of hacker safety.
|
||||
Better consider to grant the necessary permissions to group "floppy"
|
||||
and to add users to it.
|
||||
|
||||
|
||||
A possible source of problems are hald or other automounters.
|
||||
If you can spot a process "hald-addon-storage" with the address of
|
||||
your desired drive, then consider to kill it.
|
||||
|
||||
If you cannot get rid of the automounter that easily, try whether it helps
|
||||
to always load the drive tray manually before starting a write run of
|
||||
xorriso. Wait until the drive light is off.
|
||||
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
|
||||
output drives. By default paths to files under /dev are accepted only if the
|
||||
device represents a real optical drive. Other device files may be addressed
|
||||
by prepending "stdio:" to the path.
|
||||
Like:
|
||||
xorriso -dev stdio:/dev/sdb ...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
|
||||
which is accessible by generic SCSI/MMC commands.
|
||||
|
||||
|
||||
Testing
|
||||
|
||||
We are quite sure that libisofs produces accurate representations of the disk
|
||||
files. This opinion is founded on a lot of test burns and checks by a little
|
||||
test program which compares files from the mounted image with the orignals
|
||||
on disk. It uses the normal POSIX filesystem calls, i.e. no libburnia stuff.
|
||||
|
||||
This program is not installed systemwide but stays in the installation
|
||||
directory of the xorriso tarball as test/compare_file . Usually it is
|
||||
run as -exec payload of a find command. It demands at least three arguments:
|
||||
The path of the first file to compare, the prefix1 to be cut off from path
|
||||
and the prefix2 which gets prepended afterwards to obtain the path of the
|
||||
second file to compare.
|
||||
As further argument there can be -no_ctime which suppresses the comparison
|
||||
of ctime date stamps.
|
||||
The exit value is 0 if no difference was detected, non-0 else.
|
||||
|
||||
Example: After
|
||||
xorriso ... -pathspecs on -add /=/original/dir -- -commit_eject all
|
||||
mount /media/dvd
|
||||
cd test
|
||||
compare tree /media/dvd with tree /original/dir :
|
||||
find /original/dir -exec ./compare_file '{}' /original/dir /media/dvd ';' \
|
||||
| less
|
||||
and vice versa:
|
||||
find /media/dvd -exec ./compare_file '{}' /media/dvd /original/dir ';' \
|
||||
| less
|
||||
|
||||
|
||||
File Formats
|
||||
|
||||
Sector Maps
|
||||
|
||||
Sector maps 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.
|
||||
|
||||
Checksum Tags
|
||||
|
||||
Checksum tags are data blocks inside an ISO 9660 image which do not belong to
|
||||
any file but rather tell the MD5 of a certain range of data blocks.
|
||||
|
||||
The superblock checksum tag is written after the ECMA-119 volume descriptors.
|
||||
The tree checksum tag is written after the ECMA-119 directory entries.
|
||||
The session checksum tag is written after all payload including the checksum
|
||||
array. (Then follows eventual padding.)
|
||||
|
||||
The tags are single lines of printable text, padded by 0 bytes. They have
|
||||
the following format:
|
||||
|
||||
Tag_id pos=# range_start=# range_size=# [session_start|next=#] md5=# self=#\n
|
||||
|
||||
Parameters md5= and self= are 32 digit hex, the others are decimal numbers.
|
||||
|
||||
Tag_id distinguishes the following tag types
|
||||
"libisofs_rlsb32_checksum_tag_v1" Relocated 64 kB superblock tag
|
||||
"libisofs_sb_checksum_tag_v1" Superblock tag
|
||||
"libisofs_tree_checksum_tag_v1" Directory tree tag
|
||||
"libisofs_checksum_tag_v1" Session end tag
|
||||
|
||||
A relocated superblock may appear at LBA 0 of an image which was produced for
|
||||
being stored in a disk file or on overwriteable media (e.g. DVD+R, BD-RE).
|
||||
xorriso records the first session at LBA 32. An eventual follow-up session
|
||||
begins at the next block address which is divisible by 32 and higher than the
|
||||
address of the previous session's end tag. Normally no session starts after the
|
||||
address given by relocated superblock parameter session_start=.
|
||||
Session oriented media like CD-R[W], DVD+R, BD-R will have no relocated
|
||||
superblock but rather bear a table-of-content on media level.
|
||||
|
||||
A tag is valid if pos= tells its own block address and self= tells its own MD5
|
||||
up to the last hex digit of md5=. range_start= tells the first block that is
|
||||
covered by md5=, range_size= tells the number of blocks covered by md5=.
|
||||
Relocated superblocks tell the block address of their session by session_start=.
|
||||
Superblock and tree tag tell the block address of the next tag by next=.
|
||||
The newline character at the end is mandatory.
|
||||
|
||||
|
||||
libisoburn
|
||||
|
||||
xorriso is based on libisofs which does ISO 9600 filesystem aspects and on
|
||||
libburn which does the input and output aspects. Parts of this foundation
|
||||
are accessed via libisoburn, which is closely related to xorriso.
|
||||
|
||||
libisoburn provides several services:
|
||||
- Encapsulation of coordination between libisofs and libburn.
|
||||
- Emulation of ISO 9660 multi-session on overwriteable media
|
||||
or random access files.
|
||||
- Implementation of the xorriso API.
|
||||
|
||||
The sourcecode of all three libraries is included in the xorriso standalone
|
||||
tarball. It is compiled with xorriso and linked statically.
|
||||
But you may as well get and install releases of libburn and libisofs, in order
|
||||
to be able to install a release of libisoburn which produces libisoburn.so.1
|
||||
and a matching dynamically linked xorriso binary.
|
||||
This binary is very lean but depends on properly installed libraries of
|
||||
suitable revision.
|
||||
|
||||
Dynamic library and compile time header requirements for libisoburn-0.6.0 :
|
||||
- libburn.so.4 , version libburn-0.8.4 or higher
|
||||
- libisofs.so.6 , version libisofs-0.6.34 or higher
|
||||
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
|
||||
setup unless you have reason to enforce a newer bug fix level.
|
||||
|
||||
GNU xorriso has less runtime dependencies and can be moved more freely.
|
||||
|
||||
|
||||
System Dependend Drive Permission Examples
|
||||
|
||||
Accessing the optical drives requires privileges which usually are granted
|
||||
only to the superuser. GNU/Linux, FreeBSD and Solaris offer quite different
|
||||
approaches for avoiding the need for unrestricted privileges.
|
||||
|
||||
First check whether some friendly system setting already allows you to
|
||||
access the drives as normal user:
|
||||
xorriso -devices
|
||||
Those drives of which you see address and type strings are already usable.
|
||||
|
||||
If there remain drives invisible which the superuser can see by the same
|
||||
command, then the following examples might help:
|
||||
|
||||
---------------------
|
||||
On all three systems:
|
||||
---------------------
|
||||
Add the authorized users of CD drives to group "floppy" in /etc/group.
|
||||
If missing: create this group.
|
||||
Changes to /etc/group often only affect new login sessions. So log out and in
|
||||
before making the first tests.
|
||||
|
||||
-------------
|
||||
On GNU/Linux:
|
||||
-------------
|
||||
Allow rw-access to the drives
|
||||
chgrp floppy /dev/sr0 /dev/sr1
|
||||
chmod g+rw /dev/sr0 /dev/sr1
|
||||
It might be necessary to perform chgrp and chmod after each reboot or to
|
||||
edit distro dependent device configuration files for permanent settings.
|
||||
|
||||
-----------
|
||||
On FreeBSD:
|
||||
-----------
|
||||
Edit /etc/devfs.rules and make sure to have these lines
|
||||
[localrules=10]
|
||||
add path 'acd*' mode 0664 group floppy
|
||||
add path 'cd*' mode 0664 group floppy
|
||||
add path 'pass*' mode 0664 group floppy
|
||||
add path 'xpt*' mode 0664 group floppy
|
||||
[localrules=5]
|
||||
add path 'pass*' mode 0664 group floppy
|
||||
add path 'cd*' mode 0664 group floppy
|
||||
add path 'xpt*' mode 0664 group floppy
|
||||
add path 'acd*' mode 0664 group floppy
|
||||
|
||||
Edit /etc/rc.conf and add the following line if missing
|
||||
devfs_system_ruleset="localrules"
|
||||
|
||||
This gets into effect by reboot or by command
|
||||
/etc/rc.d/devfs start
|
||||
|
||||
-----------
|
||||
On Solaris:
|
||||
-----------
|
||||
Run xorriso by
|
||||
pfexec xorriso ...arguments...
|
||||
|
||||
The following settings will make pfexec keep original UID and EUID and prevent
|
||||
most superuser powers. Be aware that you still can manipulate all device files
|
||||
if you have the file permissions for that.
|
||||
Full root privileges for xorriso can then be aquired only by command su.
|
||||
|
||||
Edit /etc/security/exec_attr and add this line to the other "Media Backup"
|
||||
lines:
|
||||
Media Backup:solaris:cmd:::/usr/local/bin/xorriso:privs=basic,sys_devices
|
||||
Edit /etc/user_attr and add profile "Media Backup" to the user's line:
|
||||
thomas::::profiles=Media Backup,Primary Administrator;roles=root
|
||||
See also man privileges, man exec_attr, man user_attr.
|
||||
|
||||
Then allow the group r-access to the drives
|
||||
pfexec chgrp floppy /dev/rdsk/c3t0d0s2 /dev/rdsk/c4t0d0s2
|
||||
pfexec chmod g+r /dev/rdsk/c3t0d0s2 /dev/rdsk/c4t0d0s2
|
||||
The last two commands have to be executed after each boot. I do not know
|
||||
the relevant device configuration files yet.
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License version 3 or later
|
||||
as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
GNU xorriso is feature-wise equivalent to the dynamic compilation of
|
||||
libburnia libraries and libburnia program xorriso.
|
||||
It restricts itself to a technical form where the legal commitments of the
|
||||
libburnia project and the legal intentions of FSF match completely.
|
||||
|
||||
Libburnia project is committed to provide support for this copy in the same
|
||||
way as for its own software releases. It is further committed to keep its
|
||||
own licenses open for obtaining future copies under GPLv2+.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
libburnia program xorriso is based on and sub project of:
|
||||
libburnia-project.org
|
||||
By Mario Danic <mario.danic@gmail.com>, libburn, libisofs
|
||||
Vreixo Formoso <metalpain2002@yahoo.es>, libisofs, libisoburn
|
||||
Thomas Schmitt <scdbackup@gmx.net>, libburn, libisofs,
|
||||
libisoburn, xorriso
|
||||
Copyright (C) 2006-2010 Mario Danic, Vreixo Formoso, Thomas Schmitt.
|
||||
|
||||
libburnia-project.org is inspired by and in libburn still containing parts
|
||||
of old
|
||||
Libburn. By Derek Foreman <derek@signalmarketing.com> and
|
||||
Ben Jansens <xor@orodu.net>
|
||||
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
This text itself is
|
||||
Copyright (c) 2007 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
and is freely distributable.
|
||||
It shall only be modified in sync with the technical properties of xorriso.
|
||||
If you make use of the license to derive modified versions of xorriso
|
||||
then you are entitled to modify this text under that same license.
|
||||
|
1000
xorriso/aux_objects.c
Normal file
1000
xorriso/aux_objects.c
Normal file
File diff suppressed because it is too large
Load Diff
181
xorriso/aux_objects.h
Normal file
181
xorriso/aux_objects.h
Normal file
@ -0,0 +1,181 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of classes:
|
||||
|
||||
- SplitparT which represents byte intervals of data files.
|
||||
|
||||
- DirseQ which crawls along a directory's content list.
|
||||
|
||||
- ExclusionS which manages the list of excluded file paths and
|
||||
leaf patterns.
|
||||
|
||||
- Xorriso_lsT which provides a generic double-linked list.
|
||||
|
||||
- LinkiteM, PermiteM which temporarily record relations and states.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_auxobj_includeD
|
||||
#define Xorriso_pvt_auxobj_includeD yes
|
||||
|
||||
struct SplitparT;
|
||||
|
||||
int Splitparts_new(struct SplitparT **o, int count, int flag);
|
||||
|
||||
int Splitparts_destroy(struct SplitparT **o, int count, int flag);
|
||||
|
||||
int Splitparts_set(struct SplitparT *o, int idx,
|
||||
char *name, int partno, int total_parts,
|
||||
off_t offset, off_t bytes, off_t total_bytes, int flag);
|
||||
|
||||
int Splitparts_get(struct SplitparT *o, int idx, char **name, int *partno,
|
||||
int *total_parts, off_t *offset, off_t *bytes,
|
||||
off_t *total_bytes, int flag);
|
||||
|
||||
int Splitpart__parse(char *name, int *partno, int *total_parts,
|
||||
off_t *offset, off_t *bytes, off_t *total_bytes, int flag);
|
||||
|
||||
int Splitpart__is_part_path(char *path, int flag);
|
||||
|
||||
int Splitpart__compose(char *adr, int partno, int total_parts,
|
||||
off_t offset, off_t bytes, off_t total_bytes, int flag);
|
||||
|
||||
int Splitpart__read_next_num(char *base_pt, char **next_pt, off_t *num,
|
||||
int flag);
|
||||
|
||||
int Splitparts_sort(struct SplitparT *o, int count, int flag);
|
||||
|
||||
|
||||
|
||||
struct DirseQ;
|
||||
|
||||
int Dirseq_new(struct DirseQ **o, char *adr, int flag);
|
||||
|
||||
int Dirseq_destroy(struct DirseQ **o, int flag);
|
||||
|
||||
int Dirseq_next_adr(struct DirseQ *o, char reply[SfileadrL], int flag);
|
||||
|
||||
int Dirseq_rewind(struct DirseQ *o, 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)
|
||||
bit2= attach data directly by pointer rather than by copying
|
||||
@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 see Xorriso_lst_new_binary
|
||||
@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 entry Contains as input a pointer to a pointer to any existing
|
||||
list item. As output this list item pointer may be
|
||||
changed to the address of the new list item:
|
||||
if ((*entry == 0) || (flag & 1))
|
||||
@param data An array of bytes to be copied into the new object
|
||||
@param data_len Number of bytes to be copied
|
||||
@param flag Bitfield for control purposes
|
||||
bit0= Return new object address in *entry
|
||||
bit1= do not copy data (e.g. because *data is invalid)
|
||||
bit2= attach data directly by pointer rather than by copying
|
||||
bit2= attach data directly by pointer rather than by copying
|
||||
@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);
|
||||
|
||||
|
||||
struct Xorriso_lsT *Xorriso_lst_get_next(struct Xorriso_lsT *entry, int flag);
|
||||
|
||||
struct Xorriso_lsT *Xorriso_lst_get_prev(struct Xorriso_lsT *entry, int flag);
|
||||
|
||||
char *Xorriso_lst_get_text(struct Xorriso_lsT *entry, int flag);
|
||||
|
||||
int Xorriso_lst_detach_text(struct Xorriso_lsT *entry, int flag);
|
||||
|
||||
|
||||
|
||||
int Exclusions_new(struct ExclusionS **o, int flag);
|
||||
|
||||
int Exclusions_destroy(struct ExclusionS **o, int flag);
|
||||
|
||||
int Exclusions_get_descrs(struct ExclusionS *o,
|
||||
struct Xorriso_lsT **not_paths_descr,
|
||||
struct Xorriso_lsT **not_leafs_descr, int flag);
|
||||
|
||||
/* @param flag bit0= whole subtree is banned with -not_paths
|
||||
@return 0=no match , 1=not_paths , 2=not_leafs, <0=error
|
||||
*/
|
||||
int Exclusions_match(struct ExclusionS *o, char *abs_path, int flag);
|
||||
|
||||
int Exclusions_add_not_leafs(struct ExclusionS *o, char *not_leafs_descr,
|
||||
regex_t *re, int flag);
|
||||
|
||||
int Exclusions_add_not_paths(struct ExclusionS *o, int descrc, char **descrs,
|
||||
int pathc, char **paths, int flag);
|
||||
|
||||
|
||||
|
||||
struct LinkiteM; /* Trace of hops during symbolic link resolution */
|
||||
|
||||
int Linkitem_new(struct LinkiteM **o, char *link_path, dev_t target_dev,
|
||||
ino_t target_ino, struct LinkiteM *next, int flag);
|
||||
|
||||
int Linkitem_destroy(struct LinkiteM **o, int flag);
|
||||
|
||||
int Linkitem_reset_stack(struct LinkiteM **o, struct LinkiteM *to, int flag);
|
||||
|
||||
int Linkitem_find(struct LinkiteM *stack, dev_t target_dev, ino_t target_ino,
|
||||
struct LinkiteM **result, int flag);
|
||||
|
||||
int Linkitem_get_link_count(struct LinkiteM *item, int flag);
|
||||
|
||||
|
||||
struct PermiteM; /* Stack of temporarily altered access permissions */
|
||||
|
||||
int Permstack_push(struct PermiteM **o, char *disk_path, struct stat *stbuf,
|
||||
int flag);
|
||||
|
||||
int Permstack_pop(struct PermiteM **o, struct PermiteM *stopper,
|
||||
struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_auxobj_includeD */
|
||||
|
570
xorriso/base_obj.c
Normal file
570
xorriso/base_obj.c
Normal file
@ -0,0 +1,570 @@
|
||||
|
||||
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains functions which are needed to read data
|
||||
from ISO image.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "xorriso.h"
|
||||
#include "xorriso_private.h"
|
||||
|
||||
#include "base_obj.h"
|
||||
#include "lib_mgt.h"
|
||||
|
||||
|
||||
|
||||
/* See Xorriso__preset_signal_behavior() */
|
||||
static int Xorriso_signal_behavioR= 1;
|
||||
|
||||
|
||||
void Xorriso__version(int *major, int *minor, int *micro)
|
||||
{
|
||||
*major= Xorriso_header_version_majoR;
|
||||
*minor= Xorriso_header_version_minoR;
|
||||
*micro= Xorriso_header_version_micrO;
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__is_compatible(int major, int minor, int micro, int flag)
|
||||
{
|
||||
int own_major, own_minor, own_micro;
|
||||
|
||||
Xorriso__version(&own_major, &own_minor, &own_micro);
|
||||
return(own_major > major ||
|
||||
(own_major == major && (own_minor > minor ||
|
||||
(own_minor == minor && own_micro >= micro))));
|
||||
}
|
||||
|
||||
|
||||
char *Xorriso__get_patch_level_text(int flag)
|
||||
{
|
||||
return(Xorriso_program_patch_leveL);
|
||||
}
|
||||
|
||||
|
||||
/** The list of startup file names */
|
||||
#define Xorriso_rc_nuM 4
|
||||
|
||||
static char Xorriso_sys_rc_nameS[Xorriso_rc_nuM][80]= {
|
||||
"/etc/default/xorriso",
|
||||
"/etc/opt/xorriso/rc",
|
||||
"/etc/xorriso/xorriso.conf",
|
||||
"placeholder for $HOME/.xorrisorc"
|
||||
};
|
||||
|
||||
|
||||
int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag)
|
||||
{
|
||||
int i, ret;
|
||||
struct XorrisO *m;
|
||||
char leafname[SfileadrL];
|
||||
|
||||
*xorriso= m= TSOB_FELD(struct XorrisO,1);
|
||||
if(m==NULL)
|
||||
return(-1);
|
||||
m->libs_are_started= 0;
|
||||
strncpy(m->progname,progname,sizeof(m->progname)-1);
|
||||
m->progname[sizeof(m->progname)-1]= 0;
|
||||
if(getcwd(m->initial_wdx,sizeof(m->initial_wdx)-1)==NULL)
|
||||
m->initial_wdx[0]= 0;
|
||||
m->no_rc= 0;
|
||||
m->argument_emulation= 0;
|
||||
|
||||
m->rc_filename_count= Xorriso_rc_nuM;
|
||||
for(i=0;i<m->rc_filename_count-1;i++)
|
||||
strcpy(m->rc_filenames[i],Xorriso_sys_rc_nameS[i]);
|
||||
m->rc_filenames[m->rc_filename_count-1][0]= 0;
|
||||
m->mkisofsrc_done= 0;
|
||||
|
||||
m->wdi[0]= 0;
|
||||
strcpy(m->wdx, m->initial_wdx);
|
||||
m->did_something_useful= 0;
|
||||
m->add_plainly= 0;
|
||||
m->split_size= 0;
|
||||
strcpy(m->list_delimiter, "--");
|
||||
m->ino_behavior= 7;
|
||||
m->do_joliet= 0;
|
||||
m->do_aaip= 0;
|
||||
m->do_md5= 0;
|
||||
m->no_emul_toc= 0;
|
||||
m->scdbackup_tag_name[0]= 0;
|
||||
m->scdbackup_tag_time[0]= 0;
|
||||
m->scdbackup_tag_written[0]= 0;
|
||||
m->scdbackup_tag_listname[0]= 0;
|
||||
m->relax_compliance= 0;
|
||||
m->do_follow_pattern= 1;
|
||||
m->do_follow_param= 0;
|
||||
m->do_follow_links= 0;
|
||||
m->follow_link_limit= 100;
|
||||
m->do_follow_mount= 1;
|
||||
m->do_global_uid= 0;
|
||||
m->global_uid= 0;
|
||||
strcpy(m->volid, "ISOIMAGE");
|
||||
m->volid_default= 1;
|
||||
m->loaded_volid[0]= 0;
|
||||
m->assert_volid[0]= 0;
|
||||
m->assert_volid_sev[0]= 0;
|
||||
m->publisher[0]= 0;
|
||||
m->application_id[0]= 0;
|
||||
m->system_id[0]= 0;
|
||||
m->volset_id[0]= 0;
|
||||
m->copyright_file[0]= 0;
|
||||
m->biblio_file[0]= 0;
|
||||
m->abstract_file[0]= 0;
|
||||
m->session_logfile[0]= 0;
|
||||
m->session_lba= -1;
|
||||
m->session_blocks= 0;
|
||||
m->do_global_gid= 0;
|
||||
m->global_gid= 0;
|
||||
m->do_global_mode= 0;
|
||||
m->global_dir_mode= 0555;
|
||||
m->global_file_mode= 0444;
|
||||
m->filters= NULL;
|
||||
m->filter_list_closed= 0;
|
||||
m->zlib_level_default= m->zlib_level= 6;
|
||||
m->zisofs_block_size= m->zisofs_block_size_default= (1 << 15);
|
||||
m->zisofs_by_magic= 0;
|
||||
m->do_overwrite= 2;
|
||||
m->do_reassure= 0;
|
||||
m->drive_blacklist= NULL;
|
||||
m->drive_greylist= NULL;
|
||||
m->drive_whitelist= NULL;
|
||||
m->toc_emulation_flag= 0;
|
||||
m->image_start_mode= 0;
|
||||
m->image_start_value[0]= 0;
|
||||
m->drives_exclusive= 1;
|
||||
m->do_calm_drive= 1;
|
||||
m->indev[0]= 0;
|
||||
m->in_drive_handle= NULL;
|
||||
m->in_volset_handle= NULL;
|
||||
m->in_charset= NULL;
|
||||
m->isofs_st_out= time(0) - 1;
|
||||
m->indev_is_exclusive= 1;
|
||||
m->isofs_st_in= 0;
|
||||
m->volset_change_pending= 0;
|
||||
m->no_volset_present= 0;
|
||||
m->in_sector_map= NULL;
|
||||
m->check_media_default= NULL;
|
||||
m->check_media_bad_limit= Xorriso_read_quality_invaliD;
|
||||
m->outdev[0]= 0;
|
||||
m->out_drive_handle= NULL;
|
||||
m->out_charset= NULL;
|
||||
m->dev_fd_1= -1;
|
||||
m->outdev_is_exclusive= 1;
|
||||
m->grow_blindly_msc2= -1;
|
||||
m->ban_stdio_write= 0;
|
||||
m->do_dummy= 0;
|
||||
m->do_close= 0;
|
||||
m->speed= 0;
|
||||
m->fs= 4*512; /* 4 MiB */
|
||||
m->padding= 300*1024;
|
||||
m->alignment= 0;
|
||||
m->do_stream_recording= 0;
|
||||
m->dvd_obs= 0;
|
||||
m->stdio_sync= 0;
|
||||
m->keep_boot_image= 0;
|
||||
m->boot_image_cat_path[0]= 0;
|
||||
m->boot_image_cat_hidden= 0;
|
||||
m->boot_count= 0;
|
||||
m->boot_platform_id= 0x00; /* El Torito Boot Catalog Platform ID: 0 = 80x86 */
|
||||
m->patch_isolinux_image= 0;
|
||||
m->boot_image_bin_path[0]= 0;
|
||||
m->boot_image_bin_form[0]= 0;
|
||||
m->boot_image_emul= 0;
|
||||
m->boot_image_load_size= 4 * 512; /* hearsay out of libisofs/demo/iso.c */
|
||||
memset(m->boot_id_string, 0, sizeof(m->boot_id_string));
|
||||
memset(m->boot_selection_crit, 0, sizeof(m->boot_selection_crit));
|
||||
|
||||
#ifdef Xorriso_with_isohybriD
|
||||
m->boot_image_isohybrid= 1;
|
||||
#else
|
||||
m->boot_image_isohybrid= 0;
|
||||
#endif
|
||||
|
||||
m->boot_efi_default= 0;
|
||||
m->system_area_disk_path[0]= 0;
|
||||
m->system_area_options= 0;
|
||||
m->patch_system_area= 0;
|
||||
m->vol_creation_time= 0;
|
||||
m->vol_modification_time= 0;
|
||||
m->vol_expiration_time= 0;
|
||||
m->vol_effective_time= 0;
|
||||
m->vol_uuid[0]= 0;
|
||||
m->loaded_boot_bin_lba= 0;
|
||||
m->loaded_boot_cat_path[0]= 0;
|
||||
m->allow_graft_points= 0;
|
||||
m->allow_restore= 0;
|
||||
m->do_concat_split= 1;
|
||||
m->do_auto_chmod= 0;
|
||||
m->do_restore_sort_lba= 0;
|
||||
m->dialog= 0;
|
||||
m->bsl_interpretation= 0;
|
||||
m->search_mode= 0;
|
||||
m->structured_search= 1;
|
||||
m->do_iso_rr_pattern= 1;
|
||||
m->do_disk_pattern= 2;
|
||||
m->temp_mem_limit= 16*1024*1024;
|
||||
m->file_size_limit= Xorriso_default_file_size_limiT;
|
||||
m->disk_exclusions= NULL;
|
||||
m->iso_rr_hidings= NULL;
|
||||
m->joliet_hidings= NULL;
|
||||
m->disk_excl_mode= 1;
|
||||
m->use_stdin= 0;
|
||||
m->result_page_length= 0;
|
||||
m->result_page_width= 80;
|
||||
m->mark_text[0]= 0;
|
||||
m->packet_output= 0;
|
||||
for(i=0; i<4; i++) {
|
||||
m->logfile[i][0]= 0;
|
||||
m->logfile_fp[i]= NULL;
|
||||
}
|
||||
m->pktlog_fp= NULL;
|
||||
for(i= 0; i < Xorriso_max_outlist_stacK; i++) {
|
||||
m->result_msglists[i]= NULL;
|
||||
m->info_msglists[i]= NULL;
|
||||
m->msglist_flags[i]= 0;
|
||||
}
|
||||
m->msglist_stackfill= 0;
|
||||
m->status_history_max= Xorriso_status_history_maX;
|
||||
m->scsi_log= 0;
|
||||
strcpy(m->report_about_text, "UPDATE");
|
||||
Xorriso__text_to_sev(m->report_about_text, &m->report_about_severity, 0);
|
||||
m->library_msg_direct_print= 0;
|
||||
strcpy(m->abort_on_text,"FATAL");
|
||||
Xorriso__text_to_sev(m->abort_on_text, &m->abort_on_severity, 0);
|
||||
m->problem_status= 0;
|
||||
m->problem_status_text[0]= 0;
|
||||
m->errfile_log[0]= 0;
|
||||
m->errfile_mode= 0;
|
||||
m->errfile_fp= NULL;
|
||||
|
||||
m->img_read_error_mode= 2; /* abort faulty image reading with FATAL */
|
||||
m->extract_error_mode= 1; /* keep extracted files after read error */
|
||||
strcpy(m->return_with_text, "SORRY");
|
||||
Xorriso__text_to_sev(m->return_with_text, &m->return_with_severity, 0);
|
||||
m->return_with_value= 32;
|
||||
m->eternal_problem_status= 0;
|
||||
m->eternal_problem_status_text[0]= 0;
|
||||
m->re= NULL;
|
||||
/* >>> ??? how to initialize m->match[0] ? */
|
||||
m->re_constants= NULL;
|
||||
m->re_count= 0;
|
||||
m->re_fill= 0;
|
||||
m->reg_expr[0]= 0;
|
||||
m->run_state= 0;
|
||||
m->is_dialog= 0;
|
||||
m->bar_is_fresh= 0;
|
||||
m->pending_option[0]= 0;
|
||||
m->request_to_abort= 0;
|
||||
m->request_not_to_ask= 0;
|
||||
m->idle_time= 0.0;
|
||||
m->re_failed_at= -1;
|
||||
m->prepended_wd= 0;
|
||||
m->insert_count= 0;
|
||||
m->insert_bytes= 0;
|
||||
m->error_count= 0;
|
||||
m->pacifier_style= 0;
|
||||
m->pacifier_interval= 1.0;
|
||||
m->pacifier_count= 0;
|
||||
m->pacifier_total= 0;
|
||||
m->pacifier_byte_count= 0;
|
||||
m->pacifier_fifo= NULL;
|
||||
m->start_time= 0.0;
|
||||
m->last_update_time= 0.0;
|
||||
m->find_compare_result= 1;
|
||||
m->find_check_md5_result= 0;
|
||||
|
||||
m->node_counter= 0;
|
||||
m->node_array_size= 0;
|
||||
m->node_array= NULL;
|
||||
m->node_disk_prefixes= NULL;
|
||||
m->node_img_prefixes= NULL;
|
||||
|
||||
m->hln_count= 0;
|
||||
m->hln_array= NULL;
|
||||
m->hln_targets= NULL;
|
||||
m->hln_change_pending= 0;
|
||||
m->di_do_widen= NULL;
|
||||
m->di_disk_paths= NULL;
|
||||
m->di_iso_paths= NULL;
|
||||
|
||||
m->node_targets_availmem= 0;
|
||||
|
||||
m->di_count= 0;
|
||||
m->di_array= NULL;
|
||||
|
||||
m->perm_stack= NULL;
|
||||
|
||||
m->result_line[0]= 0;
|
||||
m->result_line_counter= 0;
|
||||
m->result_page_counter= 0;
|
||||
m->result_open_line_len= 0;
|
||||
|
||||
m->info_text[0]= 0;
|
||||
|
||||
ret= Sfile_leafname(progname, leafname, 0);
|
||||
if(ret<=0)
|
||||
goto failure;
|
||||
if(strcmp(leafname, "osirrox")==0) {
|
||||
m->allow_restore= 1;
|
||||
m->drives_exclusive= 0;
|
||||
} else if(strcmp(leafname, "xorrisofs")==0 || strcmp(leafname, "genisofs")==0 ||
|
||||
strcmp(leafname, "mkisofs")==0 || strcmp(leafname, "genisoimage")==0) {
|
||||
m->argument_emulation= 1;
|
||||
m->pacifier_style= 1;
|
||||
Xorriso_protect_stdout(*xorriso, 0);
|
||||
} else if(strcmp(leafname, "xorrecord")==0 || strcmp(leafname, "wodim")==0 ||
|
||||
strcmp(leafname, "cdrecord")==0 || strcmp(leafname, "cdrskin")==0) {
|
||||
m->argument_emulation= 2;
|
||||
m->pacifier_style= 2;
|
||||
}
|
||||
ret= Exclusions_new(&(m->disk_exclusions), 0);
|
||||
if(ret<=0)
|
||||
goto failure;
|
||||
ret= Exclusions_new(&(m->iso_rr_hidings), 0);
|
||||
if(ret<=0)
|
||||
goto failure;
|
||||
ret= Exclusions_new(&(m->joliet_hidings), 0);
|
||||
if(ret<=0)
|
||||
goto failure;
|
||||
Xorriso_relax_compliance(m, "default", 0);
|
||||
ret= Xorriso_lst_new(&(m->drive_greylist), "/dev", m->drive_greylist, 1);
|
||||
if(ret <= 0)
|
||||
goto failure;
|
||||
|
||||
return(1);
|
||||
failure:;
|
||||
Xorriso_destroy(xorriso, 0);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_destroy_re(struct XorrisO *m, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(m->re!=NULL) {
|
||||
for(i=0;i<m->re_fill;i++) {
|
||||
if(m->re_constants!=NULL)
|
||||
if(m->re_constants[i]!=NULL)
|
||||
continue; /* ,->re[i] was never subject to regcomp() */
|
||||
regfree(&(m->re[i]));
|
||||
}
|
||||
free((char *) m->re);
|
||||
m->re= NULL;
|
||||
}
|
||||
|
||||
if(m->re_constants!=NULL) {
|
||||
for(i=0;i<m->re_fill;i++)
|
||||
if(m->re_constants[i]!=NULL)
|
||||
free(m->re_constants[i]);
|
||||
free((char *) m->re_constants);
|
||||
m->re_constants= NULL;
|
||||
}
|
||||
m->re_count= 0;
|
||||
m->re_fill= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= global shutdown of libraries */
|
||||
int Xorriso_destroy(struct XorrisO **xorriso, int flag)
|
||||
{
|
||||
struct XorrisO *m;
|
||||
|
||||
m= *xorriso;
|
||||
if(m==NULL)
|
||||
return(0);
|
||||
if(m->in_charset!=NULL)
|
||||
free(m->in_charset);
|
||||
if(m->out_charset!=NULL)
|
||||
free(m->out_charset);
|
||||
Xorriso_destroy_re(m,0);
|
||||
Exclusions_destroy(&(m->disk_exclusions), 0);
|
||||
Exclusions_destroy(&(m->iso_rr_hidings), 0);
|
||||
Exclusions_destroy(&(m->joliet_hidings), 0);
|
||||
Xorriso_destroy_all_extf(m, 0);
|
||||
Xorriso_lst_destroy_all(&(m->drive_blacklist), 0);
|
||||
Xorriso_lst_destroy_all(&(m->drive_greylist), 0);
|
||||
Xorriso_lst_destroy_all(&(m->drive_whitelist), 0);
|
||||
Xorriso_destroy_node_array(m, 0);
|
||||
Xorriso_destroy_hln_array(m, 0);
|
||||
Xorriso_destroy_di_array(m, 0);
|
||||
|
||||
Xorriso_detach_libraries(m, flag&1);
|
||||
|
||||
free((char *) m);
|
||||
*xorriso= NULL;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_destroy_node_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(xorriso->node_array != NULL) {
|
||||
for(i= 0; i < xorriso->node_counter; i++)
|
||||
iso_node_unref((IsoNode *) xorriso->node_array[i]);
|
||||
free(xorriso->node_array);
|
||||
}
|
||||
xorriso->node_array= NULL;
|
||||
xorriso->node_counter= xorriso->node_array_size= 0;
|
||||
Xorriso_lst_destroy_all(&(xorriso->node_disk_prefixes), 0);
|
||||
Xorriso_lst_destroy_all(&(xorriso->node_img_prefixes), 0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= do not destroy hln_array but only hln_targets
|
||||
*/
|
||||
int Xorriso_destroy_hln_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
||||
if(xorriso->hln_array != NULL && !(flag & 1)) {
|
||||
for(i= 0; i < xorriso->hln_count; i++)
|
||||
iso_node_unref((IsoNode *) xorriso->hln_array[i]);
|
||||
free(xorriso->hln_array);
|
||||
xorriso->hln_array= NULL;
|
||||
xorriso->hln_count= 0;
|
||||
}
|
||||
if(xorriso->hln_targets != NULL) {
|
||||
for(i= 0; i < xorriso->hln_count; i++)
|
||||
if(xorriso->hln_targets[i] != NULL)
|
||||
free(xorriso->hln_targets[i]);
|
||||
free(xorriso->hln_targets);
|
||||
xorriso->hln_targets= NULL;
|
||||
}
|
||||
xorriso->node_targets_availmem= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_destroy_di_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(xorriso->di_array != NULL) {
|
||||
for(i= 0; i < xorriso->di_count; i++)
|
||||
if(xorriso->di_array[i] != NULL)
|
||||
iso_node_unref((IsoNode *) xorriso->di_array[i]);
|
||||
free(xorriso->di_array);
|
||||
xorriso->di_array= NULL;
|
||||
}
|
||||
if(xorriso->di_do_widen != NULL) {
|
||||
free(xorriso->di_do_widen);
|
||||
xorriso->di_do_widen= NULL;
|
||||
}
|
||||
Xorriso_lst_destroy_all(&(xorriso->di_disk_paths), 0);
|
||||
Xorriso_lst_destroy_all(&(xorriso->di_iso_paths), 0);
|
||||
xorriso->di_count= 0;
|
||||
|
||||
#ifdef NIX
|
||||
/* <<< */
|
||||
fprintf(stderr, "xorriso_DEBUG: get_di_count= %lu\n",
|
||||
Xorriso_get_di_counteR);
|
||||
#endif /* NIX */
|
||||
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_new_node_array(struct XorrisO *xorriso, off_t mem_limit,
|
||||
int addon_nodes, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(xorriso->node_counter <= 0)
|
||||
return(1);
|
||||
|
||||
xorriso->node_array= calloc(xorriso->node_counter + addon_nodes,
|
||||
sizeof(IsoNode *));
|
||||
if(xorriso->node_array == NULL) {
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
return(-1);
|
||||
}
|
||||
for(i= 0; i < xorriso->node_counter + addon_nodes; i++)
|
||||
xorriso->node_array[i]= NULL;
|
||||
xorriso->node_array_size= xorriso->node_counter + addon_nodes;
|
||||
xorriso->node_counter= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= do not allocate hln_array but only hln_targets
|
||||
*/
|
||||
int Xorriso_new_hln_array(struct XorrisO *xorriso, off_t mem_limit, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
Xorriso_destroy_hln_array(xorriso, flag & 1);
|
||||
if(xorriso->hln_count <= 0)
|
||||
return(1);
|
||||
|
||||
if(!(flag & 1)) {
|
||||
xorriso->hln_array= calloc(xorriso->hln_count, sizeof(char *));
|
||||
if(xorriso->hln_array == NULL) {
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
return(-1);
|
||||
}
|
||||
for(i= 0; i < xorriso->hln_count; i++)
|
||||
xorriso->hln_array[i]= NULL;
|
||||
}
|
||||
|
||||
xorriso->hln_targets= calloc(xorriso->hln_count, sizeof(char *));
|
||||
if(xorriso->hln_targets == NULL) {
|
||||
if(!(flag & 1)) {
|
||||
free(xorriso->hln_array);
|
||||
xorriso->hln_array= NULL;
|
||||
}
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
return(-1);
|
||||
}
|
||||
for(i= 0; i < xorriso->hln_count; i++)
|
||||
xorriso->hln_targets[i]= NULL;
|
||||
xorriso->node_targets_availmem= mem_limit
|
||||
- xorriso->hln_count * sizeof(void *)
|
||||
- xorriso->hln_count * sizeof(char *);
|
||||
if(xorriso->node_targets_availmem < 0)
|
||||
xorriso->node_targets_availmem= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__preset_signal_behavior(int behavior, int flag)
|
||||
{
|
||||
if(behavior < 0 || behavior > 1)
|
||||
return(0);
|
||||
Xorriso_signal_behavioR= behavior;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__get_signal_behavior(int flag)
|
||||
{
|
||||
return(Xorriso_signal_behavioR);
|
||||
}
|
||||
|
31
xorriso/base_obj.h
Normal file
31
xorriso/base_obj.h
Normal file
@ -0,0 +1,31 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which perform the
|
||||
fundamental operations of the XorrisO object.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_base_obj_includeD
|
||||
#define Xorriso_pvt_base_obj_includeD yes
|
||||
|
||||
|
||||
#ifdef NIX
|
||||
/* <<< */
|
||||
unsigned long Xorriso_get_di_counteR= 0;
|
||||
#endif /* NIX */
|
||||
|
||||
struct XorrisO;
|
||||
|
||||
|
||||
int Xorriso_destroy_re(struct XorrisO *m, int flag);
|
||||
|
||||
int Xorriso__get_signal_behavior(int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_base_obj_includeD */
|
||||
|
File diff suppressed because it is too large
Load Diff
1106
xorriso/check_media.c
Normal file
1106
xorriso/check_media.c
Normal file
File diff suppressed because it is too large
Load Diff
181
xorriso/check_media.h
Normal file
181
xorriso/check_media.h
Normal file
@ -0,0 +1,181 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of classes SpotlistiteM, SpotlisT,
|
||||
SectorbitmaP, CheckmediajoB which represent media checks and their outcome.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_check_includeD
|
||||
#define Xorriso_pvt_check_includeD yes
|
||||
|
||||
struct SpotlisT; /* List of intervals with different read qualities */
|
||||
struct CheckmediajoB; /* Parameters for Xorriso_check_media() */
|
||||
|
||||
int Xorriso_check_media_setup_job(struct XorrisO *xorriso,
|
||||
struct CheckmediajoB *job,
|
||||
char **argv, int old_idx, int end_idx, int flag);
|
||||
|
||||
int Xorriso_sectormap_to_spotlist(struct XorrisO *xorriso,
|
||||
struct CheckmediajoB *job,
|
||||
struct SpotlisT **spotlist,
|
||||
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);
|
||||
|
||||
/* 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);
|
||||
|
||||
/* @param report Buffer of at least 10*SfileadrL
|
||||
@param flag bit0= only report non-default settings
|
||||
@return <=0 error , 1 ok , 2 with bit0: every option is on default setting
|
||||
*/
|
||||
int Xorriso_check_media_list_job(struct XorrisO *xorriso,
|
||||
struct CheckmediajoB *job,
|
||||
char *report, int flag);
|
||||
|
||||
int Xorriso_update_in_sector_map(struct XorrisO *xorriso,
|
||||
struct SpotlisT *spotlist, int read_chunk,
|
||||
struct CheckmediajoB *job, int flag);
|
||||
|
||||
|
||||
/* Distiniction between valid and invalid sectors */
|
||||
struct SectorbitmaP {
|
||||
int sectors;
|
||||
int sector_size;
|
||||
unsigned char *map;
|
||||
int map_size;
|
||||
};
|
||||
|
||||
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 bad_limit,
|
||||
int flag);
|
||||
|
||||
|
||||
#define Xorriso_read_quality_gooD 0x7fffffff
|
||||
#define Xorriso_read_quality_md5_matcH 0x70000000
|
||||
#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_md5_mismatcH 0x10000000
|
||||
#define Xorriso_read_quality_unreadablE 0x00000000
|
||||
|
||||
|
||||
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; /* 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
|
||||
*/
|
||||
|
||||
char event_severity[20]; /* If not "ALL": trigger event of given severity
|
||||
at the end of a check job if bad blocks were
|
||||
discovered.
|
||||
*/
|
||||
|
||||
double slow_threshold_seq; /* Time limit in seconds for the decision whether
|
||||
a read operation is considered slow. This does
|
||||
not apply to thr first read of an interval.
|
||||
*/
|
||||
|
||||
int untested_valid; /* 1= mark untested data blocks as valid when calling
|
||||
Xorriso_spotlist_to_sectormap()
|
||||
*/
|
||||
};
|
||||
|
||||
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);
|
||||
|
||||
int Sectorbitmap_clone(struct SectorbitmaP *from, struct SectorbitmaP **clone,
|
||||
int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_check_includeD */
|
||||
|
951
xorriso/cmp_update.c
Normal file
951
xorriso/cmp_update.c
Normal file
@ -0,0 +1,951 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains the implementation of actions which compare or update
|
||||
files between disk filesystem and ISO filesystem.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <pwd.h>
|
||||
#include <grp.h>
|
||||
|
||||
|
||||
#include "xorriso.h"
|
||||
#include "xorriso_private.h"
|
||||
#include "xorrisoburn.h"
|
||||
|
||||
|
||||
/*
|
||||
@param result Bitfield indicationg type of mismatch
|
||||
bit11= cannot open regular disk file
|
||||
bit12= cannot open iso file
|
||||
bit13= early eof of disk file
|
||||
bit14= early eof of iso file
|
||||
bit15= content bytes differ
|
||||
@param flag bit0= mtimes of both file objects are equal
|
||||
bit29= do not issue pacifier messages
|
||||
bit31= do not issue result messages
|
||||
@return >0 ok , <=0 error
|
||||
*/
|
||||
int Xorriso_compare_2_contents(struct XorrisO *xorriso, char *common_adr,
|
||||
char *disk_adr, off_t disk_size,
|
||||
off_t offset, off_t bytes,
|
||||
char *iso_adr, off_t iso_size,
|
||||
int *result, int flag)
|
||||
{
|
||||
int fd1= -1, ret, r1, r2, done, wanted, i, was_error= 0, use_md5= 0;
|
||||
void *stream2= NULL;
|
||||
off_t r1count= 0, r2count= 0, diffcount= 0, first_diff= -1;
|
||||
char *respt, buf1[32*1024], buf2[32*1024], offset_text[80];
|
||||
char disk_md5[16], iso_md5[16];
|
||||
void *ctx= NULL;
|
||||
|
||||
respt= xorriso->result_line;
|
||||
|
||||
fd1= open(disk_adr, O_RDONLY);
|
||||
if(fd1==-1) {
|
||||
sprintf(respt, "- %s (DISK) : cannot open() : %s\n",
|
||||
disk_adr, strerror(errno));
|
||||
cannot_address:;
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
(*result)|= 2048;
|
||||
{ret= 0; goto ex;}
|
||||
}
|
||||
if(offset>0)
|
||||
if(lseek(fd1, offset, SEEK_SET)==-1) {
|
||||
sprintf(respt, "- %s (DISK) : cannot lseek(%.f) : %s\n",
|
||||
disk_adr, (double) offset, strerror(errno));
|
||||
close(fd1);
|
||||
goto cannot_address;
|
||||
}
|
||||
|
||||
if(xorriso->do_md5 & 16) {
|
||||
use_md5= 1;
|
||||
ret= Xorriso_is_plain_image_file(xorriso, NULL, iso_adr, 0);
|
||||
if(ret <= 0)
|
||||
ret= 0; /* (reverse) filtered files are likely not to match their MD5 */
|
||||
else
|
||||
ret= Xorriso_get_md5(xorriso, NULL, iso_adr, iso_md5, 1);
|
||||
if(ret <= 0)
|
||||
use_md5= 0;
|
||||
else {
|
||||
ret= Xorriso_md5_start(xorriso, &ctx, 0);
|
||||
if(ret <= 0)
|
||||
use_md5= 0;
|
||||
}
|
||||
}
|
||||
if (! use_md5) {
|
||||
ret= Xorriso_iso_file_open(xorriso, iso_adr, NULL, &stream2, 0);
|
||||
if(ret<=0) {
|
||||
sprintf(respt, "- %s (ISO) : cannot open() file in ISO image\n",iso_adr);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
close(fd1);
|
||||
(*result)|= 4096;
|
||||
{ret= 0; goto ex;}
|
||||
}
|
||||
}
|
||||
|
||||
done= 0;
|
||||
while(!done) {
|
||||
|
||||
wanted= sizeof(buf1);
|
||||
if(r1count+offset+wanted>disk_size)
|
||||
wanted= disk_size-r1count-offset;
|
||||
if(r1count+wanted>bytes)
|
||||
wanted= bytes-r1count;
|
||||
r1= 0;
|
||||
while(wanted>0) {
|
||||
ret= read(fd1, buf1, wanted);
|
||||
if(ret<=0)
|
||||
break;
|
||||
wanted-= ret;
|
||||
r1+= ret;
|
||||
}
|
||||
|
||||
wanted= sizeof(buf2);
|
||||
if(r2count+wanted>iso_size)
|
||||
wanted= iso_size-r2count;
|
||||
/*
|
||||
if(r2count+wanted>bytes)
|
||||
wanted= bytes-r2count;
|
||||
*/
|
||||
if(use_md5)
|
||||
r2= r1;
|
||||
else if(wanted>0)
|
||||
r2= Xorriso_iso_file_read(xorriso, stream2, buf2, wanted, 0);
|
||||
else
|
||||
r2= 0;
|
||||
|
||||
if(r1<0 || r2<0)
|
||||
was_error= 1;
|
||||
|
||||
if(r1<=0 && r2<=0)
|
||||
break;
|
||||
if(r1<=0) {
|
||||
if(r1<0)
|
||||
r1= 0;
|
||||
if(disk_size > r1count + r1 + offset) {
|
||||
sprintf(respt, "- %s (DISK) : early EOF after %.f bytes\n",
|
||||
disk_adr, (double) r1count);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
(*result)|= 8196;
|
||||
}
|
||||
(*result)|= (1<<15);
|
||||
}
|
||||
r1count+= r1;
|
||||
if(r2<=0 || r2<r1) {
|
||||
if(r2<0)
|
||||
r2= 0;
|
||||
if(iso_size > r2count + r2) {
|
||||
sprintf(respt, "- %s (ISO) : early EOF after %.f bytes\n",
|
||||
iso_adr, (double) r2count);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
(*result)|= (1<<14);
|
||||
}
|
||||
(*result)|= (1<<15);
|
||||
done= 1;
|
||||
}
|
||||
if(r2>r1) {
|
||||
if(disk_size > r1count + r1 + offset) {
|
||||
sprintf(respt, "- %s (DISK) : early EOF after %.f bytes\n",
|
||||
disk_adr, (double) r1count);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
(*result)|= 8196;
|
||||
}
|
||||
(*result)|= (1<<15);
|
||||
done= 1;
|
||||
}
|
||||
r2count+= r2;
|
||||
if(r1>r2)
|
||||
r1= r2;
|
||||
|
||||
if(use_md5) {
|
||||
Xorriso_md5_compute(xorriso, ctx, buf1, r1, 0);
|
||||
} else {
|
||||
for(i= 0; i<r1; i++) {
|
||||
if(buf1[i]!=buf2[i]) {
|
||||
if(first_diff<0)
|
||||
first_diff= r1count - r1 + i;
|
||||
diffcount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!(flag&(1<<29))) {
|
||||
xorriso->pacifier_count+= r1;
|
||||
xorriso->pacifier_byte_count+= r1;
|
||||
if(flag&(1<<31))
|
||||
Xorriso_pacifier_callback(xorriso, "content bytes read",
|
||||
xorriso->pacifier_count, 0, "", 0);
|
||||
else
|
||||
Xorriso_pacifier_callback(xorriso, "bytes", xorriso->pacifier_count, 0,
|
||||
"", 1<<6);
|
||||
}
|
||||
}
|
||||
|
||||
if(use_md5) {
|
||||
ret= Xorriso_md5_end(xorriso, &ctx, disk_md5, 0);
|
||||
if(ret <= 0) {
|
||||
*result |= (1 << 15);
|
||||
ret= -1; goto ex;
|
||||
}
|
||||
for(i= 0; i < 16; i++)
|
||||
if(iso_md5[i] != disk_md5[i])
|
||||
break;
|
||||
if(i < 16 ) {
|
||||
offset_text[0]= 0;
|
||||
if(offset>0)
|
||||
sprintf(offset_text, "%.f+", (double) offset);
|
||||
sprintf(respt, "%s %s : differs by MD5 sums.\n",
|
||||
common_adr, (flag&1 ? "CONTENT": "content"));
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
(*result)|= (1<<15);
|
||||
}
|
||||
} else if(diffcount>0 || r1count!=r2count) {
|
||||
if(first_diff<0)
|
||||
first_diff= (r1count>r2count ? r2count : r1count);
|
||||
offset_text[0]= 0;
|
||||
if(offset>0)
|
||||
sprintf(offset_text, "%.f+", (double) offset);
|
||||
sprintf(respt, "%s %s : differs by at least %.f bytes. First at %s%.f\n",
|
||||
common_adr, (flag&1 ? "CONTENT": "content"),
|
||||
(double) (diffcount + abs(r1count-r2count)),
|
||||
offset_text, (double) first_diff);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
(*result)|= (1<<15);
|
||||
}
|
||||
if(fd1!=-1)
|
||||
close(fd1);
|
||||
if(! use_md5)
|
||||
Xorriso_iso_file_close(xorriso, &stream2, 0);
|
||||
if(was_error)
|
||||
{ret= -1; goto ex;}
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(ctx != NULL)
|
||||
Xorriso_md5_end(xorriso, &ctx, disk_md5, 0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@param result Bitfield indicationg type of mismatch
|
||||
bit0= disk_adr not existing
|
||||
bit1= iso_adr not existing
|
||||
bit2= access permissions
|
||||
bit3= file type
|
||||
bit4= user id
|
||||
bit5= group id
|
||||
bit6= minor, major with device file
|
||||
bit7= size
|
||||
bit8= mtime
|
||||
bit9= atime
|
||||
bit10= ctime
|
||||
bit11= cannot open regular disk file
|
||||
bit12= cannot open iso file
|
||||
bit13= early eof of disk file
|
||||
bit14= early eof of iso file
|
||||
bit15= content bytes differ
|
||||
bit16= symbolic link on disk pointing to dir, dir in iso
|
||||
bit17= file chunks detected and compared
|
||||
bit18= incomplete chunk collection encountered
|
||||
bit19= ACL differs (this condition sets also bit2)
|
||||
bit20= xattr differ
|
||||
bit21= mismatch of recorded dev,inode
|
||||
bit22= no recorded dev,inode found in node
|
||||
bit23= timestamps younger than xorriso->isofs_st_in
|
||||
bit24= hardlink split
|
||||
bit25= hardlink fusion
|
||||
@param flag bit0= compare atime
|
||||
bit1= compare ctime
|
||||
bit2= check only existence of both file objects
|
||||
count one or both missing as "difference"
|
||||
bit27= for Xorriso_path_is_excluded(): bit0
|
||||
bit28= examine eventual disk_path link target rather than link
|
||||
bit29= do not issue pacifier messages
|
||||
bit30= omit adr_common_tail in report messages
|
||||
bit31= do not issue result messages
|
||||
@return 1=files match properly , 0=difference detected , -1=error
|
||||
*/
|
||||
int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
|
||||
char *iso_adr, char *adr_common_tail,
|
||||
int *result, int flag)
|
||||
{
|
||||
struct stat s1, s2, stbuf;
|
||||
int ret, missing= 0, is_split= 0, i, was_error= 0, diff_count= 0;
|
||||
int content_shortcut= 0;
|
||||
char *respt;
|
||||
char a[5*SfileadrL], sfe[5*SfileadrL];
|
||||
char ttx1[40], ttx2[40];
|
||||
char *a1_acl= NULL, *a2_acl= NULL, *d1_acl= NULL, *d2_acl= NULL;
|
||||
char *attrlist1= NULL, *attrlist2= NULL;
|
||||
struct SplitparT *split_parts= NULL;
|
||||
int split_count= 0;
|
||||
time_t stamp;
|
||||
|
||||
char part_path[SfileadrL], *part_name;
|
||||
int partno, total_parts= 0;
|
||||
off_t offset, bytes, total_bytes;
|
||||
|
||||
*result= 0;
|
||||
respt= xorriso->result_line;
|
||||
|
||||
if(!(xorriso->disk_excl_mode&8)) {
|
||||
ret= Xorriso_path_is_excluded(xorriso, disk_adr, 2 | !!(flag&(1<<27)));
|
||||
if(ret>0) {
|
||||
sprintf(respt , "? %s (DISK) : exluded by %s\n",
|
||||
Text_shellsafe(disk_adr, sfe, 0),
|
||||
(ret==1 ? "-not_paths" : "-not_leaf"));
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
missing= 1;
|
||||
(*result)|= 1;
|
||||
}
|
||||
}
|
||||
if(!missing) {
|
||||
if(flag&(1<<28))
|
||||
ret= stat(disk_adr, &s1);
|
||||
else
|
||||
ret= lstat(disk_adr, &s1);
|
||||
if(ret==-1) {
|
||||
sprintf(respt , "? %s (DISK) : cannot lstat() : %s\n",
|
||||
Text_shellsafe(disk_adr, sfe, 0), strerror(errno));
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
missing= 1;
|
||||
(*result)|= 1;
|
||||
}
|
||||
}
|
||||
if(missing)
|
||||
strcpy(a, "?");
|
||||
else
|
||||
strcpy(a, Ftypetxt(s1.st_mode, 1));
|
||||
strcat(a, " ");
|
||||
if(adr_common_tail[0])
|
||||
strcat(a, Text_shellsafe(adr_common_tail, sfe, 0));
|
||||
else {
|
||||
Text_shellsafe(disk_adr, a+strlen(a), 0);
|
||||
strcat(a, " (DISK)");
|
||||
/*
|
||||
strcat(a, "'.'");
|
||||
*/
|
||||
}
|
||||
strcat(a, " :");
|
||||
if(flag&(1<<30))
|
||||
a[0]= 0;
|
||||
|
||||
ret= Xorriso_iso_lstat(xorriso, iso_adr, &s2, 0);
|
||||
if(ret<0) {
|
||||
sprintf(respt, "? %s (ISO) : cannot find this file in ISO image\n",
|
||||
Text_shellsafe(iso_adr, sfe, 0));
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
missing= 1;
|
||||
(*result)|= 2;
|
||||
}
|
||||
|
||||
if((flag&4)||missing)
|
||||
{ret= !missing; goto ex;}
|
||||
|
||||
|
||||
/* Splitfile parts */
|
||||
if((S_ISREG(s1.st_mode) || S_ISBLK(s1.st_mode)) && S_ISDIR(s2.st_mode)) {
|
||||
is_split= Xorriso_identify_split(xorriso, iso_adr, NULL, &split_parts,
|
||||
&split_count, &s2, 0);
|
||||
if(is_split>0)
|
||||
(*result)|= (1<<17);
|
||||
else
|
||||
is_split= 0;
|
||||
}
|
||||
|
||||
/* Attributes */
|
||||
if(s1.st_mode != s2.st_mode) {
|
||||
if((s1.st_mode&~S_IFMT)!=(s2.st_mode&~S_IFMT)) {
|
||||
sprintf(respt, "%s st_mode : %7.7o <> %7.7o\n",
|
||||
a, (unsigned int) (s1.st_mode & ~S_IFMT),
|
||||
(unsigned int) (s2.st_mode & ~S_IFMT));
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
(*result)|= 4;
|
||||
}
|
||||
|
||||
if((s1.st_mode&S_IFMT)!=(s2.st_mode&S_IFMT)) {
|
||||
sprintf(respt, "%s type : %s <> %s\n",
|
||||
a, Ftypetxt(s1.st_mode, 0), Ftypetxt(s2.st_mode, 0));
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
(*result)|= 8;
|
||||
if((s1.st_mode&S_IFMT) == S_IFLNK) {
|
||||
/* check whether link target type matches */
|
||||
ret= stat(disk_adr, &stbuf);
|
||||
if(ret!=-1)
|
||||
if(S_ISDIR(stbuf.st_mode) && S_ISDIR(s2.st_mode))
|
||||
(*result)|= (1<<16);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ACL */
|
||||
if(xorriso->do_aaip & 3) {
|
||||
Xorriso_local_getfacl(xorriso, disk_adr, &a1_acl,
|
||||
16 | ((flag & (1 << 28)) >> 23));
|
||||
if(S_ISDIR(s1.st_mode))
|
||||
Xorriso_local_getfacl(xorriso, disk_adr, &d1_acl, 1);
|
||||
ret= Xorriso_getfacl(xorriso, NULL, iso_adr, &a2_acl, 1 | 4 | 16);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
if(S_ISDIR(s1.st_mode)) {
|
||||
ret= Xorriso_getfacl(xorriso, NULL, iso_adr, &d2_acl, 1 | 8);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
}
|
||||
ret= Compare_text_lines(a1_acl, a2_acl, &diff_count, 0);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
if(ret == 0)
|
||||
(*result)|= 4 | (1 << 19);
|
||||
ret= Compare_text_lines(d1_acl, d2_acl, &diff_count, 1);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
if(ret == 0)
|
||||
(*result)|= 4 | (1 << 19);
|
||||
if((*result) & (1 << 19)) {
|
||||
sprintf(respt, "%s ACL : %d difference%s\n",
|
||||
a, diff_count, diff_count == 1 ? "" : "s");
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
}
|
||||
}
|
||||
|
||||
/* xattr */
|
||||
if(xorriso->do_aaip & 12) {
|
||||
ret= Xorriso_getfattr(xorriso, NULL, disk_adr, &attrlist1,
|
||||
1 | 2 | ((flag & (1 << 28)) >> 23));
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
ret= Xorriso_getfattr(xorriso, NULL, iso_adr, &attrlist2, 1);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
ret= Compare_text_lines(attrlist1, attrlist2, &diff_count, 0);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
if(ret == 0) {
|
||||
(*result)|= (1 << 20);
|
||||
sprintf(respt, "%s xattr : %d difference%s\n",
|
||||
a, diff_count, diff_count == 1 ? "" : "s");
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
}
|
||||
}
|
||||
|
||||
if(s1.st_uid != s2.st_uid) {
|
||||
sprintf(respt, "%s st_uid : %lu <> %lu\n", a,
|
||||
(unsigned long) s1.st_uid, (unsigned long) s2.st_uid);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
(*result)|= 16;
|
||||
}
|
||||
if(s1.st_gid != s2.st_gid) {
|
||||
sprintf(respt, "%s st_gid : %lu <> %lu\n", a,
|
||||
(unsigned long) s1.st_gid, (unsigned long) s2.st_gid);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
(*result)|= 32;
|
||||
}
|
||||
if((S_ISCHR(s1.st_mode) && S_ISCHR(s2.st_mode)) ||
|
||||
(S_ISBLK(s1.st_mode) && S_ISBLK(s2.st_mode))) {
|
||||
if(s1.st_rdev != s2.st_rdev) {
|
||||
sprintf(respt, "%s %s st_rdev : %lu <> %lu\n", a,
|
||||
(S_ISCHR(s1.st_mode) ? "S_IFCHR" : "S_IFBLK"),
|
||||
(unsigned long) s1.st_rdev, (unsigned long) s1.st_rdev);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
(*result)|= 64;
|
||||
}
|
||||
}
|
||||
if((!(xorriso->do_aaip & 32)) &&
|
||||
S_ISREG(s2.st_mode) && s1.st_size != s2.st_size) {
|
||||
sprintf(respt, "%s st_size : %.f <> %.f diff= %.f\n",
|
||||
a, (double) s1.st_size, (double) s2.st_size,
|
||||
((double) s1.st_size) - (double) s2.st_size);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
(*result)|= 128;
|
||||
}
|
||||
if(s1.st_mtime != s2.st_mtime) {
|
||||
sprintf(respt, "%s st_mtime : %s <> %s diff= %.f s\n",
|
||||
a, Ftimetxt(s1.st_mtime, ttx1, 0),
|
||||
Ftimetxt(s2.st_mtime, ttx2, 0),
|
||||
((double) s1.st_mtime) - (double) s2.st_mtime);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
(*result)|= 256;
|
||||
}
|
||||
if(flag&1) {
|
||||
if(s1.st_atime != s2.st_atime) {
|
||||
sprintf(respt, "%s st_atime : %s <> %s diff= %.f s\n",
|
||||
a, Ftimetxt(s1.st_atime, ttx1, 0),
|
||||
Ftimetxt(s2.st_atime, ttx2, 0),
|
||||
((double) s1.st_atime) - (double) s2.st_atime);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
(*result)|= 512;
|
||||
}
|
||||
}
|
||||
if(flag&2) {
|
||||
if(s1.st_ctime != s2.st_ctime) {
|
||||
sprintf(respt, "%s st_ctime : %s <> %s diff= %.f s\n",
|
||||
a, Ftimetxt(s1.st_ctime, ttx1, 0),
|
||||
Ftimetxt(s2.st_ctime, ttx2, 0),
|
||||
((double) s1.st_ctime) - (double) s2.st_ctime);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
(*result)|= 1024;
|
||||
}
|
||||
}
|
||||
if(xorriso->isofs_st_in > 0 &&
|
||||
(xorriso->isofs_st_in <= s2.st_mtime ||
|
||||
((flag & 1) && xorriso->isofs_st_in <= s2.st_atime) ||
|
||||
((flag & 2) && xorriso->isofs_st_in <= s2.st_ctime)))
|
||||
(*result)|= 1 << 23;
|
||||
|
||||
if((xorriso->do_aaip & 32) || !(xorriso->ino_behavior & 2)) {
|
||||
/* dev,inode comparison.
|
||||
For skipping content comparison or for hardlink detection.
|
||||
*/
|
||||
ret= Xorriso_record_dev_inode(xorriso, "", s1.st_dev, s1.st_ino, NULL,
|
||||
iso_adr, 1 | 2 | ((flag & (1 << 28)) >> 23) | (xorriso->do_aaip & 128));
|
||||
if(ret < 0) {
|
||||
ret= -1; goto ex;
|
||||
} else if(ret == 0) { /* match */
|
||||
if((xorriso->do_aaip & 64) && S_ISREG(s1.st_mode) && S_ISREG(s2.st_mode)){
|
||||
if(xorriso->do_aaip & 32)
|
||||
content_shortcut= 1;
|
||||
if((*result) & (8 | 128 | 256 | 512 | 1024 | (1 << 23))) {
|
||||
(*result)|= (1 << 15); /* content bytes differ */
|
||||
if(((*result) & (1 << 23)) &&
|
||||
!((*result) & (8 | 128 | 256 | 512 | 1024))) {
|
||||
sprintf(respt,
|
||||
"%s content : node timestamp younger than image timestamp\n", a);
|
||||
if((xorriso->do_aaip & 32) && !(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
stamp= s2.st_mtime;
|
||||
if((flag & 1) && s2.st_atime >= stamp)
|
||||
stamp= s2.st_atime;
|
||||
if((flag & 2) && s2.st_ctime >= stamp)
|
||||
stamp= s2.st_ctime;
|
||||
sprintf(respt, "%s content : %s > %s diff= %.f s\n",
|
||||
a, Ftimetxt(stamp, ttx1, 3 << 1),
|
||||
Ftimetxt(xorriso->isofs_st_in, ttx2, 3 << 1),
|
||||
((double) stamp) - (double) xorriso->isofs_st_in);
|
||||
if((xorriso->do_aaip & 32) && !(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
}
|
||||
sprintf(respt,
|
||||
"%s content : assuming inequality due to size or timestamps\n", a);
|
||||
if((xorriso->do_aaip & 32) && !(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
}
|
||||
}
|
||||
} else if(ret == 1) { /* mismatch */
|
||||
(*result)|= (1 << 21);
|
||||
sprintf(respt, "%s dev_ino : differing\n", a);
|
||||
if((xorriso->do_aaip & 32) && !(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
|
||||
if((xorriso->do_aaip & 64) && S_ISREG(s1.st_mode) && S_ISREG(s2.st_mode)){
|
||||
if(xorriso->do_aaip & 32)
|
||||
content_shortcut= 1;
|
||||
(*result)|= (1 << 15); /* content bytes differ */
|
||||
sprintf(respt,
|
||||
"%s content : assuming inequality after dev_ino mismatch\n", a);
|
||||
if((xorriso->do_aaip & 32) && !(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
}
|
||||
} else {
|
||||
sprintf(respt, "%s dev_ino : no dev_ino stored with image node\n", a);
|
||||
if((xorriso->do_aaip & 32) && !(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
(*result)|= (1 << 22);
|
||||
}
|
||||
}
|
||||
|
||||
if(S_ISREG(s1.st_mode) && S_ISREG(s2.st_mode) && !content_shortcut) {
|
||||
/* Content */
|
||||
if(is_split) {
|
||||
for(i= 0; i<split_count; i++) {
|
||||
Splitparts_get(split_parts, i, &part_name, &partno, &total_parts,
|
||||
&offset, &bytes, &total_bytes, 0);
|
||||
strcpy(part_path, iso_adr);
|
||||
if(Sfile_add_to_path(part_path, part_name, 0)<=0) {
|
||||
Xorriso_much_too_long(xorriso, strlen(iso_adr)+strlen(part_name)+1,
|
||||
2);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
ret= Xorriso_iso_lstat(xorriso, part_path, &stbuf, 0);
|
||||
if(ret<0)
|
||||
continue;
|
||||
ret= Xorriso_compare_2_contents(xorriso, a, disk_adr, s1.st_size,
|
||||
offset, bytes,
|
||||
part_path, stbuf.st_size, result,
|
||||
(s1.st_mtime==s2.st_mtime) | (flag&((1<<29)|(1<<31))));
|
||||
if(ret<0)
|
||||
was_error= 1;
|
||||
}
|
||||
if(total_parts>0 && split_count!=total_parts) {
|
||||
sprintf(xorriso->info_text,
|
||||
"- %s/* (ISO) : Not all split parts present (%d of %d)\n",
|
||||
iso_adr, split_count, total_parts);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 1);
|
||||
(*result)|= 1<<18;
|
||||
}
|
||||
} else {
|
||||
ret= Xorriso_compare_2_contents(xorriso, a, disk_adr, s1.st_size,
|
||||
(off_t) 0, s1.st_size,
|
||||
iso_adr, s2.st_size, result,
|
||||
(s1.st_mtime==s2.st_mtime) | (flag&((1<<29)|(1<<31))));
|
||||
if(ret<0)
|
||||
was_error= 1;
|
||||
}
|
||||
|
||||
}
|
||||
if(was_error)
|
||||
ret= -1;
|
||||
else
|
||||
ret= (((*result) & ~((1 << 17) | (1 << 18) | (1 << 23)))==0);
|
||||
ex:;
|
||||
if(split_parts!=NULL)
|
||||
Splitparts_destroy(&split_parts, split_count, 0);
|
||||
Xorriso_local_getfacl(xorriso, disk_adr, &a1_acl, 1 << 15);
|
||||
Xorriso_local_getfacl(xorriso, disk_adr, &d1_acl, 1 << 15);
|
||||
if(a2_acl != NULL)
|
||||
free(a2_acl);
|
||||
if(d2_acl != NULL)
|
||||
free(d2_acl);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_pfx_disk_path(struct XorrisO *xorriso, char *iso_path,
|
||||
char *iso_prefix, char *disk_prefix,
|
||||
char disk_path[SfileadrL], int flag)
|
||||
{
|
||||
int ret;
|
||||
char adrc[SfileadrL];
|
||||
|
||||
if(strncmp(iso_path, iso_prefix, strlen(iso_prefix))!=0)
|
||||
return(-1);
|
||||
if(strlen(disk_prefix) + strlen(iso_path) - strlen(iso_prefix)+1 >= SfileadrL)
|
||||
return(-1);
|
||||
if(iso_path[strlen(iso_prefix)] == '/')
|
||||
strcpy(adrc, iso_path + strlen(iso_prefix) + 1);
|
||||
else
|
||||
strcpy(adrc, iso_path + strlen(iso_prefix));
|
||||
ret= Xorriso_make_abs_adr(xorriso, disk_prefix, adrc, disk_path, 4 | 8);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param boss_iter Opaque handle to be forwarded to actions in ISO image
|
||||
Set to NULL if calling this function from outside ISO world
|
||||
@param flag bit0= update rather than compare
|
||||
bit1= find[ix] is in recursion
|
||||
@return <=0 error, 1= ok , 2= iso_path was deleted
|
||||
3=ok, do not dive into directory (e.g. because it is a split file)
|
||||
*/
|
||||
int Xorriso_find_compare(struct XorrisO *xorriso, void *boss_iter,
|
||||
char *iso_path, char *iso_prefix, char *disk_prefix,
|
||||
int flag)
|
||||
{
|
||||
int ret, result, uret, follow_links, deleted= 0;
|
||||
char disk_path[SfileadrL];
|
||||
|
||||
ret= Xorriso_pfx_disk_path(xorriso, iso_path, iso_prefix, disk_prefix,
|
||||
disk_path, 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
|
||||
/* compare exclusions against disk_path resp. leaf name */
|
||||
if(xorriso->disk_excl_mode&8)
|
||||
ret= Xorriso_path_is_excluded(xorriso, disk_path, !(flag&2));
|
||||
else
|
||||
ret= 0;
|
||||
if(ret<0)
|
||||
return(ret);
|
||||
if(ret>0)
|
||||
return(3);
|
||||
|
||||
follow_links= (xorriso->do_follow_links ||
|
||||
(xorriso->do_follow_param && !(flag&2))) <<28;
|
||||
ret= Xorriso_compare_2_files(xorriso, disk_path, iso_path, "", &result,
|
||||
2 | follow_links | ((!(flag&2))<<27) | ((flag&1)<<31));
|
||||
/* was once: | ((!(flag&1))<<29) */
|
||||
if(ret<xorriso->find_compare_result)
|
||||
xorriso->find_compare_result= ret;
|
||||
if(flag&1) {
|
||||
if(ret<=0) {
|
||||
if(ret<0)
|
||||
if(Xorriso_eval_problem_status(xorriso, ret, 1|2)<0)
|
||||
return(ret);
|
||||
uret= Xorriso_update_interpreter(xorriso, boss_iter, result,
|
||||
disk_path, iso_path, (flag&2)<<1);
|
||||
if(uret<=0)
|
||||
ret= 0;
|
||||
if(uret==2)
|
||||
deleted= 1;
|
||||
}
|
||||
}
|
||||
if(ret<0)
|
||||
return(ret);
|
||||
if(deleted)
|
||||
return(2);
|
||||
if(result&(1<<17))
|
||||
return(3);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param boss_iter Opaque handle to be forwarded to actions in ISO image
|
||||
Set to NULL if calling this function from outside ISO world
|
||||
@param flag bit0= widen hardlink sibling:
|
||||
Do not call Xorriso_hardlink_update()
|
||||
Overwrite exactly if normal mode would not,
|
||||
else do nothing
|
||||
bit2= -follow: this is not a command parameter
|
||||
@return <=0 error, 1= ok , 2= iso_rr_path node object has been deleted ,
|
||||
3= no action taken
|
||||
*/
|
||||
int Xorriso_update_interpreter(struct XorrisO *xorriso, void *boss_iter,
|
||||
int compare_result, char *disk_path,
|
||||
char *iso_rr_path, int flag)
|
||||
{
|
||||
int ret, deleted= 0, is_split= 0, i, loop_count, late_hardlink_update= 0;
|
||||
char sfe[5*SfileadrL];
|
||||
struct stat stbuf;
|
||||
struct SplitparT *split_parts= NULL;
|
||||
int split_count= 0;
|
||||
char part_path[SfileadrL], *part_name;
|
||||
int partno, total_parts, new_total_parts;
|
||||
off_t offset, bytes, total_bytes, disk_size, first_bytes;
|
||||
|
||||
if((compare_result&3)==3) {
|
||||
sprintf(xorriso->info_text, "Missing on disk and in ISO: disk_path %s",
|
||||
Text_shellsafe(disk_path, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 1);
|
||||
xorriso->find_compare_result= -1;
|
||||
ret= 3; goto ex;
|
||||
}
|
||||
|
||||
if(compare_result&((1<<11)|(1<<13))) {
|
||||
if(flag & 1)
|
||||
{ret= 3; goto ex;}
|
||||
/* cannot open regular disk file, early eof of disk file */
|
||||
sprintf(xorriso->info_text, "Problems with reading disk file %s",
|
||||
Text_shellsafe(disk_path, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 1);
|
||||
xorriso->find_compare_result= -1;
|
||||
ret= 1; goto ex;
|
||||
}
|
||||
xorriso->info_text[0]= 0;
|
||||
is_split= !!(compare_result & (1<<17));
|
||||
|
||||
if((!(xorriso->ino_behavior & 2)) && (compare_result & (2 | (3 << 21))) &&
|
||||
!(flag & 1)) {
|
||||
if(compare_result & 2) {
|
||||
/* File is not yet in image */
|
||||
late_hardlink_update= 1;
|
||||
} else {
|
||||
/* Hard link relation has changed resp. was not recorded. */
|
||||
ret= Xorriso_hardlink_update(xorriso, &compare_result,
|
||||
disk_path, iso_rr_path, flag & 4);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
if(ret == 2)
|
||||
{ret= 1; goto ex;}
|
||||
}
|
||||
}
|
||||
|
||||
if(compare_result&(8|64)) {
|
||||
/* file type, minor+major with device file */
|
||||
if(flag & 1)
|
||||
{ret= 3; goto ex;}
|
||||
ret= Xorriso_rmi(xorriso, boss_iter, (off_t) 0, iso_rr_path, 1); /* rm_r */
|
||||
if(ret>0) {
|
||||
deleted= 1;
|
||||
ret= Xorriso_graft_in(xorriso, boss_iter, disk_path, iso_rr_path,
|
||||
(off_t) 0, (off_t) 0, 2|(flag&4));
|
||||
}
|
||||
sprintf(xorriso->info_text, "Deleted and re-added ");
|
||||
|
||||
} else if(compare_result&(1)) {
|
||||
delete:;
|
||||
/* disk_adr not existing */
|
||||
ret= Xorriso_rmi(xorriso, boss_iter, (off_t) 0, iso_rr_path, 1);
|
||||
deleted= 1;
|
||||
sprintf(xorriso->info_text, "Deleted ");
|
||||
|
||||
} else if(compare_result&(2|128|(1<<12)|(1<<14)|(1<<15))) {
|
||||
/* iso_adr not existing, size, cannot open iso file, early eof of iso file
|
||||
content bytes differ */
|
||||
|
||||
if(flag & 1)
|
||||
{ret= 3; goto ex;}
|
||||
overwrite:;
|
||||
if(is_split) {
|
||||
ret= Xorriso_identify_split(xorriso, iso_rr_path, NULL,
|
||||
&split_parts, &split_count, &stbuf, 0);
|
||||
if(ret<=0)
|
||||
{ret= -1; goto ex;} /* (should not happen) */
|
||||
ret= lstat(disk_path, &stbuf);
|
||||
if(ret==-1)
|
||||
goto delete;
|
||||
disk_size= stbuf.st_size;
|
||||
Splitparts_get(split_parts, 0, &part_name, &partno, &total_parts,
|
||||
&offset, &first_bytes, &total_bytes, 0);
|
||||
new_total_parts= disk_size/first_bytes;
|
||||
if(disk_size % first_bytes)
|
||||
new_total_parts++;
|
||||
|
||||
loop_count= split_count;
|
||||
/* If disk file grew over part limit and all parts are present:
|
||||
add new parts */
|
||||
if(new_total_parts > total_parts && split_count == total_parts)
|
||||
loop_count= new_total_parts;
|
||||
|
||||
for(i= 0; i<loop_count; i++) {
|
||||
if(i<split_count) {
|
||||
/* Delete old part */
|
||||
Splitparts_get(split_parts, i, &part_name, &partno, &total_parts,
|
||||
&offset, &bytes, &total_bytes, 0);
|
||||
strcpy(part_path, iso_rr_path);
|
||||
if(Sfile_add_to_path(part_path, part_name, 0)<=0) {
|
||||
Xorriso_much_too_long(xorriso,
|
||||
strlen(iso_rr_path)+strlen(part_path)+1, 2);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
ret= Xorriso_rmi(xorriso, NULL, (off_t) 0, part_path, 1);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
deleted= 1;
|
||||
} else {
|
||||
partno= i+1;
|
||||
offset= i*first_bytes;
|
||||
bytes= first_bytes;
|
||||
}
|
||||
if(disk_size<=offset)
|
||||
continue;
|
||||
/* Insert new part */
|
||||
if(strlen(part_path)+160>SfileadrL) {
|
||||
Xorriso_much_too_long(xorriso, strlen(part_path)+160, 2);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
Splitpart__compose(part_path+strlen(iso_rr_path)+1, partno,
|
||||
new_total_parts, offset, first_bytes, disk_size, 0);
|
||||
ret= Xorriso_graft_in(xorriso, boss_iter, disk_path, part_path,
|
||||
offset, bytes, 2|(flag&4)|8|128);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
}
|
||||
/* Copy file attributes to iso_rr_path, augment r-perms by x-perms */
|
||||
ret= Xorriso_copy_properties(xorriso, disk_path, iso_rr_path, 2 | 4);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
} else {
|
||||
ret= Xorriso_graft_in(xorriso, boss_iter, disk_path, iso_rr_path,
|
||||
(off_t) 0, (off_t) 0, 2|(flag&4));
|
||||
if(ret>0 && !(compare_result&2))
|
||||
deleted= 1;
|
||||
}
|
||||
if(late_hardlink_update) {
|
||||
/* Handle eventual hardlink siblings of newly created file */
|
||||
ret= Xorriso_hardlink_update(xorriso, &compare_result,
|
||||
disk_path, iso_rr_path, 1 | (flag & 4));
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
}
|
||||
if(flag & 1)
|
||||
sprintf(xorriso->info_text, "Widened hard link ");
|
||||
else
|
||||
sprintf(xorriso->info_text, "Added/overwrote ");
|
||||
|
||||
} else if(compare_result&(4|16|32|256|512|1024|(1<<19)|(1<<20)|(1<<22))) {
|
||||
/* access permissions, user id, group id, mtime, atime, ctime, ACL, xattr,
|
||||
dev_ino missing */
|
||||
|
||||
if(flag & 1)
|
||||
goto overwrite;
|
||||
|
||||
if(is_split) {
|
||||
ret= Xorriso_identify_split(xorriso, iso_rr_path, NULL,
|
||||
&split_parts, &split_count, &stbuf, 0);
|
||||
if(ret<=0)
|
||||
{ret= -1; goto ex;} /* (should not happen) */
|
||||
for(i= 0; i<split_count; i++) {
|
||||
Splitparts_get(split_parts, i, &part_name, &partno, &total_parts,
|
||||
&offset, &bytes, &total_bytes, 0);
|
||||
strcpy(part_path, iso_rr_path);
|
||||
if(Sfile_add_to_path(part_path, part_name, 0)<=0) {
|
||||
Xorriso_much_too_long(xorriso,
|
||||
strlen(iso_rr_path)+strlen(part_path)+1, 2);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
ret= Xorriso_copy_properties(xorriso, disk_path, part_path,
|
||||
4 * !(compare_result & (1<<21)));
|
||||
/* do not update eventually mismatching dev_ino */
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
}
|
||||
/* Copy file attributes to iso_rr_path, augment r-perms by x-perms */
|
||||
ret= Xorriso_copy_properties(xorriso, disk_path, iso_rr_path, 2 | 4);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
} else
|
||||
ret= Xorriso_copy_properties(xorriso, disk_path, iso_rr_path, 4);
|
||||
sprintf(xorriso->info_text, "Adjusted attributes of ");
|
||||
|
||||
} else if(flag & 1) {
|
||||
goto overwrite;
|
||||
} else
|
||||
ret= 1;
|
||||
if(ret>0 && xorriso->info_text[0]) {
|
||||
strcat(xorriso->info_text, Text_shellsafe(iso_rr_path, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "UPDATE", 0);
|
||||
}
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(split_parts!=NULL)
|
||||
Splitparts_destroy(&split_parts, split_count, 0);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
if(deleted)
|
||||
return(2);
|
||||
return(ret);
|
||||
}
|
||||
|
40
xorriso/cmp_update.h
Normal file
40
xorriso/cmp_update.h
Normal file
@ -0,0 +1,40 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of class DirseQ which
|
||||
crawls along a directory's content list.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_cmp_includeD
|
||||
#define Xorriso_pvt_cmp_includeD yes
|
||||
|
||||
int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
|
||||
char *iso_adr, char *adr_common_tail,
|
||||
int *result, int flag);
|
||||
|
||||
int Xorriso_pfx_disk_path(struct XorrisO *xorriso, char *iso_path,
|
||||
char *iso_prefix, char *disk_prefix,
|
||||
char disk_path[SfileadrL], int flag);
|
||||
|
||||
/* @param boss_iter Opaque handle to be forwarded to actions in ISO image
|
||||
Set to NULL if calling this function from outside ISO world
|
||||
@param flag bit0= update rather than compare
|
||||
*/
|
||||
int Xorriso_find_compare(struct XorrisO *xorriso, void *boss_iter,
|
||||
char *iso_path, char *iso_prefix, char *disk_prefix,
|
||||
int flag);
|
||||
|
||||
/* @param boss_iter Opaque handle to be forwarded to actions in ISO image
|
||||
Set to NULL if calling this function from outside ISO world
|
||||
*/
|
||||
int Xorriso_update_interpreter(struct XorrisO *xorriso, void *boss_iter,
|
||||
int compare_result, char *disk_path,
|
||||
char *iso_rr_path, int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_cmp_includeD */
|
||||
|
@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
# compile_xorriso.sh
|
||||
# Copyright 2005 - 2009 Thomas Schmitt, scdbackup@gmx.net, GPL version 2
|
||||
# Copyright 2005 - 2010 Thomas Schmitt, scdbackup@gmx.net, GPL version 2
|
||||
#
|
||||
# Not intended for general use in production installations !
|
||||
# Rather use: ./bootstrap ; ./configure ; make
|
||||
@ -26,6 +26,7 @@ warn_opts="-Wall"
|
||||
nglibisofs=1
|
||||
def_libreadline="-DXorriso_with_readlinE"
|
||||
link_libreadline="-lreadline"
|
||||
link_libcdio=
|
||||
|
||||
for i in "$@"
|
||||
do
|
||||
@ -43,12 +44,20 @@ do
|
||||
then
|
||||
def_libreadline=""
|
||||
link_libreadline=""
|
||||
elif test "$i" = "-dvd_obs_64k"
|
||||
then
|
||||
def_opts="$def_opts -DXorriso_dvd_obs_default_64K"
|
||||
elif test "$i" = "-use_libcdio"
|
||||
then
|
||||
link_libcdio="-lcdio"
|
||||
elif test "$i" = "-help" -o "$i" = "--help" -o "$i" = "-h"
|
||||
then
|
||||
echo \
|
||||
"$xorr/compile_xorriso.sh : to be executed above top level directories"
|
||||
echo "Options:"
|
||||
echo " -dvd_obs_64k 64 KB default size for DVD/BD writing."
|
||||
echo " -no_libreadline do not compile for and link with libreadline."
|
||||
echo " -use_libcdio link with -lcdio because libburn uses it."
|
||||
echo " -do_diet produce capability reduced lean version."
|
||||
echo " -do_strip apply program strip to compiled programs."
|
||||
echo " -g produce debuggable programm."
|
||||
@ -98,7 +107,7 @@ echo "Version timestamp : $(sed -e 's/#define Xorriso_timestamP "//' -e 's/"$//
|
||||
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 $link_libcdio"
|
||||
cc -I. -DXorriso_with_maiN $def_libreadline \
|
||||
$warn_opts \
|
||||
$static_opts \
|
||||
@ -108,9 +117,38 @@ cc -I. -DXorriso_with_maiN $def_libreadline \
|
||||
\
|
||||
-o "$xorr"/xorriso \
|
||||
\
|
||||
"$xorr"/xorriso.c \
|
||||
"$xorr"/xorriso_main.c \
|
||||
"$xorr"/sfile.c \
|
||||
"$xorr"/aux_objects.c \
|
||||
"$xorr"/findjob.c \
|
||||
"$xorr"/check_media.c \
|
||||
"$xorr"/misc_funct.c \
|
||||
"$xorr"/text_io.c \
|
||||
"$xorr"/match.c \
|
||||
"$xorr"/emulators.c \
|
||||
"$xorr"/disk_ops.c \
|
||||
"$xorr"/cmp_update.c \
|
||||
"$xorr"/parse_exec.c \
|
||||
"$xorr"/opts_a_c.c \
|
||||
"$xorr"/opts_d_h.c \
|
||||
"$xorr"/opts_i_o.c \
|
||||
"$xorr"/opts_p_z.c \
|
||||
\
|
||||
"$xorr"/xorrisoburn.c \
|
||||
"$xorr"/base_obj.c \
|
||||
"$xorr"/lib_mgt.c \
|
||||
"$xorr"/sort_cmp.c \
|
||||
"$xorr"/drive_mgt.c \
|
||||
"$xorr"/iso_img.c \
|
||||
"$xorr"/iso_tree.c \
|
||||
"$xorr"/iso_manip.c \
|
||||
"$xorr"/write_run.c \
|
||||
"$xorr"/read_run.c \
|
||||
"$xorr"/filters.c \
|
||||
\
|
||||
"$isoburn"/isoburn.c \
|
||||
"$isoburn"/burn_wrap.c \
|
||||
"$isoburn"/data_source.c \
|
||||
"$isoburn"/isofs_wrap.c \
|
||||
\
|
||||
"$burn"/async.o \
|
||||
"$burn"/debug.o \
|
||||
@ -137,16 +175,12 @@ cc -I. -DXorriso_with_maiN $def_libreadline \
|
||||
"$burn"/toc.o \
|
||||
\
|
||||
"$burn"/crc.o \
|
||||
"$burn"/lec.o \
|
||||
\
|
||||
"$isoburn"/isoburn.o \
|
||||
"$isoburn"/burn_wrap.o \
|
||||
"$isoburn"/data_source.o \
|
||||
"$isoburn"/isofs_wrap.o \
|
||||
"$burn"/ecma130ab.o \
|
||||
\
|
||||
$libisofs \
|
||||
\
|
||||
$link_libreadline \
|
||||
$link_libcdio \
|
||||
\
|
||||
-lpthread \
|
||||
-lacl \
|
||||
|
@ -1,22 +1,35 @@
|
||||
AC_INIT([xorriso], [0.4.1], [http://libburnia-project.org])
|
||||
|
||||
# configure.ac stems from xorriso/configure_ac.txt and leads to ./configure
|
||||
# Copyright (c) 2007 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
# Provided under GPL version 2 or later.
|
||||
|
||||
AC_INIT([xorriso], [0.6.0], [http://libburnia-project.org])
|
||||
AC_PREREQ([2.50])
|
||||
dnl AC_CONFIG_HEADER([config.h])
|
||||
|
||||
AC_CANONICAL_HOST
|
||||
AC_CANONICAL_TARGET
|
||||
|
||||
LIBBURNIA_SET_FLAGS
|
||||
|
||||
AM_INIT_AUTOMAKE([subdir-objects])
|
||||
|
||||
dnl Let autoheader produce config.h.in and let configure produce config.h
|
||||
dnl This saves about 500 characters of compile message per source file.
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
|
||||
AH_TEMPLATE([Xorriso_standalonE], [Define to prepare sources for statically linked xorriso])
|
||||
AC_DEFINE([Xorriso_standalonE], [])
|
||||
|
||||
BURN_MAJOR_VERSION=0
|
||||
BURN_MINOR_VERSION=7
|
||||
BURN_MICRO_VERSION=1
|
||||
BURN_MINOR_VERSION=8
|
||||
BURN_MICRO_VERSION=5
|
||||
AC_SUBST(BURN_MAJOR_VERSION)
|
||||
AC_SUBST(BURN_MINOR_VERSION)
|
||||
AC_SUBST(BURN_MICRO_VERSION)
|
||||
|
||||
LIBISOFS_MAJOR_VERSION=0
|
||||
LIBISOFS_MINOR_VERSION=6
|
||||
LIBISOFS_MICRO_VERSION=23
|
||||
LIBISOFS_MICRO_VERSION=35
|
||||
AC_SUBST(LIBISOFS_MAJOR_VERSION)
|
||||
AC_SUBST(LIBISOFS_MINOR_VERSION)
|
||||
AC_SUBST(LIBISOFS_MICRO_VERSION)
|
||||
@ -43,12 +56,26 @@ if test ! $ac_cv_func_fseeko; then
|
||||
AC_ERROR([Libburn requires largefile support.])
|
||||
fi
|
||||
|
||||
AH_TEMPLATE([ICONV_CONST], [Whether to apply const qualifier to iconv inbuf])
|
||||
if test x$XORRISO_OLD_ICONV_CONFIGURE = x
|
||||
then
|
||||
|
||||
dnl ts B00410 : To detect the need for -liconv and const argument of iconv()
|
||||
LIBBURNIA_CHECK_ICONV
|
||||
dnl ts B00411 : To abort configuration if iconv() still cannot be compiled
|
||||
LIBBURNIA_ASSERT_ICONV
|
||||
|
||||
else
|
||||
|
||||
dnl Outdated: produces double -liconv and warnings about parameter mismatch
|
||||
dnl If iconv(3) is in an extra libiconv, then it gets added to variable LIBS.
|
||||
dnl If not, then no -liconv will be added.
|
||||
AC_CHECK_LIB(iconv, iconv, , )
|
||||
dnl GNU iconv has no function iconv() but libiconv() and a macro iconv()
|
||||
AC_CHECK_LIB(iconv, libiconv, , )
|
||||
|
||||
|
||||
fi
|
||||
|
||||
AC_PROG_LIBTOOL
|
||||
AC_SUBST(LIBTOOL_DEPS)
|
||||
LIBTOOL="$LIBTOOL --silent"
|
||||
@ -83,14 +110,16 @@ AC_SUBST(ARCH)
|
||||
AC_SUBST(LIBBURNIA_PKGCONFDIR)
|
||||
AC_SUBST(LIBBURN_ARCH_LIBS)
|
||||
|
||||
|
||||
dnl ts A90303
|
||||
dnl Check the preconditions for using statvfs() in sg-dummy
|
||||
dnl (sg-linux and sg-freebsd use statvfs() unconditionally)
|
||||
AH_TEMPLATE([Libburn_os_has_statvfS], [Define to use statvfs() with libburn stdio])
|
||||
STATVFS_DEF=-DLibburn_os_has_statvfS
|
||||
AC_CHECK_HEADER(sys/statvfs.h, X=, STATVFS_DEF=)
|
||||
AC_CHECK_FUNC([statvfs], X=, STATVFS_DEF=)
|
||||
CFLAGS="$CFLAGS $STATVFS_DEF"
|
||||
if test x$STATVFS_DEF = x-DLibburn_os_has_statvfS
|
||||
then
|
||||
AC_DEFINE([Libburn_os_has_statvfS], [])
|
||||
fi
|
||||
|
||||
|
||||
dnl Add compiler-specific flags
|
||||
@ -119,6 +148,7 @@ dnl
|
||||
LIBBURNIA_SET_PKGCONFIG
|
||||
|
||||
|
||||
AH_TEMPLATE([Xorriso_with_readlinE], [Define to use libreadline])
|
||||
AC_ARG_ENABLE(libreadline,
|
||||
[ --enable-libreadline Enable use of libreadline by xorriso, default=yes],
|
||||
, enable_libreadline=yes)
|
||||
@ -126,16 +156,29 @@ if test x$enable_libreadline = xyes; then
|
||||
dnl Check whether there is readline-devel and readline-runtime.
|
||||
dnl If not, erase this macro which would enable use of readline(),add_history()
|
||||
READLINE_DEF="-DXorriso_with_readlinE"
|
||||
|
||||
if test x$XORRISO_OLD_READLINE_CONFIGURE = x
|
||||
then
|
||||
|
||||
dnl ts B00411 : To disable readline if not all needed functions are present
|
||||
LIBBURNIA_ASSERT_READLINE
|
||||
|
||||
else
|
||||
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
|
||||
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= )
|
||||
|
||||
fi
|
||||
else
|
||||
READLINE_DEF=
|
||||
fi
|
||||
AC_SUBST(READLINE_DEF)
|
||||
|
||||
if test x$READLINE_DEF = x-DXorriso_with_readlinE
|
||||
then
|
||||
AC_DEFINE([Xorriso_with_readlinE], [])
|
||||
fi
|
||||
|
||||
AH_TEMPLATE([Libisofs_with_aaip_acL], [Define to use ACL capabilities])
|
||||
AC_ARG_ENABLE(libacl,
|
||||
[ --enable-libacl Enable use of libacl by libisofs, default=yes],
|
||||
, enable_libacl=yes)
|
||||
@ -148,38 +191,88 @@ dnl The empty yes case obviously causes -lacl to be linked
|
||||
else
|
||||
LIBACL_DEF=
|
||||
fi
|
||||
AC_SUBST(LIBACL_DEF)
|
||||
if test x$LIBACL_DEF = x-DLibisofs_with_aaip_acL
|
||||
then
|
||||
AC_DEFINE([Libisofs_with_aaip_acL], [])
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([Libisofs_with_aaip_xattR], [Define to use xattr capabilities])
|
||||
AC_ARG_ENABLE(xattr,
|
||||
[ --enable-xattr Enable use of xattr by libisofs, default=yes],
|
||||
, enable_xattr=yes)
|
||||
if test x$enable_xattr = xyes; then
|
||||
dnl Check whether there is the header for Linux xattr.
|
||||
dnl Check whether there is the header for GNU/Linux xattr.
|
||||
dnl If not, erase this macro which would enable use of listxattr and others
|
||||
XATTR_DEF="-DLibisofs_with_aaip_xattR"
|
||||
AC_CHECK_HEADER(attr/xattr.h, AC_CHECK_LIB(c, listxattr, X= , XATTR_DEF= ), XATTR_DEF= )
|
||||
else
|
||||
XATTR_DEF=
|
||||
fi
|
||||
AC_SUBST(XATTR_DEF)
|
||||
if test x$XATTR_DEF = x-DLibisofs_with_aaip_xattR
|
||||
then
|
||||
AC_DEFINE([Libisofs_with_aaip_xattR], [])
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([Libisofs_with_zliB], [Define to use compression via libz])
|
||||
AC_ARG_ENABLE(zlib,
|
||||
[ --enable-zlib Enable use of zlib by libisofs, default=yes],
|
||||
, enable_zlib=yes)
|
||||
if test x$enable_zlib = xyes; then
|
||||
dnl Check whether there is the header for zlib.
|
||||
dnl If not, erase this macro which would enable use of compress2() and others.
|
||||
dnl The empty parameter after "compress2" causes -lz.
|
||||
dnl Linking fails on SuSE 9.0 because zlib has compress2() but lacks
|
||||
dnl compressBound(). So compressBound is the more modern thing to test.
|
||||
dnl The empty parameter after "compressBound" causes -lz.
|
||||
ZLIB_DEF="-DLibisofs_with_zliB"
|
||||
AC_CHECK_HEADER(zlib.h, AC_CHECK_LIB(z, compress2, , ZLIB_DEF= ), ZLIB_DEF= )
|
||||
AC_CHECK_HEADER(zlib.h, AC_CHECK_LIB(z, compressBound, , ZLIB_DEF= ), ZLIB_DEF= )
|
||||
else
|
||||
ZLIB_DEF=
|
||||
fi
|
||||
AC_SUBST(ZLIB_DEF)
|
||||
if test x$ZLIB_DEF = x-DLibisofs_with_zliB
|
||||
then
|
||||
AC_DEFINE([Libisofs_with_zliB], [])
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([Libburn_use_libcdiO], [Define to use libcdio as system adapter])
|
||||
AC_ARG_ENABLE(libcdio,
|
||||
[ --enable-libcdio Enable EXPERIMENTAL use of libcdio as system adapter, default=no],
|
||||
, enable_libcdio=no)
|
||||
if test x$enable_libcdio = xyes; then
|
||||
dnl Check whether there is libcdio-devel and libcdio-runtime.
|
||||
dnl If not, erase this macro
|
||||
LIBCDIO_DEF="-DLibburn_use_libcdiO"
|
||||
dnl The empty yes case obviously causes -lcdio to be linked
|
||||
AC_CHECK_HEADER(cdio/cdio.h, AC_CHECK_LIB(cdio, mmc_last_cmd_sense, , LIBCDIO_DEF= ), LIBCDIO_DEF= )
|
||||
else
|
||||
LIBCDIO_DEF=
|
||||
fi
|
||||
if test x$LIBCDIO_DEF = x
|
||||
then
|
||||
if test x$enable_libcdio = xyes
|
||||
then
|
||||
echo "WARNING: could not enable use of libcdio as system adapter"
|
||||
fi
|
||||
else
|
||||
echo "enabled EXPERIMENTAL use of libcdio as system adapter"
|
||||
|
||||
# ------- Visible mark in configure : Start of library check
|
||||
|
||||
LIBCDIO_REQUIRED=0.83
|
||||
PKG_CHECK_MODULES(LIBCDIO, libcdio >= $LIBCDIO_REQUIRED)
|
||||
|
||||
# ------- Visible mark in configure : End of library check
|
||||
|
||||
fi
|
||||
if test x$LIBCDIO_DEF = x-DLibburn_use_libcdiO
|
||||
then
|
||||
AC_DEFINE([Libburn_use_libcdiO], [])
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([Xorriso_allow_external_filterS], [Define to allow xorriso to start external filter processes])
|
||||
AC_ARG_ENABLE(external-filters,
|
||||
[ --enable-external-filters Enable use of external filter programs by xorriso, default=yes],
|
||||
, enable_external_filters=yes)
|
||||
@ -190,8 +283,13 @@ else
|
||||
EXTF_DEF=
|
||||
echo "disabled xorriso external filter programs"
|
||||
fi
|
||||
AC_SUBST(EXTF_DEF)
|
||||
if test x$EXTF_DEF = x-DXorriso_allow_external_filterS
|
||||
then
|
||||
AC_DEFINE([Xorriso_allow_external_filterS], [])
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([Xorriso_allow_extf_suiD], [Define to allow external filters to xorriso when running under setuid])
|
||||
AC_ARG_ENABLE(external-filters-setuid,
|
||||
[ --enable-external-filters-setuid Enable xorriso external filter programs under setuid, default=no],
|
||||
, enable_external_filters_setuid=no)
|
||||
@ -202,14 +300,50 @@ else
|
||||
EXTF_SUID_DEF=
|
||||
echo "disabled xorriso external filter programs under setuid"
|
||||
fi
|
||||
AC_SUBST(EXTF_SUID_DEF)
|
||||
if test x$EXTF_SUID_DEF = x-DXorriso_allow_extf_suiD
|
||||
then
|
||||
AC_DEFINE([Xorriso_allow_extf_suiD], [])
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([Xorriso_dvd_obs_default_64K], [Define to make 64 KB default size for DVD/BD writing])
|
||||
AC_ARG_ENABLE(dvd-obs-64k,
|
||||
[ --enable-dvd-obs-64k 64 KB default size for DVD/BD writing, default=no],
|
||||
, enable_dvd_obs=no)
|
||||
if test x$enable_dvd_obs_64k = xyes; then
|
||||
XORRISO_DVD_OBS_64K="-DXorriso_dvd_obs_default_64K"
|
||||
echo "enabled xorriso write size default 64 KB on DVD and BD"
|
||||
else
|
||||
XORRISO_DVD_OBS_64K=
|
||||
echo "disabled xorriso write size default 64 KB on DVD and BD"
|
||||
fi
|
||||
if test x$XORRISO_DVD_OBS_64K = x-DXorriso_dvd_obs_default_64K
|
||||
then
|
||||
AC_DEFINE([Xorriso_dvd_obs_default_64K], [])
|
||||
fi
|
||||
|
||||
|
||||
AH_TEMPLATE([Libburn_read_o_direcT], [Define to use O_DIRECT with -as cdrskin])
|
||||
AC_ARG_ENABLE(track-src-odirect,
|
||||
[ --enable-track-src-odirect Enable use of O_DIRECT with -as cdrskin, default=no],
|
||||
, enable_track_src_odirect=no)
|
||||
if test x$enable_track_src_odirect = xyes; then
|
||||
LIBBURN_O_DIRECT_DEF="-DLibburn_read_o_direcT"
|
||||
echo "enabled use of O_DIRECT with input of -as cdrskin"
|
||||
else
|
||||
LIBBURN_O_DIRECT_DEF=
|
||||
echo "disabled use of O_DIRECT with input of -as cdrskin"
|
||||
fi
|
||||
if test x$LIBBURN_O_DIRECT_DEF = x-DLibburn_read_o_direcT
|
||||
then
|
||||
AC_DEFINE([Libburn_read_o_direcT], [])
|
||||
fi
|
||||
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
version.h
|
||||
])
|
||||
AC_OUTPUT
|
||||
|
||||
# xorriso.pc
|
||||
|
||||
|
@ -55,12 +55,16 @@ then
|
||||
-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>Aquiring source and target drive:<\/b>/\ <BR><b>Aquiring source and target drive:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Data manipulations:<\/b>/\ <BR><b>Data manipulations:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Influencing the behavior of image/\ <BR><b>Influencing the behavior of image/' \
|
||||
-e 's/<b>Inserting files into ISO image:<\/b>/\ <BR><b>Inserting files into ISO image:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>File manipulations:<\/b>/\ <BR><b>File manipulations:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Tree traversal command -find:<\/b>/\ <BR><b>Tree traversal command -find:<\/b><BR>\ <BR>/' \
|
||||
-e 's/^<p><b>−iso_rr_pattern/<p>\ <BR><b>\−iso_rr_pattern/' \
|
||||
-e 's/EXAMPLES):<br>/<A HREF="#EXAMPLES">EXAMPLES<\/A>):<br>/' \
|
||||
-e 's/<b>Writing the result:<\/b>/\ <BR><b>Writing the result:<\/b><BR>/' \
|
||||
-e 's/<b>Filters for data file content:<\/b>/\ <BR><b>Filters for data file content:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Writing the result, drive control:<\/b>/\ <BR><b>Writing the result, drive control:<\/b><BR>\ <BR>/' \
|
||||
-e 's/^-find \/ /\ \ -find \/ /' \
|
||||
-e 's/<b>Settings for data insertion:<\/b>/\ <BR><b>Settings for data insertion:<\/b><BR>\ <BR>/' \
|
||||
-e 's/<b>Settings for file insertion:<\/b>/\ <BR><b>Settings for file insertion:<\/b><BR>\ <BR>/' \
|
||||
-e 's/^$<\/b> ln -s/\ \ $<\/b> ln -s/' \
|
||||
-e 's/<b>Settings for result writing:<\/b>/\ <BR><b>Settings for result writing:<\/b><BR>\ <BR>/' \
|
||||
-e 's/^706k = 706kB/\ \ 706k = 706kB/' \
|
||||
@ -73,7 +77,7 @@ then
|
||||
-e 's/<b>Navigation in ISO image/\ <BR><b>Navigation in ISO image/' \
|
||||
-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 ISO-to-disk restore options:<\/b>/\ <BR><b>osirrox ISO-to-disk restore options:<\/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/<b>Scripting, dialog and/\ <BR><b>Scripting, dialog and/' \
|
||||
|
1857
xorriso/disk_ops.c
Normal file
1857
xorriso/disk_ops.c
Normal file
File diff suppressed because it is too large
Load Diff
116
xorriso/disk_ops.h
Normal file
116
xorriso/disk_ops.h
Normal file
@ -0,0 +1,116 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of class DirseQ which
|
||||
crawls along a directory's content list.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_diskop_includeD
|
||||
#define Xorriso_pvt_diskop_includeD yes
|
||||
|
||||
|
||||
/* @param flag bit0= simple readlink(): no normalization, no multi-hop
|
||||
*/
|
||||
int Xorriso_resolve_link(struct XorrisO *xorriso,
|
||||
char *link_path, char result_path[SfileadrL], int flag);
|
||||
|
||||
int Xorriso_convert_gidstring(struct XorrisO *xorriso, char *gid_string,
|
||||
gid_t *gid, int flag);
|
||||
|
||||
int Xorriso_convert_modstring(struct XorrisO *xorriso, char *cmd, char *mode,
|
||||
mode_t *mode_and, mode_t *mode_or, int flag);
|
||||
|
||||
int Xorriso_convert_uidstring(struct XorrisO *xorriso, char *uid_string,
|
||||
uid_t *uid, int flag);
|
||||
|
||||
/* @param flag bit0= for Xorriso_msgs_submit: use pager
|
||||
*/
|
||||
int Xorriso_hop_link(struct XorrisO *xorriso, char *link_path,
|
||||
struct LinkiteM **link_stack, struct stat *stbuf, int flag);
|
||||
|
||||
int Xorriso__mode_to_perms(mode_t st_mode, char perms[11], int flag);
|
||||
|
||||
int Xorriso_format_ls_l(struct XorrisO *xorriso, struct stat *stbuf, int flag);
|
||||
|
||||
/* @param flag bit0= long format
|
||||
bit1= do not print count of nodes
|
||||
bit2= du format
|
||||
bit3= print directories as themselves (ls -d)
|
||||
*/
|
||||
int Xorriso_lsx_filev(struct XorrisO *xorriso, char *wd,
|
||||
int filec, char **filev, off_t boss_mem, int flag);
|
||||
|
||||
/*
|
||||
@param flag >>> bit0= remove whole sub tree: rm -r
|
||||
bit1= remove empty directory: rmdir
|
||||
bit2= recursion: do not reassure in mode 2 "tree"
|
||||
bit3= this is for overwriting and not for plain removal
|
||||
bit4= count deleted files in xorriso->pacifier_count
|
||||
bit5= with bit0 only remove directory content, not the directory
|
||||
@return <=0 = error
|
||||
1 = removed leaf file object
|
||||
2 = removed directory or tree
|
||||
3 = did not remove on user revocation
|
||||
*/
|
||||
int Xorriso_rmx(struct XorrisO *xorriso, off_t boss_mem, char *path, int flag);
|
||||
|
||||
int Xorriso_findx(struct XorrisO *xorriso, struct FindjoB *job,
|
||||
char *abs_dir_parm, char *dir_path,
|
||||
struct stat *dir_stbuf, int depth,
|
||||
struct LinkiteM *link_stack, int flag);
|
||||
|
||||
/* @param flag bit0= no hardlink reconstruction
|
||||
bit1= do not set xorriso->node_*_prefixes
|
||||
bit5= -extract_single: eventually do not insert directory tree
|
||||
*/
|
||||
int Xorriso_restore_sorted(struct XorrisO *xorriso, int count,
|
||||
char **src_array, char **tgt_array, int flag);
|
||||
|
||||
/* @param flag bit0= path is a directory
|
||||
bit2= recursion: do not reassure in mode 2 "tree"
|
||||
bit3= this is for overwriting and not for plain removal
|
||||
*/
|
||||
int Xorriso_reassure_restore(struct XorrisO *xorriso, char *path, int flag);
|
||||
|
||||
/* @param flag bit7= return 4 if restore fails from denied permission
|
||||
do not issue error message
|
||||
@return <=0 failure , 1 success ,
|
||||
4 with bit7: permission to create file was denied
|
||||
*/
|
||||
int Xorriso_make_tmp_path(struct XorrisO *xorriso, char *orig_path,
|
||||
char *tmp_path, int *fd, int flag);
|
||||
|
||||
/* @param flag bit0= change regardless of xorriso->do_auto_chmod
|
||||
bit1= desired is only rx
|
||||
*/
|
||||
int Xorriso_auto_chmod(struct XorrisO *xorriso, char *disk_path, int flag);
|
||||
|
||||
int Xorriso_make_accessible(struct XorrisO *xorriso, char *disk_path,int flag);
|
||||
|
||||
/* @param flag bit0= prefer to find a match after *img_prefixes
|
||||
(but deliver img_prefixes if no other can be found)
|
||||
*/
|
||||
int Xorriso_make_restore_path(struct XorrisO *xorriso,
|
||||
struct Xorriso_lsT **img_prefixes, struct Xorriso_lsT **disk_prefixes,
|
||||
char img_path[SfileadrL], char disk_path[SfileadrL], int flag);
|
||||
|
||||
int Xorriso_restore_make_hl(struct XorrisO *xorriso,
|
||||
char *old_path, char *new_path, int flag);
|
||||
|
||||
int Xorriso_afile_fopen(struct XorrisO *xorriso,
|
||||
char *filename, char *mode, FILE **ret_fp, 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);
|
||||
|
||||
int Xorriso_append_scdbackup_record(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_diskop_includeD */
|
||||
|
2239
xorriso/drive_mgt.c
Normal file
2239
xorriso/drive_mgt.c
Normal file
File diff suppressed because it is too large
Load Diff
37
xorriso/drive_mgt.h
Normal file
37
xorriso/drive_mgt.h
Normal file
@ -0,0 +1,37 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which operate on drives
|
||||
and media.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_drive_mgt_includeD
|
||||
#define Xorriso_pvt_drive_mgt_includeD yes
|
||||
|
||||
|
||||
int Xorriso_may_burn(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_toc_line(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_media_product(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_check_md5_range(struct XorrisO *xorriso, off_t start_lba,
|
||||
off_t end_lba, char md5[16], int flag);
|
||||
|
||||
int Xorriso_check_interval(struct XorrisO *xorriso, struct SpotlisT *spotlist,
|
||||
struct CheckmediajoB *job,
|
||||
int from_lba, int block_count, int read_chunk,
|
||||
int md5_start, int flag);
|
||||
|
||||
int Xorriso_get_drive_handles(struct XorrisO *xorriso,
|
||||
struct burn_drive_info **dinfo,
|
||||
struct burn_drive **drive,
|
||||
char *attempt, int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_drive_mgt_includeD */
|
||||
|
1449
xorriso/emulators.c
Normal file
1449
xorriso/emulators.c
Normal file
File diff suppressed because it is too large
Load Diff
34
xorriso/emulators.h
Normal file
34
xorriso/emulators.h
Normal file
@ -0,0 +1,34 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of emulators for mkisofs and cdrecord.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_emul_includeD
|
||||
#define Xorriso_pvt_emul_includeD yes
|
||||
|
||||
/* micro version of cdrskin */
|
||||
int Xorriso_cdrskin(struct XorrisO *xorriso, char *whom, int argc, char **argv,
|
||||
int flag);
|
||||
|
||||
int Xorriso_cdrskin_help(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_as_cdrskin(struct XorrisO *xorriso, int argc, char **argv,
|
||||
int *idx, int flag);
|
||||
|
||||
/* micro emulation of mkisofs */
|
||||
int Xorriso_genisofs(struct XorrisO *xorriso, char *whom,
|
||||
int argc, char **argv, int flag);
|
||||
|
||||
int Xorriso_genisofs_help(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_as_genisofs(struct XorrisO *xorriso, int argc, char **argv,
|
||||
int *idx, int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_emul_includeD */
|
||||
|
698
xorriso/filters.c
Normal file
698
xorriso/filters.c
Normal file
@ -0,0 +1,698 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains functions which operate on data filter objects.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "lib_mgt.h"
|
||||
#include "iso_tree.h"
|
||||
|
||||
/*
|
||||
|
||||
#include "xorriso.h"
|
||||
#include "xorriso_private.h"
|
||||
#include "xorrisoburn.h"
|
||||
|
||||
#include "iso_img.h"
|
||||
#include "iso_manip.h"
|
||||
#include "sort_cmp.h"
|
||||
|
||||
*/
|
||||
|
||||
|
||||
struct Xorriso_extF {
|
||||
|
||||
int flag; /* unused yet */
|
||||
|
||||
IsoExternalFilterCommand *cmd;
|
||||
|
||||
};
|
||||
|
||||
int Xorriso_extf_destroy(struct XorrisO *xorriso, struct Xorriso_extF **filter,
|
||||
int flag);
|
||||
|
||||
|
||||
/* @param flag see struct Xorriso_extF.flag */
|
||||
int Xorriso_extf_new(struct XorrisO *xorriso, struct Xorriso_extF **filter,
|
||||
char *path, int argc, char **argv, int behavior,
|
||||
char *suffix, char *name, int flag)
|
||||
{
|
||||
int i;
|
||||
struct Xorriso_extF *o= NULL;
|
||||
IsoExternalFilterCommand *cmd;
|
||||
|
||||
*filter= o= calloc(sizeof(struct Xorriso_extF), 1);
|
||||
if(o == NULL)
|
||||
goto failure;
|
||||
o->flag= flag;
|
||||
o->cmd= NULL;
|
||||
o->cmd= cmd= calloc(sizeof(IsoExternalFilterCommand), 1);
|
||||
if(cmd == NULL)
|
||||
goto failure;
|
||||
cmd->version= 0;
|
||||
cmd->refcount= 0;
|
||||
cmd->name= NULL;
|
||||
cmd->path= NULL;
|
||||
cmd->argv= NULL;
|
||||
cmd->argc= argc + 1;
|
||||
cmd->behavior= behavior;
|
||||
cmd->suffix= NULL;
|
||||
cmd->suffix= strdup(suffix);
|
||||
if(cmd->suffix == NULL)
|
||||
goto failure;
|
||||
|
||||
cmd->path= strdup(path);
|
||||
if(cmd->path == NULL)
|
||||
goto failure;
|
||||
cmd->argv= calloc(sizeof(char *), argc + 2);
|
||||
if(cmd->argv == NULL)
|
||||
goto failure;
|
||||
for(i= 0; i < argc + 2; i++)
|
||||
cmd->argv[i]= NULL;
|
||||
cmd->argv[0]= strdup(path);
|
||||
if(cmd->argv[0] == NULL)
|
||||
goto failure;
|
||||
for(i= 0; i < argc; i++) {
|
||||
cmd->argv[i + 1]= strdup(argv[i]);
|
||||
if(cmd->argv[i] == NULL)
|
||||
goto failure;
|
||||
}
|
||||
cmd->name= strdup(name);
|
||||
if(cmd->name == NULL)
|
||||
goto failure;
|
||||
return(1);
|
||||
failure:;
|
||||
Xorriso_extf_destroy(xorriso, filter, 0);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_extf_destroy(struct XorrisO *xorriso, struct Xorriso_extF **filter,
|
||||
int flag)
|
||||
{
|
||||
int i;
|
||||
IsoExternalFilterCommand *cmd;
|
||||
|
||||
if(*filter == NULL)
|
||||
return(0);
|
||||
cmd= (*filter)->cmd;
|
||||
if(cmd != NULL) {
|
||||
if(cmd->refcount > 0)
|
||||
return(0);
|
||||
if(cmd->suffix != NULL)
|
||||
free(cmd->suffix);
|
||||
if(cmd->argv != NULL) {
|
||||
for(i= 0; i < cmd->argc; i++)
|
||||
if(cmd->argv[i] != NULL)
|
||||
free(cmd->argv[i]);
|
||||
free((char *) cmd->argv);
|
||||
}
|
||||
if(cmd->name != NULL)
|
||||
free(cmd->name);
|
||||
}
|
||||
free((char *) *filter);
|
||||
*filter= NULL;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_lookup_extf(struct XorrisO *xorriso, char *name,
|
||||
struct Xorriso_lsT **found_lst, int flag)
|
||||
{
|
||||
struct Xorriso_extF *filter;
|
||||
struct Xorriso_lsT *lst;
|
||||
|
||||
for(lst= xorriso->filters; lst != NULL; lst= Xorriso_lst_get_next(lst, 0)) {
|
||||
filter= (struct Xorriso_extF *) Xorriso_lst_get_text(lst, 0);
|
||||
if(strcmp(filter->cmd->name, name) == 0) {
|
||||
*found_lst= lst;
|
||||
return(1);
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_destroy_all_extf(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
struct Xorriso_extF *filter;
|
||||
struct Xorriso_lsT *lst, *next_lst;
|
||||
|
||||
for(lst= xorriso->filters; lst != NULL; lst= next_lst) {
|
||||
filter= (struct Xorriso_extF *) Xorriso_lst_get_text(lst, 0);
|
||||
Xorriso_lst_detach_text(lst, 0);
|
||||
next_lst= Xorriso_lst_get_next(lst, 0);
|
||||
Xorriso_lst_destroy(&lst, 0);
|
||||
Xorriso_extf_destroy(xorriso, &filter, 0);
|
||||
}
|
||||
xorriso->filters= NULL;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@param flag bit0= return 2 if renaming is not possible by libisofs
|
||||
(always: if demanded strip suffix is missing
|
||||
or if suffix makes name length > 255)
|
||||
bit1= strip suffix rather than appending it
|
||||
*/
|
||||
int Xorriso_rename_suffix(struct XorrisO *xorriso, IsoNode *node, char *suffix,
|
||||
char *show_path, char new_name[], int flag)
|
||||
{
|
||||
int ret, lo= 0, ls= 0, strip_suffix;
|
||||
char *old_name= NULL, *show_name;
|
||||
|
||||
strip_suffix= !!(flag & 2);
|
||||
|
||||
old_name= strdup((char *) iso_node_get_name(node));
|
||||
show_name= old_name;
|
||||
if(show_path != NULL)
|
||||
if(show_path[0] != 0)
|
||||
show_name= show_path;
|
||||
lo= strlen(old_name);
|
||||
ls= strlen(suffix);
|
||||
if(strip_suffix) {
|
||||
if(lo <= ls) {
|
||||
/* refuse gracefully */
|
||||
ret= 2; goto ex;
|
||||
}
|
||||
if(strcmp(old_name + lo - ls, suffix) != 0) {
|
||||
ret= 2; goto ex;
|
||||
}
|
||||
if(lo >= SfileadrL)
|
||||
goto cannot_remove_suffix;
|
||||
strcpy(new_name, old_name);
|
||||
new_name[lo - ls]= 0;
|
||||
ret = iso_node_set_name(node, new_name);
|
||||
if (ret < 0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if (!(flag & 1))
|
||||
Xorriso_report_iso_error(xorriso, "", ret,
|
||||
"Error when renaming ISO node", 0, "FAILURE", 1);
|
||||
cannot_remove_suffix:;
|
||||
strcpy(xorriso->info_text, "-set_filter: Cannot remove suffix from ");
|
||||
Text_shellsafe(show_name, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
|
||||
(flag & 1) ? "WARNING" : "FAILURE", 0);
|
||||
ret= 2 * (flag & 1); goto ex;
|
||||
}
|
||||
} else {
|
||||
/* check whether suffix already present */
|
||||
if(lo >= ls)
|
||||
if(strcmp(old_name + lo - ls, suffix) == 0) {
|
||||
/* refuse gracefully */
|
||||
ret= 2; goto ex;
|
||||
}
|
||||
if(lo + ls > 255) {
|
||||
cannot_append_suffix:;
|
||||
strcpy(xorriso->info_text, "-set_filter: Cannot append suffix to ");
|
||||
Text_shellsafe(show_name, xorriso->info_text, 1);
|
||||
strcat(xorriso->info_text, ". Left unfiltered.");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
|
||||
(flag & 1) ? "WARNING" : "FAILURE", 0);
|
||||
ret= 2 * (flag & 1); goto ex;
|
||||
}
|
||||
sprintf(new_name, "%s%s", old_name, suffix);
|
||||
ret = iso_node_set_name(node, new_name);
|
||||
if (ret < 0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if (!(flag & 1))
|
||||
Xorriso_report_iso_error(xorriso, "", ret,
|
||||
"Error when renaming ISO node", 0, "FAILURE", 1);
|
||||
goto cannot_append_suffix;
|
||||
}
|
||||
}
|
||||
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(old_name != NULL)
|
||||
free(old_name);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@param flag bit0= return 2 if renaming is not possible
|
||||
bit1= print pacifier messages
|
||||
*/
|
||||
int Xorriso_set_filter(struct XorrisO *xorriso, void *in_node,
|
||||
char *path, char *filter_name, int flag)
|
||||
{
|
||||
int ret, strip_suffix= 0, strip_filter= 0, filter_ret= 0;
|
||||
int explicit_suffix= 0, internal_filter= 0;
|
||||
IsoNode *node;
|
||||
IsoFile *file;
|
||||
struct Xorriso_lsT *found_lst;
|
||||
struct Xorriso_extF *found_filter;
|
||||
IsoExternalFilterCommand *cmd = NULL;
|
||||
char *old_name= NULL, new_name[SfileadrL], *suffix= "";
|
||||
IsoStream *stream;
|
||||
int is_renamed= 0;
|
||||
|
||||
new_name[0]= 0;
|
||||
|
||||
node= (IsoNode *) in_node;
|
||||
if(node == NULL) {
|
||||
ret= Xorriso_get_node_by_path(xorriso, path, NULL, &node, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
if(!LIBISO_ISREG(node)) {
|
||||
strcpy(xorriso->info_text, "-set_filter: Not a regular data file node ");
|
||||
Text_shellsafe(path, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
file= (IsoFile *) node;
|
||||
|
||||
if(strncmp(filter_name, "--remove-all-filters", 20) == 0) {
|
||||
strip_filter= 1;
|
||||
strip_suffix= 1;
|
||||
if(strlen(filter_name) > 21) {
|
||||
strip_suffix= (filter_name[20] != '+');
|
||||
suffix= filter_name + 21;
|
||||
explicit_suffix= 1;
|
||||
}
|
||||
} else if(strcmp(filter_name, "--zisofs") == 0) {
|
||||
internal_filter= 1;
|
||||
} else if(strcmp(filter_name, "--zisofs-decode") == 0) {
|
||||
internal_filter= 2;
|
||||
} else if(strcmp(filter_name, "--gzip") == 0) {
|
||||
internal_filter= 3;
|
||||
suffix= ".gz";
|
||||
strip_suffix= 0;
|
||||
explicit_suffix= 1;
|
||||
} else if(strcmp(filter_name, "--gunzip") == 0 ||
|
||||
strcmp(filter_name, "--gzip-decode") == 0) {
|
||||
internal_filter= 4;
|
||||
suffix= ".gz";
|
||||
strip_suffix= 1;
|
||||
explicit_suffix= 1;
|
||||
} else {
|
||||
ret= Xorriso_lookup_extf(xorriso, filter_name, &found_lst, 0);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
if(ret == 0) {
|
||||
strcpy(xorriso->info_text, "-set_filter: Not a registered filter name ");
|
||||
Text_shellsafe(filter_name, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
found_filter= (struct Xorriso_extF *) Xorriso_lst_get_text(found_lst, 0);
|
||||
cmd= found_filter->cmd;
|
||||
suffix= cmd->suffix;
|
||||
strip_suffix= cmd->behavior & 8;
|
||||
}
|
||||
|
||||
if(suffix[0]) {
|
||||
|
||||
/* >>> would need full iso_rr_path of node for showing */;
|
||||
|
||||
old_name= strdup((char *) iso_node_get_name(node));
|
||||
ret= Xorriso_rename_suffix(xorriso, node, suffix, path, new_name,
|
||||
(flag & 1) | (strip_suffix ? 2 : 0));
|
||||
if(ret <= 0 || ret == 2)
|
||||
goto ex;
|
||||
is_renamed= 1;
|
||||
}
|
||||
|
||||
if(strip_filter) {
|
||||
while(1) {
|
||||
if(!explicit_suffix) {
|
||||
stream= iso_file_get_stream(file);
|
||||
|
||||
if(strncmp(stream->class->type, "gzip", 4) == 0) {
|
||||
suffix= ".gz";
|
||||
strip_suffix= 1;
|
||||
} else if(strncmp(stream->class->type, "pizg", 4) == 0) {
|
||||
suffix= ".gz";
|
||||
strip_suffix= 0;
|
||||
} else {
|
||||
ret= iso_stream_get_external_filter(stream, &cmd, 0);
|
||||
if(ret > 0) {
|
||||
suffix= cmd->suffix;
|
||||
strip_suffix= !(cmd->behavior & 8);
|
||||
}
|
||||
}
|
||||
if(suffix[0]) {
|
||||
|
||||
/* >>> would need the current renaming state of path */;
|
||||
|
||||
ret= Xorriso_rename_suffix(xorriso, node, suffix, NULL, new_name,
|
||||
(flag & 1) | (strip_suffix << 1));
|
||||
if(ret <= 0 || ret == 2)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
ret= iso_file_remove_filter(file, 0);
|
||||
if(ret != 1)
|
||||
break;
|
||||
}
|
||||
filter_ret= 1;
|
||||
} else if (internal_filter == 1 || internal_filter == 2) {
|
||||
filter_ret = iso_file_add_zisofs_filter(file, 1 | (internal_filter & 2));
|
||||
if(filter_ret < 0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(!(internal_filter == 2 && filter_ret == ISO_ZISOFS_WRONG_INPUT))
|
||||
Xorriso_report_iso_error(xorriso, "", filter_ret,
|
||||
"Error when setting filter to ISO node", 0, "FAILURE", 1);
|
||||
}
|
||||
} else if (internal_filter == 3 || internal_filter == 4) {
|
||||
filter_ret = iso_file_add_gzip_filter(file,
|
||||
1 | ((internal_filter == 4) << 1));
|
||||
if(filter_ret < 0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
Xorriso_report_iso_error(xorriso, "", filter_ret,
|
||||
"Error when setting filter to ISO node", 0, "FAILURE", 1);
|
||||
}
|
||||
} else {
|
||||
|
||||
#ifndef Xorriso_allow_extf_suiD
|
||||
/* This is a final safety precaution before iso_file_add_external_filter()
|
||||
performs fork() and executes the alleged filter program.
|
||||
*/
|
||||
if(getuid() != geteuid()) {
|
||||
sprintf(xorriso->info_text,
|
||||
"-set_filter: UID and EUID differ. Will not run external programs.");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
return(0);
|
||||
}
|
||||
#endif /* ! Xorriso_allow_extf_suiD */
|
||||
|
||||
filter_ret = iso_file_add_external_filter(file, cmd, 0);
|
||||
if(filter_ret < 0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
Xorriso_report_iso_error(xorriso, "", filter_ret,
|
||||
"Error when setting filter to ISO node", 0, "FAILURE", 1);
|
||||
}
|
||||
}
|
||||
if(filter_ret != 1 && new_name[0] && old_name != NULL) {
|
||||
ret = iso_node_set_name(node, old_name);
|
||||
if (ret < 0) {
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if (!(flag & 1))
|
||||
Xorriso_report_iso_error(xorriso, "", ret,
|
||||
"Error when renaming ISO node", 0, "FAILURE", 1);
|
||||
}
|
||||
}
|
||||
if(flag & 2) {
|
||||
xorriso->pacifier_count++;
|
||||
Xorriso_pacifier_callback(xorriso, "file filters processed",
|
||||
xorriso->pacifier_count, xorriso->pacifier_total, "", 0);
|
||||
}
|
||||
if(filter_ret < 0) {
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
|
||||
ret= filter_ret;
|
||||
ex:;
|
||||
if(old_name != NULL)
|
||||
free(old_name);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= delete filter with the given name
|
||||
*/
|
||||
int Xorriso_external_filter(struct XorrisO *xorriso,
|
||||
char *name, char *options, char *path,
|
||||
int argc, char **argv, int flag)
|
||||
{
|
||||
int ret, delete= 0, behavior= 0, extf_flag= 0, is_banned= 0;
|
||||
char *what, *what_next, *suffix= "";
|
||||
struct Xorriso_lsT *lst;
|
||||
struct Xorriso_extF *found_filter, *new_filter= NULL;
|
||||
|
||||
#ifndef Xorriso_allow_external_filterS
|
||||
/* To be controlled by: configure --enable-external-filters */
|
||||
|
||||
sprintf(xorriso->info_text, "%s : Banned at compile time.",
|
||||
flag & 1 ? "-unregister_filter" : "-external_filter");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
sprintf(xorriso->info_text,
|
||||
"This may be changed at compile time by ./configure option --enable-external-filters");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "HINT", 0);
|
||||
is_banned= 1;
|
||||
|
||||
#endif /* ! Xorriso_allow_external_filterS */
|
||||
|
||||
#ifndef Xorriso_allow_extf_suiD
|
||||
/* To be controlled by: configure --enable-external-filters-setuid */
|
||||
|
||||
if(getuid() != geteuid()) {
|
||||
sprintf(xorriso->info_text,
|
||||
"-set_filter: UID and EUID differ. Will not run external programs.");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
sprintf(xorriso->info_text,
|
||||
"This may be changed at compile time by ./configure option --enable-external-filters-setuid");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "HINT", 0);
|
||||
is_banned= 1;
|
||||
}
|
||||
#endif /* ! Xorriso_allow_extf_suiD */
|
||||
|
||||
if(is_banned)
|
||||
return(0);
|
||||
|
||||
if(xorriso->filter_list_closed) {
|
||||
sprintf(xorriso->info_text,
|
||||
"%s : Banned by previous command -close_filter_list",
|
||||
flag & 1 ? "-unregister_filter" : "-external_filter");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
if((!(flag & 1)) && path[0] != '/') {
|
||||
sprintf(xorriso->info_text,
|
||||
"-external_filter : Given command path does not begin by '/' : ");
|
||||
Text_shellsafe(path, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
delete= flag & 1;
|
||||
ret= Xorriso_lookup_extf(xorriso, name, &lst, 0);
|
||||
if(ret < 0)
|
||||
return(ret);
|
||||
if(ret > 0) {
|
||||
if(delete) {
|
||||
found_filter= (struct Xorriso_extF *) Xorriso_lst_get_text(lst, 0);
|
||||
if(found_filter->cmd->refcount > 0) {
|
||||
sprintf(xorriso->info_text,
|
||||
"-external_filter: Cannot remove filter because it is in use by %.f nodes : ",
|
||||
(double) found_filter->cmd->refcount);
|
||||
Text_shellsafe(name, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
Xorriso_lst_detach_text(lst, 0);
|
||||
if(xorriso->filters == lst)
|
||||
xorriso->filters= Xorriso_lst_get_next(lst, 0);
|
||||
Xorriso_lst_destroy(&lst, 0);
|
||||
Xorriso_extf_destroy(xorriso, &found_filter, 0);
|
||||
ret= 1; goto ex;
|
||||
}
|
||||
strcpy(xorriso->info_text,
|
||||
"-external_filter: filter with given name already existing: ");
|
||||
Text_shellsafe(name, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
if(delete) {
|
||||
strcpy(xorriso->info_text,
|
||||
"-external_filter: filter with given name does not exist: ");
|
||||
Text_shellsafe(name, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
|
||||
for(what= options; what!=NULL; what= what_next) {
|
||||
what_next= strchr(what, ':');
|
||||
if(what_next!=NULL) {
|
||||
*what_next= 0;
|
||||
what_next++;
|
||||
}
|
||||
if(strncmp(what, "default", 7) == 0) {
|
||||
suffix= "";
|
||||
behavior= 0;
|
||||
} else if(strncmp(what, "suffix=", 7) == 0) {
|
||||
suffix= what + 7;
|
||||
} else if(strcmp(what, "remove_suffix") == 0) {
|
||||
behavior|= 8;
|
||||
} else if(strcmp(what, "if_nonempty") == 0) {
|
||||
behavior|= 1;
|
||||
} else if(strcmp(what, "if_reduction") == 0) {
|
||||
behavior|= 2;
|
||||
} else if(strcmp(what, "if_block_reduction") == 0) {
|
||||
behavior|= 4;
|
||||
} else if(strncmp(what, "used=", 5) == 0) {
|
||||
; /* this is informational output from -status */
|
||||
} else if(what[0]) {
|
||||
strcpy(xorriso->info_text,
|
||||
"-external_filter: unknown option ");
|
||||
Text_shellsafe(what, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
}
|
||||
|
||||
ret= Xorriso_extf_new(xorriso, &new_filter, path, argc, argv, behavior,
|
||||
suffix, name, extf_flag);
|
||||
if(ret <= 0) {
|
||||
could_not_create:;
|
||||
strcpy(xorriso->info_text,
|
||||
"-external_filter: Could not create filter object");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
goto ex;
|
||||
}
|
||||
ret= Xorriso_lst_append_binary(&(xorriso->filters), (char *) new_filter,0, 4);
|
||||
if(ret <= 0)
|
||||
goto could_not_create;
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(ret <= 0) {
|
||||
if(new_filter != NULL)
|
||||
Xorriso_extf_destroy(xorriso, &new_filter, 0);
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_status_extf(struct XorrisO *xorriso, char *filter, FILE *fp,
|
||||
int flag)
|
||||
/*
|
||||
bit1= do only report to fp
|
||||
*/
|
||||
{
|
||||
int i, maxl= 4 * SfileadrL;
|
||||
struct Xorriso_extF *extf;
|
||||
struct Xorriso_lsT *lst;
|
||||
char *line;
|
||||
|
||||
line= xorriso->result_line;
|
||||
for(lst= xorriso->filters; lst != NULL; lst= Xorriso_lst_get_next(lst, 0)) {
|
||||
extf= (struct Xorriso_extF *) Xorriso_lst_get_text(lst, 0);
|
||||
|
||||
strcpy(xorriso->result_line, "-external_filter ");
|
||||
Text_shellsafe(extf->cmd->name, line, 1);
|
||||
if(strlen(line) > maxl)
|
||||
continue;
|
||||
strcat(line, " ");
|
||||
if(extf->cmd->suffix[0]) {
|
||||
strcat(line, "suffix=");
|
||||
Text_shellsafe(extf->cmd->suffix, line, 1);
|
||||
if(strlen(line) > maxl)
|
||||
continue;
|
||||
strcat(line, ":");
|
||||
}
|
||||
if(extf->cmd->behavior & 8)
|
||||
strcat(line, "remove_suffix:");
|
||||
if(extf->cmd->behavior & 1)
|
||||
strcat(line, "if_nonempty:");
|
||||
if(extf->cmd->behavior & 2)
|
||||
strcat(line, "if_reduction:");
|
||||
if(extf->cmd->behavior & 4)
|
||||
strcat(line, "if_block_reduction:");
|
||||
sprintf(line + strlen(line), "used=%.f ", (double) extf->cmd->refcount);
|
||||
if(strlen(line) > maxl)
|
||||
continue;
|
||||
Text_shellsafe(extf->cmd->path, line, 1);
|
||||
if(strlen(line) > maxl)
|
||||
continue;
|
||||
for(i= 1; i < extf->cmd->argc; i++) {
|
||||
strcat(line, " ");
|
||||
Text_shellsafe(extf->cmd->argv[i], line, 1);
|
||||
if(strlen(line) > maxl)
|
||||
break;
|
||||
}
|
||||
if(i < extf->cmd->argc)
|
||||
continue;
|
||||
strcat(line, " --\n");
|
||||
Xorriso_status_result(xorriso, filter, fp, flag&2);
|
||||
}
|
||||
if(xorriso->filter_list_closed) {
|
||||
strcpy(line, "-close_filter_list\n");
|
||||
Xorriso_status_result(xorriso, filter, fp, flag&2);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_set_zisofs_params(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret;
|
||||
struct iso_zisofs_ctrl ctrl;
|
||||
|
||||
ctrl.version= 0;
|
||||
ctrl.compression_level= xorriso->zlib_level;
|
||||
if(xorriso->zisofs_block_size == (1 << 16))
|
||||
ctrl.block_size_log2= 16;
|
||||
else if(xorriso->zisofs_block_size == (1 << 17))
|
||||
ctrl.block_size_log2= 17;
|
||||
else
|
||||
ctrl.block_size_log2= 15;
|
||||
ret= iso_zisofs_set_params(&ctrl, 0);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(ret < 0) {
|
||||
Xorriso_report_iso_error(xorriso, "", ret,
|
||||
"Error when setting zisofs parameters", 0, "FAILURE", 1);
|
||||
return(0);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_status_zisofs(struct XorrisO *xorriso, char *filter, FILE *fp,
|
||||
int flag)
|
||||
/*
|
||||
bit0= do only report non-default settings
|
||||
bit1= do only report to fp
|
||||
*/
|
||||
{
|
||||
off_t ziso_count= 0, osiz_count= 0;
|
||||
off_t gzip_count= 0, gunzip_count= 0;
|
||||
|
||||
iso_zisofs_get_refcounts(&ziso_count, &osiz_count, 0);
|
||||
iso_gzip_get_refcounts(&gzip_count, &gunzip_count, 0);
|
||||
if((flag & 1) && xorriso->zlib_level == xorriso->zlib_level_default &&
|
||||
xorriso->zisofs_block_size == xorriso->zisofs_block_size_default &&
|
||||
xorriso->zisofs_by_magic == 0 &&
|
||||
ziso_count == 0 && osiz_count == 0 &&
|
||||
gzip_count == 0 && gunzip_count == 0) {
|
||||
if(filter == NULL)
|
||||
return(2);
|
||||
if(filter[0] == 0)
|
||||
return 2;
|
||||
}
|
||||
sprintf(xorriso->result_line,
|
||||
"-zisofs level=%d:block_size=%dk:by_magic=%s:ziso_used=%.f:osiz_used=%.f",
|
||||
xorriso->zlib_level, xorriso->zisofs_block_size / 1024,
|
||||
xorriso->zisofs_by_magic ? "on" : "off",
|
||||
(double) ziso_count, (double) osiz_count);
|
||||
sprintf(xorriso->result_line + strlen(xorriso->result_line),
|
||||
":gzip_used=%.f:gunzip_used=%.f\n",
|
||||
(double) gzip_count, (double) gunzip_count);
|
||||
Xorriso_status_result(xorriso, filter, fp, flag&2);
|
||||
return(1);
|
||||
}
|
||||
|
31
xorriso/filters.h
Normal file
31
xorriso/filters.h
Normal file
@ -0,0 +1,31 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which operate on
|
||||
data filter objects.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_filters_includeD
|
||||
#define Xorriso_pvt_filters_includeD yes
|
||||
|
||||
int Xorriso_extf_new(struct XorrisO *xorriso, struct Xorriso_extF **filter,
|
||||
char *path, int argc, char **argv, int behavior,
|
||||
char *suffix, char *name, int flag);
|
||||
|
||||
int Xorriso_extf_destroy(struct XorrisO *xorriso, struct Xorriso_extF **filter,
|
||||
int flag);
|
||||
|
||||
int Xorriso_lookup_extf(struct XorrisO *xorriso, char *name,
|
||||
struct Xorriso_lsT **found_lst, int flag);
|
||||
|
||||
int Xorriso_rename_suffix(struct XorrisO *xorriso, IsoNode *node, char *suffix,
|
||||
char *show_path, char new_name[], int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_filters_includeD */
|
||||
|
1205
xorriso/findjob.c
Normal file
1205
xorriso/findjob.c
Normal file
File diff suppressed because it is too large
Load Diff
405
xorriso/findjob.h
Normal file
405
xorriso/findjob.h
Normal file
@ -0,0 +1,405 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of classes FindjoB, ExprnodE, ExprtesT
|
||||
which perform tree searches in libisofs or in POSIX filesystem.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_findjob_includeD
|
||||
#define Xorriso_pvt_findjob_includeD yes
|
||||
|
||||
|
||||
#define Xorriso_findjob_on_expR yes
|
||||
|
||||
#ifdef Xorriso_findjob_on_expR
|
||||
|
||||
/*
|
||||
A single Testnode.
|
||||
*/
|
||||
struct ExprtesT {
|
||||
|
||||
struct FindjoB *boss;
|
||||
|
||||
int invert; /* 0=normal 1=invert result */
|
||||
|
||||
/*
|
||||
0= -false (with invert : -true)
|
||||
1= -name char *arg1 (regex_t in *arg2)
|
||||
2= -type char *arg1
|
||||
3= -damaged
|
||||
4= -lba_range int *arg1 int *arg2
|
||||
5= -has_acl
|
||||
6= -has_xattr
|
||||
7= -has_aaip
|
||||
8= -has_filter
|
||||
9= -wanted_node IsoNode *arg1 (for internal use, arg1 not allocated)
|
||||
10= -pending_data
|
||||
11= -decision char *arg1 ("yes", "no")
|
||||
12= -prune
|
||||
13= -wholename char *arg1 (regex_t in *arg2)
|
||||
14= -has_any_xattr
|
||||
15= -has_md5
|
||||
16= -disk_name char *arg1 (regex_t in *arg2)
|
||||
17= -hidden int *arg1 (bit0=iso_rr, bit1=joliet)
|
||||
*/
|
||||
int test_type;
|
||||
|
||||
void *arg1;
|
||||
void *arg2;
|
||||
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
A computational node.
|
||||
A tree of these nodes forms the expression.
|
||||
Sequences of AND/OR operations form branches, brackets spawn new branches,
|
||||
NOT inverts node's test resp. subtree result.
|
||||
*/
|
||||
struct ExprnodE {
|
||||
|
||||
struct ExprnodE *up;
|
||||
|
||||
char origin[8];
|
||||
|
||||
/* Operators */
|
||||
int invert; /* 0=normal 1=invert own result (subtree or test, but not op) */
|
||||
|
||||
int assoc; /*
|
||||
0= left : compute own value, combine with left value,
|
||||
compute right value, combine with current value
|
||||
1= right: compute own value, compute right value,
|
||||
combine own and right, combine with left value
|
||||
*/
|
||||
|
||||
int use_shortcuts; /* 0= evaluate all tests of -and and -or,
|
||||
1= evaluate only until the combined result is known
|
||||
*/
|
||||
|
||||
struct ExprnodE *left;
|
||||
int left_op; /* 0=OR , 1=AND */
|
||||
|
||||
struct ExprnodE *right;
|
||||
int right_op; /* see left_op */
|
||||
|
||||
/* Brackets : a pointer to the first node in a subchain */
|
||||
struct ExprnodE *sub;
|
||||
|
||||
int is_if_then_else;
|
||||
struct ExprnodE *true_branch;
|
||||
struct ExprnodE *false_branch;
|
||||
|
||||
/* elementary test : if sub!=NULL , test is ignored */
|
||||
struct ExprtesT *test;
|
||||
|
||||
/* Result */
|
||||
int own_value;
|
||||
int composed_value;
|
||||
|
||||
};
|
||||
|
||||
|
||||
struct FindjoB {
|
||||
|
||||
char *start_path;
|
||||
|
||||
struct ExprnodE *test_tree;
|
||||
|
||||
struct ExprnodE *cursor;
|
||||
int invert; /* 0=normal 1=set invert-property for next new test node */
|
||||
int use_shortcuts;
|
||||
|
||||
/* 0= echo
|
||||
1= rm (also rmdir)
|
||||
2= rm_r
|
||||
>>> 3= mv target
|
||||
4= chown user
|
||||
5= chgrp group
|
||||
6= chmod mode_and mode_or
|
||||
7= alter_date type date
|
||||
8= lsdl
|
||||
9= chown_r user
|
||||
10= chgrp_r group
|
||||
11= chmod_r mode_and mode_or
|
||||
12= alter_date_r type date
|
||||
13= find
|
||||
14= compare disk_equivalent_of_start_path
|
||||
15= in_iso iso_rr_equivalent_of_start_path
|
||||
16= not_in_iso iso_rr_equiv
|
||||
17= update disk_equiv
|
||||
18= add_missing iso_rr_equiv
|
||||
19= empty_iso_dir iso_rr_equiv
|
||||
20= is_full_in_iso iso_rr_equiv
|
||||
21= report_damage
|
||||
22= report_lba
|
||||
23= internal: memorize path of last matching node in found_path
|
||||
24= getfacl
|
||||
25= setfacl access_acl default_acl
|
||||
26= getfattr
|
||||
27= setfattr
|
||||
28= set_filter name
|
||||
29= show_stream
|
||||
30= internal: count by xorriso->node_counter
|
||||
31= internal: register in xorriso->node_array
|
||||
32= internal: widen_hardlinks disk_equiv: update nodes marked in di_do_widen
|
||||
33= get_any_xattr
|
||||
34= get_md5
|
||||
35= check_md5
|
||||
36= make_md5
|
||||
37= mkisofs_r
|
||||
38= sort_weight number
|
||||
39= hide on|iso_rr|joliet|off
|
||||
*/
|
||||
int action;
|
||||
int prune;
|
||||
|
||||
/* action specific parameters */
|
||||
char *target;
|
||||
char *text_2;
|
||||
uid_t user;
|
||||
gid_t group;
|
||||
mode_t mode_and, mode_or;
|
||||
int type; /* see Xorriso_set_time flag, also used as weight */
|
||||
time_t date;
|
||||
char *found_path;
|
||||
struct FindjoB *subjob;
|
||||
|
||||
/* Errors */
|
||||
char errmsg[4096];
|
||||
int errn; /*
|
||||
>0 = UNIX errno
|
||||
-1 = close_bracket: no bracket open
|
||||
-2 = binary operator or closing bracket expected
|
||||
-3 = unexpected binary operator or closing bracket
|
||||
-4 = unsupported command
|
||||
-5 = -then -elseif -else -endif without -if or at wrong place
|
||||
*/
|
||||
};
|
||||
|
||||
|
||||
int Exprnode_destroy(struct ExprnodE **fnode, int flag);
|
||||
|
||||
int Exprnode_tree_value(struct XorrisO *xorriso, struct ExprnodE *fnode,
|
||||
int left_value, void *node, char *name, char *path,
|
||||
struct stat *boss_stbuf, struct stat *stbuf, int flag);
|
||||
|
||||
|
||||
int Findjob_new(struct FindjoB **o, char *start_path, int flag);
|
||||
|
||||
int Findjob_destroy(struct FindjoB **o, int flag);
|
||||
|
||||
int Findjob_set_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_commit_filter_2(struct FindjoB *o, int flag);
|
||||
|
||||
int Findjob_set_lba_range(struct FindjoB *o, int start_lba, int count,
|
||||
int flag);
|
||||
|
||||
int Findjob_set_wanted_node(struct FindjoB *o, void *wanted_node, int flag);
|
||||
|
||||
/* @param value -1= only undamaged files, 1= only damaged files
|
||||
*/
|
||||
int Findjob_set_damage_filter(struct FindjoB *o, int value, int flag);
|
||||
|
||||
int Findjob_set_test_hidden(struct FindjoB *o, int mode, int flag);
|
||||
|
||||
|
||||
int Findjob_set_decision(struct FindjoB *o, char *decision, int flag);
|
||||
|
||||
int Findjob_open_bracket(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_close_bracket(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_not(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_and(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_or(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_if(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_then(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_else(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_elseif(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_endif(struct FindjoB *job, int flag);
|
||||
|
||||
int Findjob_test_2(struct XorrisO *xorriso, struct FindjoB *o,
|
||||
void *node, char *name, char *path,
|
||||
struct stat *boss_stbuf, struct stat *stbuf, int flag);
|
||||
|
||||
int Findjob_set_action_found_path(struct FindjoB *o, int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_target(struct FindjoB *o, int action, char *target,
|
||||
int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_ad(struct FindjoB *o, int type, time_t date, int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_chgrp(struct FindjoB *o, gid_t group, int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_chmod(struct FindjoB *o,
|
||||
mode_t mode_and, mode_t mode_or, int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_chown(struct FindjoB *o, uid_t user,int flag);
|
||||
|
||||
/* @param flag bit0= -wholename rather than -name
|
||||
*/
|
||||
int Findjob_set_name_expr(struct FindjoB *o, char *name_expr, int flag);
|
||||
|
||||
int Findjob_set_file_type(struct FindjoB *o, char file_type, int flag);
|
||||
|
||||
/* @param value -1= files without ACL, 1= only files with ACL
|
||||
*/
|
||||
int Findjob_set_acl_filter(struct FindjoB *o, int value, int flag);
|
||||
|
||||
/* @param value -1= files without xattr, 1= only files with xattr
|
||||
@param flag bit0=-has_any_xattr rather than -has_xattr
|
||||
*/
|
||||
int Findjob_set_xattr_filter(struct FindjoB *o, int value, int flag);
|
||||
|
||||
/* @param value -1= files without aaip, 1= only files with aaip
|
||||
*/
|
||||
int Findjob_set_aaip_filter(struct FindjoB *o, int value, int flag);
|
||||
|
||||
/* @param value -1= files without filter, 1= files with filter
|
||||
*/
|
||||
int Findjob_set_filter_filter(struct FindjoB *o, int value, int flag);
|
||||
|
||||
/* @param value -1= only without property, 1= only with property
|
||||
@param flag bit0= pseudo-test:
|
||||
if no operator is open, do nothing and return 2
|
||||
*/
|
||||
int Findjob_set_prop_filter(struct FindjoB *o, int test_type, int value,
|
||||
int flag);
|
||||
|
||||
/* @param value -1= true, 1= false
|
||||
@param flag bit0= pseudo-test:
|
||||
if no operator is open, do nothing and return 2
|
||||
*/
|
||||
int Findjob_set_false(struct FindjoB *o, int value, int flag);
|
||||
|
||||
int Findjob_set_prune(struct FindjoB *o, int flag);
|
||||
|
||||
|
||||
int Findjob_set_action_subjob(struct FindjoB *o, int action,
|
||||
struct FindjoB *subjob, int flag);
|
||||
|
||||
int Findjob_set_action_text_2(struct FindjoB *o, int action, char *target,
|
||||
char* text_2, int flag);
|
||||
|
||||
int Findjob_set_action_type(struct FindjoB *o, int action, int type, int flag);
|
||||
|
||||
|
||||
int Findjob_get_action(struct FindjoB *o, int flag);
|
||||
|
||||
int Findjob_get_action_parms(struct FindjoB *o, char **target, char **text_2,
|
||||
uid_t *user, gid_t *group,
|
||||
mode_t *mode_and, mode_t *mode_or,
|
||||
int *type, time_t *date, struct FindjoB **subjob,
|
||||
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);
|
||||
|
||||
#else /* Xorriso_findjob_on_expR */
|
||||
|
||||
|
||||
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
|
||||
*/
|
||||
int Findjob_test(struct FindjoB *job, char *name,
|
||||
struct stat *boss_stbuf, struct stat *stbuf,
|
||||
int depth, int flag);
|
||||
|
||||
/* @return <0 error, >=0 see xorriso.c struct FindjoB.action
|
||||
*/
|
||||
int Findjob_get_action(struct FindjoB *o, int flag);
|
||||
|
||||
/* @return <0 error, >=0 see xorriso.c struct FindjoB.action
|
||||
*/
|
||||
int Findjob_get_action_parms(struct FindjoB *o, char **target, char **text_2,
|
||||
uid_t *user, gid_t *group,
|
||||
mode_t *mode_and, mode_t *mode_or,
|
||||
int *type, time_t *date, struct FindjoB **subjob,
|
||||
int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_target(struct FindjoB *o, int action, char *target,
|
||||
int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_chgrp(struct FindjoB *o, gid_t group, int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
int Findjob_set_action_chmod(struct FindjoB *o,
|
||||
mode_t mode_and, mode_t mode_or, int flag);
|
||||
|
||||
/* @param flag bit0= recursive
|
||||
*/
|
||||
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_action_found_path(struct FindjoB *o, 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_get_acl_filter(struct FindjoB *o, int *acl_filter, int flag);
|
||||
|
||||
int Findjob_get_xattr_filter(struct FindjoB *o, int *xattr_filter, int flag);
|
||||
|
||||
int Findjob_get_aaip_filter(struct FindjoB *o, int *aaip_filter, int flag);
|
||||
|
||||
int Findjob_get_filter_filter(struct FindjoB *o, int *value, 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);
|
||||
|
||||
#endif /* ! Xorriso_findjob_on_expR */
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_findjob_includeD */
|
||||
|
961
xorriso/iso_img.c
Normal file
961
xorriso/iso_img.c
Normal file
@ -0,0 +1,961 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains functions which operate on ISO images and their
|
||||
global properties.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <sys/wait.h>
|
||||
|
||||
#include "xorriso.h"
|
||||
#include "xorriso_private.h"
|
||||
#include "xorrisoburn.h"
|
||||
|
||||
#include "lib_mgt.h"
|
||||
#include "iso_img.h"
|
||||
#include "iso_tree.h"
|
||||
#include "drive_mgt.h"
|
||||
|
||||
|
||||
int Xorriso_set_ignore_aclea(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, hflag;
|
||||
IsoImage *volume;
|
||||
|
||||
ret= Xorriso_get_volume(xorriso, &volume, 1);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
hflag= (~xorriso->do_aaip) & 1;
|
||||
if((xorriso->ino_behavior & (1 | 2)) && !(xorriso->do_aaip & (4 | 16)))
|
||||
hflag|= 2;
|
||||
iso_image_set_ignore_aclea(volume, hflag);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_update_volid(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int gret, sret= 1;
|
||||
|
||||
gret= Xorriso_get_volid(xorriso, xorriso->loaded_volid, 0);
|
||||
if(gret<=0 || (!xorriso->volid_default) || xorriso->loaded_volid[0]==0)
|
||||
sret= Xorriso_set_volid(xorriso, xorriso->volid, 1);
|
||||
return(gret>0 && sret>0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_create_empty_iso(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret;
|
||||
IsoImage *volset;
|
||||
struct isoburn_read_opts *ropts;
|
||||
struct burn_drive_info *dinfo= NULL;
|
||||
struct burn_drive *drive= NULL;
|
||||
|
||||
if(xorriso->out_drive_handle != NULL) {
|
||||
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
|
||||
"on attempt to attach volset to drive", 2);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
}
|
||||
if(xorriso->in_volset_handle!=NULL) {
|
||||
iso_image_unref((IsoImage *) xorriso->in_volset_handle);
|
||||
xorriso->in_volset_handle= NULL;
|
||||
Sectorbitmap_destroy(&(xorriso->in_sector_map), 0);
|
||||
Xorriso_destroy_di_array(xorriso, 0);
|
||||
Xorriso_destroy_hln_array(xorriso, 0);
|
||||
xorriso->loaded_volid[0]= 0;
|
||||
xorriso->volset_change_pending= 0;
|
||||
xorriso->boot_count= 0;
|
||||
xorriso->no_volset_present= 0;
|
||||
}
|
||||
|
||||
ret= isoburn_ropt_new(&ropts, 0);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
/* Note: no return before isoburn_ropt_destroy() */
|
||||
isoburn_ropt_set_extensions(ropts, isoburn_ropt_pretend_blank);
|
||||
isoburn_ropt_set_input_charset(ropts, xorriso->in_charset);
|
||||
isoburn_set_read_pacifier(drive, NULL, NULL);
|
||||
ret= isoburn_read_image(drive, ropts, &volset);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
isoburn_ropt_destroy(&ropts, 0);
|
||||
if(ret<=0) {
|
||||
sprintf(xorriso->info_text, "Failed to create new empty ISO image object");
|
||||
Xorriso_report_iso_error(xorriso, "", ret, xorriso->info_text, 0, "FATAL",
|
||||
0);
|
||||
return(-1);
|
||||
}
|
||||
xorriso->in_volset_handle= (void *) volset;
|
||||
xorriso->in_sector_map= NULL;
|
||||
Xorriso_update_volid(xorriso, 0);
|
||||
xorriso->volset_change_pending= 0;
|
||||
xorriso->boot_count= 0;
|
||||
xorriso->no_volset_present= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_record_boot_info(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret;
|
||||
struct burn_drive_info *dinfo;
|
||||
struct burn_drive *drive;
|
||||
IsoImage *image;
|
||||
ElToritoBootImage *bootimg;
|
||||
IsoFile *bootimg_node;
|
||||
IsoBoot *bootcat_node;
|
||||
|
||||
xorriso->loaded_boot_bin_lba= -1;
|
||||
xorriso->loaded_boot_cat_path[0]= 0;
|
||||
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
|
||||
"on attempt to record boot LBAs", 0);
|
||||
if(ret<=0)
|
||||
return(0);
|
||||
image= isoburn_get_attached_image(drive);
|
||||
if(image == NULL)
|
||||
return(0);
|
||||
ret= iso_image_get_boot_image(image, &bootimg,
|
||||
&bootimg_node, &bootcat_node);
|
||||
iso_image_unref(image); /* release obtained reference */
|
||||
if(ret != 1)
|
||||
return(0);
|
||||
if(bootimg_node != NULL)
|
||||
Xorriso__file_start_lba((IsoNode *) bootimg_node,
|
||||
&(xorriso->loaded_boot_bin_lba), 0);
|
||||
if(bootcat_node != NULL)
|
||||
Xorriso_path_from_lba(xorriso, (IsoNode *) bootcat_node, 0,
|
||||
xorriso->loaded_boot_cat_path, 0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_assert_volid(struct XorrisO *xorriso, int msc1, int flag)
|
||||
{
|
||||
int ret, image_blocks;
|
||||
char volid[33];
|
||||
struct burn_drive_info *dinfo;
|
||||
struct burn_drive *drive;
|
||||
|
||||
if(xorriso->assert_volid[0] == 0)
|
||||
return(1);
|
||||
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
|
||||
"on attempt to perform -assert_volid", 0);
|
||||
if(ret<=0)
|
||||
return(0);
|
||||
ret= isoburn_read_iso_head(drive, msc1, &image_blocks, volid, 1);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(ret <= 0) {
|
||||
sprintf(xorriso->info_text,
|
||||
"-assert_volid: Cannot determine Volume Id at LBA %d.", msc1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
|
||||
xorriso->assert_volid_sev, 0);
|
||||
return(0);
|
||||
}
|
||||
ret= Sregex_match(xorriso->assert_volid, volid, 0);
|
||||
if(ret < 0)
|
||||
return(2);
|
||||
if(ret == 0) {
|
||||
strcpy(xorriso->info_text,
|
||||
"-assert_volid: Volume id does not match pattern: ");
|
||||
Text_shellsafe(xorriso->assert_volid, xorriso->info_text, 1);
|
||||
strcat(xorriso->info_text, " <> ");
|
||||
Text_shellsafe(volid, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
|
||||
xorriso->assert_volid_sev, 0);
|
||||
return(0);
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @return <0 yes , 0 no , <0 error */
|
||||
int Xorriso_is_isohybrid(struct XorrisO *xorriso, IsoFile *bootimg_node,
|
||||
int flag)
|
||||
{
|
||||
int ret;
|
||||
unsigned char buf[68];
|
||||
void *data_stream= NULL;
|
||||
|
||||
ret= Xorriso_iso_file_open(xorriso, "", (void *) bootimg_node,
|
||||
&data_stream, 1);
|
||||
if(ret <= 0)
|
||||
return(-1);
|
||||
ret= Xorriso_iso_file_read(xorriso, data_stream, (char *) buf, 68, 0);
|
||||
Xorriso_iso_file_close(xorriso, &data_stream, 0);
|
||||
if(ret <= 0)
|
||||
return(0);
|
||||
if(buf[64] == 0xfb && buf[65] == 0xc0 && buf[66] == 0x78 && buf[67] == 0x70)
|
||||
return(1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_image_has_md5(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret;
|
||||
IsoImage *image;
|
||||
uint32_t start_lba, end_lba;
|
||||
char md5[16];
|
||||
|
||||
ret= Xorriso_get_volume(xorriso, &image, 0);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
ret= iso_image_get_session_md5(image, &start_lba, &end_lba, md5, 0);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(ret <= 0)
|
||||
return(0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
static const char *un0(const char *text)
|
||||
{
|
||||
if(text == NULL)
|
||||
return("");
|
||||
return(text);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_pvd_info(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, msc1= -1, msc2, i;
|
||||
IsoImage *image;
|
||||
struct burn_drive_info *dinfo;
|
||||
struct burn_drive *drive;
|
||||
char *msg, block_head[8];
|
||||
off_t head_count;
|
||||
|
||||
msg= xorriso->result_line;
|
||||
ret= Xorriso_get_volume(xorriso, &image, 0);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive, "", 16);
|
||||
if(ret > 0) {
|
||||
ret= Xorriso_msinfo(xorriso, &msc1, &msc2, 1 | 4);
|
||||
if(ret<0)
|
||||
return(ret);
|
||||
Xorriso_toc(xorriso, 128);
|
||||
if(msc1 >= 0) {
|
||||
for(i = msc1 + 16; i < msc1 + 32; i++) {
|
||||
ret= burn_read_data(drive, (off_t) i * (off_t) 2048, block_head,
|
||||
(off_t) sizeof(block_head), &head_count, 2);
|
||||
if(ret <= 0) {
|
||||
i= msc1 + 32;
|
||||
break;
|
||||
}
|
||||
if(block_head[0] == 1 && strncmp(block_head + 1, "CD001", 5) == 0)
|
||||
break;
|
||||
}
|
||||
if(i < msc1 + 32) {
|
||||
sprintf(msg, "PVD address : %ds\n", i);
|
||||
Xorriso_result(xorriso,0);
|
||||
}
|
||||
}
|
||||
}
|
||||
sprintf(msg, "Volume Id : %s\n", un0(iso_image_get_volume_id(image)));
|
||||
Xorriso_result(xorriso,0);
|
||||
sprintf(msg, "Volume Set Id: %s\n", xorriso->volset_id);
|
||||
Xorriso_result(xorriso,0);
|
||||
sprintf(msg, "Publisher Id : %s\n", xorriso->publisher);
|
||||
Xorriso_result(xorriso,0);
|
||||
sprintf(msg, "Preparer Id : %s\n",
|
||||
un0(iso_image_get_data_preparer_id(image)));
|
||||
Xorriso_result(xorriso,0);
|
||||
sprintf(msg, "App Id : %s\n", xorriso->application_id);
|
||||
Xorriso_result(xorriso,0);
|
||||
sprintf(msg, "System Id : %s\n", xorriso->system_id);
|
||||
Xorriso_result(xorriso,0);
|
||||
sprintf(msg, "CopyrightFile: %s\n", xorriso->copyright_file);
|
||||
Xorriso_result(xorriso,0);
|
||||
sprintf(msg, "Abstract File: %s\n", xorriso->abstract_file);
|
||||
Xorriso_result(xorriso,0);
|
||||
sprintf(msg, "Biblio File : %s\n", xorriso->biblio_file);
|
||||
Xorriso_result(xorriso,0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= do not mark image as changed */
|
||||
int Xorriso_set_volid(struct XorrisO *xorriso, char *volid, int flag)
|
||||
{
|
||||
int ret;
|
||||
IsoImage *volume;
|
||||
|
||||
if(xorriso->in_volset_handle == NULL)
|
||||
return(2);
|
||||
ret= Xorriso_get_volume(xorriso, &volume, 0);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
iso_image_set_volume_id(volume, volid);
|
||||
if(!(flag&1))
|
||||
Xorriso_set_change_pending(xorriso, 1);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
sprintf(xorriso->info_text,"Volume ID: '%s'",iso_image_get_volume_id(volume));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_get_volid(struct XorrisO *xorriso, char volid[33], int flag)
|
||||
{
|
||||
int ret;
|
||||
IsoImage *volume;
|
||||
|
||||
ret= Xorriso_get_volume(xorriso, &volume, 0);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
strncpy(volid, iso_image_get_volume_id(volume), 32);
|
||||
volid[32]= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
bit0= do only report non-default settings
|
||||
bit1= do only report to fp
|
||||
bit2= is_default
|
||||
bit3= append -boot_image any next
|
||||
bit4= eventually concentrate boot options
|
||||
*/
|
||||
int Xorriso_boot_item_status(struct XorrisO *xorriso, char *cat_path,
|
||||
char *bin_path, int platform_id,
|
||||
int patch_isolinux, int emul, off_t load_size,
|
||||
unsigned char *id_string,
|
||||
unsigned char *selection_crit, char *form,
|
||||
char *filter, FILE *fp, int flag)
|
||||
{
|
||||
int is_default, no_defaults, i, is_default_id= 0, ret;
|
||||
char *line, bspec[SfileadrL + 80], zeros[28];
|
||||
off_t file_size;
|
||||
struct stat stbuf;
|
||||
|
||||
no_defaults= flag & 1;
|
||||
line= xorriso->result_line;
|
||||
|
||||
if(flag & 16) {
|
||||
/* Allow to concentrate boot options. */
|
||||
memset(zeros, 0, 28);
|
||||
if(memcmp(id_string, zeros, 28) == 0 &&
|
||||
memcmp(selection_crit, zeros, 20) == 0)
|
||||
is_default_id= 1;
|
||||
|
||||
/* -boot_image isolinux dir= ... */
|
||||
bspec[0]= 0;
|
||||
if(strcmp(form, "isolinux") != 0 && strcmp(form, "any") != 0)
|
||||
;
|
||||
else if(strcmp(bin_path, "/isolinux.bin") == 0 &&
|
||||
strcmp(cat_path, "/boot.cat") == 0)
|
||||
strcpy(bspec, "dir=/");
|
||||
else if(strcmp(bin_path, "/isolinux/isolinux.bin") == 0 &&
|
||||
strcmp(cat_path, "/isolinux/boot.cat") == 0)
|
||||
strcpy(bspec, "dir=/isolinux");
|
||||
else if(strcmp(xorriso->boot_image_bin_path,
|
||||
"/boot/isolinux/isolinux.bin") == 0
|
||||
&& strcmp(xorriso->boot_image_cat_path,
|
||||
"/boot/isolinux/boot.cat") == 0)
|
||||
strcpy(bspec, "dir=/boot/isolinux");
|
||||
memset(zeros, 0, 28);
|
||||
if(bspec[0] && platform_id == 0 && patch_isolinux &&
|
||||
load_size == 2048 && is_default_id) {
|
||||
sprintf(line, "-boot_image isolinux %s\n", bspec);
|
||||
Xorriso_status_result(xorriso,filter,fp,flag&2);
|
||||
return(1);
|
||||
}
|
||||
|
||||
file_size= 0;
|
||||
ret= Xorriso_iso_lstat(xorriso, bin_path, &stbuf, 2 | 4);
|
||||
if(ret == 0)
|
||||
file_size= ((stbuf.st_size / (off_t) 512) +
|
||||
!!(stbuf.st_size % (off_t) 512)) * 512;
|
||||
if(platform_id == 0xef && !patch_isolinux &&
|
||||
load_size == file_size && is_default_id) {
|
||||
sprintf(line, "-boot_image any efi_path=");
|
||||
Text_shellsafe(bin_path, line, 1);
|
||||
strcat(line, "\n");
|
||||
Xorriso_status_result(xorriso,filter,fp,flag&2);
|
||||
return(1);
|
||||
}
|
||||
}
|
||||
|
||||
is_default= (bin_path[0] == 0) || (flag & 4);
|
||||
sprintf(line, "-boot_image %s bin_path=", form);
|
||||
Text_shellsafe(bin_path, line, 1);
|
||||
strcat(line, "\n");
|
||||
if(!(is_default && no_defaults))
|
||||
Xorriso_status_result(xorriso,filter,fp,flag&2);
|
||||
|
||||
is_default= (platform_id == 0 || (flag & 4));
|
||||
sprintf(line, "-boot_image %s platform_id=0x%-2.2x\n", form, platform_id);
|
||||
if(!(is_default && no_defaults))
|
||||
Xorriso_status_result(xorriso,filter,fp,flag&2);
|
||||
|
||||
is_default= ((patch_isolinux & 1) == 0 || bin_path[0] == 0 || (flag & 4));
|
||||
sprintf(line, "-boot_image %s boot_info_table=%s\n",
|
||||
(patch_isolinux & 2) ? "grub" : form, patch_isolinux ? "on" : "off");
|
||||
if(!(is_default && no_defaults))
|
||||
Xorriso_status_result(xorriso,filter,fp,flag&2);
|
||||
|
||||
is_default= (load_size == 2048 || (flag & 4));
|
||||
sprintf(line, "-boot_image %s load_size=%lu\n",
|
||||
form, (unsigned long) load_size);
|
||||
if(!(is_default && no_defaults))
|
||||
Xorriso_status_result(xorriso,filter,fp,flag&2);
|
||||
|
||||
is_default= 1;
|
||||
if(!(flag & 4))
|
||||
for(i= 0; i < 20; i++)
|
||||
if(selection_crit[i])
|
||||
is_default= 0;
|
||||
sprintf(line, "-boot_image %s sel_crit=", form);
|
||||
for(i= 0; i < 20; i++)
|
||||
sprintf(line + strlen(line), "%-2.2X", (unsigned int) selection_crit[i]);
|
||||
strcat(line, "\n");
|
||||
if(!(is_default && no_defaults))
|
||||
Xorriso_status_result(xorriso,filter,fp,flag&2);
|
||||
|
||||
is_default= 1;
|
||||
if(!(flag & 4))
|
||||
for(i= 0; i < 28; i++)
|
||||
if(id_string[i])
|
||||
is_default= 0;
|
||||
sprintf(line, "-boot_image %s id_string=", form);
|
||||
for(i= 0; i < 28; i++)
|
||||
sprintf(line + strlen(line), "%-2.2X", (unsigned int) id_string[i]);
|
||||
strcat(line, "\n");
|
||||
if(!(is_default && no_defaults))
|
||||
Xorriso_status_result(xorriso,filter,fp,flag&2);
|
||||
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
bit0= do only report non-default settings
|
||||
bit1= do only report to fp
|
||||
*/
|
||||
int Xorriso_boot_image_status(struct XorrisO *xorriso, char *filter, FILE *fp,
|
||||
int flag)
|
||||
{
|
||||
int ret, i, num_boots, hflag;
|
||||
int bin_path_in_use= 0, is_default, no_defaults;
|
||||
char sfe[5*SfileadrL], path[SfileadrL], *form= "any", *line, *hpt;
|
||||
struct burn_drive_info *dinfo;
|
||||
struct burn_drive *drive;
|
||||
IsoImage *image= NULL;
|
||||
ElToritoBootImage **boots = NULL;
|
||||
IsoFile **bootnodes = NULL;
|
||||
int platform_id, patch, load_size;
|
||||
enum eltorito_boot_media_type media_type;
|
||||
unsigned char id_string[29], sel_crit[21];
|
||||
|
||||
line= xorriso->result_line;
|
||||
no_defaults= flag & 1;
|
||||
|
||||
if(xorriso->boot_count == 0 && xorriso->boot_image_bin_path[0] == 0) {
|
||||
if(xorriso->patch_isolinux_image & 1) {
|
||||
sprintf(line, "-boot_image %s patch\n",
|
||||
xorriso->patch_isolinux_image & 2 ? "grub" : form);
|
||||
is_default= 0;
|
||||
} else if(xorriso->keep_boot_image) {
|
||||
sprintf(line, "-boot_image %s keep\n", form);
|
||||
is_default= 0;
|
||||
} else {
|
||||
sprintf(line, "-boot_image %s discard\n", form);
|
||||
is_default= 1;
|
||||
}
|
||||
if(!(is_default && no_defaults))
|
||||
Xorriso_status_result(xorriso,filter,fp,flag&2);
|
||||
ret= 1; goto ex;
|
||||
}
|
||||
|
||||
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
|
||||
"on attempt to print boot info", 16);
|
||||
if(ret<=0)
|
||||
{ret= 0; goto ex;}
|
||||
image= isoburn_get_attached_image(drive);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(image == NULL)
|
||||
{ret= 0; goto ex;}
|
||||
|
||||
if(xorriso->boot_image_bin_path[0] || xorriso->boot_count > 0)
|
||||
bin_path_in_use= 1;
|
||||
if(xorriso->boot_image_cat_path[0] && bin_path_in_use) {
|
||||
is_default= 0;
|
||||
sprintf(line,"-boot_image %s cat_path=%s\n",
|
||||
form, Text_shellsafe(xorriso->boot_image_cat_path, sfe, 0));
|
||||
if(!(is_default && no_defaults))
|
||||
Xorriso_status_result(xorriso,filter,fp,flag&2);
|
||||
}
|
||||
if(bin_path_in_use) {
|
||||
is_default= !xorriso->boot_image_cat_hidden;
|
||||
hpt= Xorriso__hide_mode_text(xorriso->boot_image_cat_hidden & 3, 0);
|
||||
sprintf(line, "-boot_image %s cat_hidden=%s\n", form, hpt);
|
||||
if(!(is_default && no_defaults))
|
||||
Xorriso_status_result(xorriso,filter,fp,flag&2);
|
||||
}
|
||||
|
||||
if(xorriso->boot_count > 0) {
|
||||
|
||||
/* show attached boot image info */;
|
||||
|
||||
ret= iso_image_get_all_boot_imgs(image, &num_boots, &boots, &bootnodes, 0);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(ret == 1 && num_boots > 0) {
|
||||
for(i= 0; i < num_boots; i++) {
|
||||
ret= Xorriso_path_from_node(xorriso, (IsoNode *) bootnodes[i], path, 0);
|
||||
if(ret <= 0)
|
||||
continue;
|
||||
platform_id= el_torito_get_boot_platform_id(boots[i]);
|
||||
patch= el_torito_get_isolinux_options(boots[i], 0);
|
||||
el_torito_get_boot_media_type(boots[i], &media_type);
|
||||
load_size= el_torito_get_load_size(boots[i]) * 512;
|
||||
el_torito_get_id_string(boots[i], id_string);
|
||||
el_torito_get_selection_crit(boots[i], sel_crit);
|
||||
ret= Xorriso_boot_item_status(xorriso, xorriso->boot_image_cat_path,
|
||||
path, platform_id, patch & 1, media_type,
|
||||
load_size, id_string, sel_crit, "any",
|
||||
filter, fp, 16 | (flag & 3));
|
||||
if(ret <= 0)
|
||||
continue;
|
||||
sprintf(line,"-boot_image %s next\n", form);
|
||||
Xorriso_status_result(xorriso,filter,fp,flag&2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Show pending boot image info */
|
||||
if(strcmp(xorriso->boot_image_bin_form, "isolinux") == 0 ||
|
||||
strcmp(xorriso->boot_image_bin_form, "grub") == 0)
|
||||
form= xorriso->boot_image_bin_form;
|
||||
|
||||
if(xorriso->boot_count > 0 &&
|
||||
xorriso->boot_platform_id == 0 &&
|
||||
xorriso->patch_isolinux_image == 0 &&
|
||||
xorriso->boot_image_bin_path[0] == 0 &&
|
||||
xorriso->boot_image_emul == 0 &&
|
||||
xorriso->boot_image_load_size == 4 * 512) {
|
||||
for(i= 0; i < 20; i++)
|
||||
if(xorriso->boot_selection_crit[i])
|
||||
break;
|
||||
if(i >= 20)
|
||||
for(i= 0; i < 28; i++)
|
||||
if(xorriso->boot_id_string[i])
|
||||
break;
|
||||
if(i >= 28)
|
||||
{ret= 1; goto ex;} /* Images registered, pending is still default */
|
||||
}
|
||||
|
||||
hflag= 16;
|
||||
if(xorriso->boot_platform_id == 0xef && !xorriso->boot_efi_default)
|
||||
hflag= 0;
|
||||
ret= Xorriso_boot_item_status(xorriso, xorriso->boot_image_cat_path,
|
||||
xorriso->boot_image_bin_path, xorriso->boot_platform_id,
|
||||
xorriso->patch_isolinux_image, xorriso->boot_image_emul,
|
||||
xorriso->boot_image_load_size, xorriso->boot_id_string,
|
||||
xorriso->boot_selection_crit, form,
|
||||
filter, fp, hflag | (flag & 3));
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
|
||||
ret= 1;
|
||||
ex:
|
||||
if(boots != NULL)
|
||||
free(boots);
|
||||
if(bootnodes != NULL)
|
||||
free(bootnodes);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__append_boot_params(char *line, ElToritoBootImage *bootimg,
|
||||
int flag)
|
||||
{
|
||||
unsigned int platform_id;
|
||||
|
||||
platform_id= el_torito_get_boot_platform_id(bootimg);
|
||||
if(platform_id != 0)
|
||||
sprintf(line + strlen(line),
|
||||
" , platform_id=0x%-2.2X ", (unsigned int) platform_id);
|
||||
if(el_torito_seems_boot_info_table(bootimg, 0))
|
||||
sprintf(line + strlen(line), " , boot_info_table=on");
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= no output if no boot record was found
|
||||
bit1= short form
|
||||
bit3= report to info channel (else to result channel)
|
||||
*/
|
||||
int Xorriso_show_boot_info(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, bin_path_valid= 0,has_isolinux_mbr= 0, i, num_boots;
|
||||
unsigned int mbr_lba= 0;
|
||||
off_t lb0_count;
|
||||
char *respt, sfe[5*SfileadrL], path[SfileadrL];
|
||||
unsigned char lb0[2048];
|
||||
struct burn_drive_info *dinfo;
|
||||
struct burn_drive *drive;
|
||||
IsoImage *image= NULL;
|
||||
ElToritoBootImage *bootimg, **boots = NULL;
|
||||
IsoFile *bootimg_node, **bootnodes = NULL;
|
||||
IsoBoot *bootcat_node;
|
||||
|
||||
respt= xorriso->result_line;
|
||||
|
||||
if(xorriso->boot_count > 0) {
|
||||
if(!(flag & 1)) {
|
||||
sprintf(respt, "Boot record : overridden by -boot_image any next\n");
|
||||
Xorriso_toc_line(xorriso, flag & 8);
|
||||
}
|
||||
ret= 1; goto ex;
|
||||
}
|
||||
|
||||
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
|
||||
"on attempt to print boot info", 16);
|
||||
if(ret<=0)
|
||||
goto no_boot;
|
||||
image= isoburn_get_attached_image(drive);
|
||||
if(image == NULL) {
|
||||
ret= 0;
|
||||
no_boot:;
|
||||
if(!(flag & 1)) {
|
||||
sprintf(respt, "Boot record : none\n");
|
||||
Xorriso_toc_line(xorriso, flag & 8);
|
||||
}
|
||||
goto ex;
|
||||
}
|
||||
|
||||
/* Using the nodes with extreme care . They might be deleted meanwhile. */
|
||||
ret= iso_image_get_boot_image(image, &bootimg, &bootimg_node, &bootcat_node);
|
||||
if(ret != 1)
|
||||
goto no_boot;
|
||||
|
||||
ret= Xorriso_path_from_lba(xorriso, NULL, xorriso->loaded_boot_bin_lba,
|
||||
path, 1);
|
||||
if(ret > 0)
|
||||
bin_path_valid= 1;
|
||||
sprintf(respt, "Boot record : El Torito");
|
||||
if(bin_path_valid)
|
||||
ret= Xorriso_is_isohybrid(xorriso, bootimg_node, 0);
|
||||
else
|
||||
ret= 0;
|
||||
if(ret > 0) {
|
||||
/* Load and examine potential MBR */
|
||||
ret= burn_read_data(drive, (off_t) 0, (char *) lb0, (off_t) 2048,
|
||||
&lb0_count, 2);
|
||||
if(ret > 0) {
|
||||
has_isolinux_mbr= 1;
|
||||
if(lb0[510] != 0x55 || lb0[511] != 0xaa)
|
||||
has_isolinux_mbr= 0;
|
||||
mbr_lba= lb0[432] | (lb0[433] << 8) | (lb0[434] << 16) | (lb0[435] << 24);
|
||||
mbr_lba/= 4;
|
||||
if(mbr_lba != xorriso->loaded_boot_bin_lba)
|
||||
has_isolinux_mbr= 0;
|
||||
if(has_isolinux_mbr) {
|
||||
for(i= 0; i < 426; i++)
|
||||
if(strncmp((char *) (lb0 + i), "isolinux", 8) == 0)
|
||||
break;
|
||||
if(i >= 426)
|
||||
has_isolinux_mbr= 0;
|
||||
}
|
||||
for(i= 462; i < 510; i++)
|
||||
if(lb0[i])
|
||||
break;
|
||||
if(i < 510)
|
||||
has_isolinux_mbr= 0;
|
||||
}
|
||||
if(has_isolinux_mbr)
|
||||
strcat(respt, " , ISOLINUX isohybrid MBR pointing to boot image");
|
||||
else
|
||||
strcat(respt, " , ISOLINUX boot image capable of isohybrid");
|
||||
}
|
||||
strcat(respt, "\n");
|
||||
Xorriso_toc_line(xorriso, flag & 8);
|
||||
if(flag & 2)
|
||||
{ret= 1; goto ex;}
|
||||
|
||||
if(xorriso->loaded_boot_cat_path[0])
|
||||
sprintf(respt, "Boot catalog : %s\n",
|
||||
Text_shellsafe(xorriso->loaded_boot_cat_path, sfe, 0));
|
||||
else
|
||||
sprintf(respt, "Boot catalog : -not-found-at-load-time-\n");
|
||||
Xorriso_toc_line(xorriso, flag & 8);
|
||||
|
||||
if(bin_path_valid)
|
||||
sprintf(respt, "Boot image : %s", Text_shellsafe(path, sfe, 0));
|
||||
else if(xorriso->loaded_boot_bin_lba <= 0)
|
||||
sprintf(respt, "Boot image : -not-found-at-load-time-");
|
||||
else
|
||||
sprintf(respt, "Boot image : -not-found-any-more-by-lba=%d",
|
||||
xorriso->loaded_boot_bin_lba);
|
||||
Xorriso__append_boot_params(respt, bootimg, 0);
|
||||
strcat(respt, "\n");
|
||||
Xorriso_toc_line(xorriso, flag & 8);
|
||||
|
||||
ret= iso_image_get_all_boot_imgs(image, &num_boots, &boots, &bootnodes, 0);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(ret == 1 && num_boots > 1) {
|
||||
for(i= 1; i < num_boots; i++) {
|
||||
ret= Xorriso_path_from_node(xorriso, (IsoNode *) bootnodes[i], path, 0);
|
||||
if(ret > 0)
|
||||
sprintf(respt, "Boot image : %s", Text_shellsafe(path, sfe, 0));
|
||||
else
|
||||
sprintf(respt, "Boot image : -not-found-any-more-");
|
||||
Xorriso__append_boot_params(respt, boots[i], 0);
|
||||
strcat(respt, "\n");
|
||||
Xorriso_toc_line(xorriso, flag & 8);
|
||||
}
|
||||
}
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(boots != NULL)
|
||||
free(boots);
|
||||
if(bootnodes != NULL);
|
||||
free(bootnodes);
|
||||
if(image != NULL)
|
||||
iso_image_unref(image); /* release obtained reference */
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0=silently return 0 if no volume/image is present
|
||||
*/
|
||||
int Xorriso_get_volume(struct XorrisO *xorriso, IsoImage **volume,
|
||||
int flag)
|
||||
{
|
||||
if(xorriso->in_volset_handle==NULL) {
|
||||
if(flag & 1)
|
||||
return(0);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
sprintf(xorriso->info_text,"No ISO image present.");
|
||||
if(xorriso->indev[0]==0 && xorriso->outdev[0]==0)
|
||||
sprintf(xorriso->info_text+strlen(xorriso->info_text),
|
||||
" No -dev, -indev, or -outdev selected.");
|
||||
else
|
||||
sprintf(xorriso->info_text+strlen(xorriso->info_text),
|
||||
" Possible program error with drive '%s'.", xorriso->indev);
|
||||
|
||||
if(!xorriso->no_volset_present)
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
xorriso->no_volset_present= 1;
|
||||
return(0);
|
||||
}
|
||||
*volume= (IsoImage *) xorriso->in_volset_handle;
|
||||
xorriso->no_volset_present= 0;
|
||||
return(*volume != NULL);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_change_is_pending(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
return(!!xorriso->volset_change_pending);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= do not set hln_change_pending */
|
||||
int Xorriso_set_change_pending(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret;
|
||||
IsoImage *image;
|
||||
|
||||
ret= Xorriso_get_volume(xorriso, &image, 1);
|
||||
if(ret <= 0)
|
||||
return ret;
|
||||
xorriso->volset_change_pending= 1;
|
||||
if(!(flag & 1))
|
||||
xorriso->hln_change_pending= 1;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@param flag bit0= print mount command to result channel rather than
|
||||
performing it
|
||||
bit1= do not allow prefixes with cmd
|
||||
bit2= interpret unprefixed cmd as shell:
|
||||
*/
|
||||
int Xorriso_mount(struct XorrisO *xorriso, char *dev, int adr_mode,
|
||||
char *adr_value, char *cmd, int flag)
|
||||
{
|
||||
int ret, lba, track, session, params_flag= 0, is_safe= 0, is_extra_drive= 0;
|
||||
int give_up= 0, mount_chardev= 0, status;
|
||||
char volid[33], *devadr, mount_command[SfileadrL], adr_data[163], *adr_pt;
|
||||
char *dev_path, libburn_adr[BURN_DRIVE_ADR_LEN + SfileadrL];
|
||||
char sfe[5 * SfileadrL], *dpt, *sysname= "";
|
||||
struct stat stbuf;
|
||||
struct burn_drive_info *dinfo= NULL;
|
||||
struct burn_drive *drive= NULL;
|
||||
|
||||
devadr= dev;
|
||||
adr_pt= adr_value;
|
||||
if(strcmp(dev, "indev") == 0) {
|
||||
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
|
||||
"on attempt to perform -mount \"indev\"", 0);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
dev_path= devadr= xorriso->indev;
|
||||
if(strncmp(dev_path, "stdio:", 6) == 0)
|
||||
dev_path+= 6;
|
||||
if(xorriso->in_drive_handle == xorriso->out_drive_handle)
|
||||
give_up= 3;
|
||||
else
|
||||
give_up= 1;
|
||||
} else if(strcmp(dev, "outdev") == 0) {
|
||||
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
|
||||
"on attempt to perform -mount \"outdev\"",
|
||||
2);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
dev_path= devadr= xorriso->outdev;
|
||||
if(strncmp(dev_path, "stdio:", 6) == 0)
|
||||
dev_path+= 6;
|
||||
if(xorriso->in_drive_handle == xorriso->out_drive_handle)
|
||||
give_up= 3;
|
||||
else
|
||||
give_up= 2;
|
||||
} else {
|
||||
is_extra_drive= 1;
|
||||
dev_path= dev;
|
||||
if(strncmp(dev_path, "stdio:", 6) == 0)
|
||||
dev_path+= 6;
|
||||
|
||||
/* do only accept regular files and block devices */
|
||||
ret= stat(dev_path, &stbuf);
|
||||
if(ret == -1) {
|
||||
sprintf(xorriso->info_text, "Cannot determine properties of file %s",
|
||||
Text_shellsafe(dev_path, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
ret= System_uname(&sysname, NULL, NULL, NULL, 0);
|
||||
if(ret > 0 && strcmp(sysname, "FreeBSD") == 0)
|
||||
mount_chardev= 1;
|
||||
if(!(S_ISREG(stbuf.st_mode) || (S_ISBLK(stbuf.st_mode) && !mount_chardev)
|
||||
|| (S_ISCHR(stbuf.st_mode) && !mount_chardev))) {
|
||||
sprintf(xorriso->info_text,
|
||||
"File object is not suitable as mount device: %s",
|
||||
Text_shellsafe(dev_path, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
|
||||
/* Aquire drive as direct libburn address or via stdio: prefix */
|
||||
ret= burn_drive_convert_fs_adr(dev, libburn_adr);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(ret < 0)
|
||||
{ret= -1; goto ex;}
|
||||
if(ret == 0 && strncmp(dev, "stdio:", 6) != 0)
|
||||
sprintf(libburn_adr, "stdio:%s", dev);
|
||||
burn_preset_device_open(xorriso->drives_exclusive, 0, 0);
|
||||
ret= isoburn_drive_aquire(&dinfo, libburn_adr, 1);
|
||||
burn_preset_device_open(1, 0, 0);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(ret <= 0)
|
||||
{ret= 0; goto ex;}
|
||||
drive= dinfo[0].drive;
|
||||
}
|
||||
|
||||
if(adr_mode == 4 && strlen(adr_pt) <= 80) {
|
||||
ret= Xorriso__bourne_to_reg(adr_pt, adr_data, 0);
|
||||
if(ret == 1) {
|
||||
params_flag|= 4;
|
||||
adr_pt= adr_data;
|
||||
}
|
||||
}
|
||||
ret= isoburn_get_mount_params(drive, adr_mode, adr_pt, &lba, &track,
|
||||
&session, volid, params_flag);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
if(session <= 0 || track <= 0 || ret == 2) {
|
||||
Xorriso_msgs_submit(xorriso, 0,
|
||||
"-mount : Given address does not point to an ISO 9660 session",
|
||||
0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
if(strstr(devadr, "stdio:") == devadr)
|
||||
devadr+= 6;
|
||||
ret= Xorriso_make_mount_cmd(xorriso, cmd, lba, track, session, volid, devadr,
|
||||
mount_command, flag & (2 | 4));
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
if(ret == 2)
|
||||
is_safe= 1;
|
||||
|
||||
if(is_extra_drive) {
|
||||
isoburn_drive_release(drive, 0);
|
||||
burn_drive_info_free(dinfo);
|
||||
drive= NULL;
|
||||
} else if(give_up > 0 && !((flag & 1) || (xorriso->mount_opts_flag & 1))) {
|
||||
Xorriso_give_up_drive(xorriso, give_up);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
|
||||
sprintf(xorriso->info_text, "Volume id : %s\n",
|
||||
Text_shellsafe(volid, sfe, 0));
|
||||
Xorriso_info(xorriso, 0);
|
||||
if(flag & 1) {
|
||||
sprintf(xorriso->result_line, "%s\n", mount_command);
|
||||
Xorriso_result(xorriso,0);
|
||||
} else {
|
||||
sprintf(xorriso->info_text, "Mount command: %s\n", mount_command);
|
||||
Xorriso_info(xorriso, 0);
|
||||
if(!is_safe) {
|
||||
Xorriso_msgs_submit(xorriso, 0,
|
||||
"-mount : Will not perform mount command which stems from command template.",
|
||||
0, "SORRY", 0);
|
||||
sprintf(xorriso->result_line, "%s\n", mount_command);
|
||||
Xorriso_result(xorriso,0);
|
||||
} else {
|
||||
ret= Xorriso_execv(xorriso, mount_command, "/bin:/sbin", &status, 1);
|
||||
if(WIFEXITED(status) && WEXITSTATUS(status) != 0) {
|
||||
sprintf(xorriso->info_text,
|
||||
"-mount : mount command failed with exit value %d",
|
||||
(int) WEXITSTATUS(ret));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
sprintf(xorriso->info_text, "\nMounted session %d of device %s",
|
||||
session, Text_shellsafe(dev_path, sfe, 0));
|
||||
dpt= strchr(cmd, ':');
|
||||
if(dpt == NULL)
|
||||
dpt= cmd ;
|
||||
else
|
||||
dpt++;
|
||||
sprintf(xorriso->info_text + strlen(xorriso->info_text),
|
||||
" as directory %s\n", Text_shellsafe(dpt, sfe, 0));
|
||||
Xorriso_info(xorriso, 0);
|
||||
}
|
||||
}
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(is_extra_drive && drive != NULL) {
|
||||
isoburn_drive_release(drive, 0);
|
||||
burn_drive_info_free(dinfo);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
|
44
xorriso/iso_img.h
Normal file
44
xorriso/iso_img.h
Normal file
@ -0,0 +1,44 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which operate on ISO images
|
||||
and their global properties.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_iso_img_includeD
|
||||
#define Xorriso_pvt_iso_img_includeD yes
|
||||
|
||||
|
||||
int Xorriso_update_volid(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_record_boot_info(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_assert_volid(struct XorrisO *xorriso, int msc1, int flag);
|
||||
|
||||
int Xorriso_is_isohybrid(struct XorrisO *xorriso, IsoFile *bootimg_node,
|
||||
int flag);
|
||||
|
||||
int Xorriso_boot_item_status(struct XorrisO *xorriso, char *cat_path,
|
||||
char *bin_path, int platform_id,
|
||||
int patch_isolinux, int emul, off_t load_size,
|
||||
unsigned char *id_string,
|
||||
unsigned char *selection_crit, char *form,
|
||||
char *filter, FILE *fp, int flag);
|
||||
|
||||
int Xorriso__append_boot_params(char *line, ElToritoBootImage *bootimg,
|
||||
int flag);
|
||||
|
||||
int Xorriso_get_volume(struct XorrisO *xorriso, IsoImage **volume,
|
||||
int flag);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_iso_img_includeD */
|
||||
|
2707
xorriso/iso_manip.c
Normal file
2707
xorriso/iso_manip.c
Normal file
File diff suppressed because it is too large
Load Diff
72
xorriso/iso_manip.h
Normal file
72
xorriso/iso_manip.h
Normal file
@ -0,0 +1,72 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which manipulate the
|
||||
libisofs tree model.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_iso_manip_includeD
|
||||
#define Xorriso_pvt_iso_manip_includeD yes
|
||||
|
||||
|
||||
int Xorriso_transfer_properties(struct XorrisO *xorriso, struct stat *stbuf,
|
||||
char *disk_path, IsoNode *node, int flag);
|
||||
|
||||
int Xorriso_graft_split(struct XorrisO *xorriso, IsoImage *volume,
|
||||
IsoDir *dir, char *disk_path, char *img_name,
|
||||
char *nominal_source, char *nominal_target,
|
||||
off_t size, IsoNode **node, int flag);
|
||||
|
||||
int Xorriso_tree_graft_node(struct XorrisO *xorriso, IsoImage *volume,
|
||||
IsoDir *dir, char *disk_path, char *img_name,
|
||||
char *nominal_source, char *nominal_target,
|
||||
off_t offset, off_t cut_size,
|
||||
IsoNode **node, int flag);
|
||||
|
||||
int Xorriso_add_tree(struct XorrisO *xorriso, IsoDir *dir,
|
||||
char *img_dir_path, char *disk_dir_path,
|
||||
struct LinkiteM *link_stack, int flag);
|
||||
|
||||
int Xorriso_copy_implicit_properties(struct XorrisO *xorriso, IsoDir *dir,
|
||||
char *full_img_path, char *img_path, char *full_disk_path, int flag);
|
||||
|
||||
int Xorriso_mkisofs_lower_r(struct XorrisO *xorriso, IsoNode *node, int flag);
|
||||
|
||||
int Xorriso_widen_hardlink(struct XorrisO *xorriso, void * boss_iter,
|
||||
IsoNode *node,
|
||||
char *abs_path, char *iso_prefix, char *disk_prefix,
|
||||
int flag);
|
||||
|
||||
|
||||
int Xorriso_cannot_create_iter(struct XorrisO *xorriso, int iso_error,
|
||||
int flag);
|
||||
|
||||
int Xorriso_findi_iter(struct XorrisO *xorriso, IsoDir *dir_node, off_t *mem,
|
||||
IsoDirIter **iter,
|
||||
IsoNode ***node_array, int *node_count, int *node_idx,
|
||||
IsoNode **iterated_node, int flag);
|
||||
|
||||
int Xorriso_findi_action(struct XorrisO *xorriso, struct FindjoB *job,
|
||||
IsoDirIter *boss_iter, off_t boss_mem,
|
||||
char *abs_path, char *show_path,
|
||||
IsoNode *node, int depth, int flag);
|
||||
|
||||
int Xorriso_findi_headline(struct XorrisO *xorriso, struct FindjoB *job,
|
||||
int flag);
|
||||
|
||||
int Xorriso_findi_sorted(struct XorrisO *xorriso, struct FindjoB *job,
|
||||
off_t boss_mem, int filec, char **filev, int flag);
|
||||
|
||||
int Xorriso_all_node_array(struct XorrisO *xorriso, int addon_nodes, int flag);
|
||||
|
||||
|
||||
int Xorriso__file_start_lba(IsoNode *node, int *lba, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_iso_manip_includeD */
|
||||
|
2213
xorriso/iso_tree.c
Normal file
2213
xorriso/iso_tree.c
Normal file
File diff suppressed because it is too large
Load Diff
94
xorriso/iso_tree.h
Normal file
94
xorriso/iso_tree.h
Normal file
@ -0,0 +1,94 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which access nodes of the
|
||||
libisofs tree model.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_iso_tree_includeD
|
||||
#define Xorriso_pvt_iso_tree_includeD yes
|
||||
|
||||
|
||||
#define LIBISO_ISDIR(node) (iso_node_get_type(node) == LIBISO_DIR)
|
||||
#define LIBISO_ISREG(node) (iso_node_get_type(node) == LIBISO_FILE)
|
||||
#define LIBISO_ISLNK(node) (iso_node_get_type(node) == LIBISO_SYMLINK)
|
||||
#define LIBISO_ISCHR(node) (iso_node_get_type(node) == LIBISO_SPECIAL && \
|
||||
S_ISCHR(iso_node_get_mode(node)))
|
||||
#define LIBISO_ISBLK(node) (iso_node_get_type(node) == LIBISO_SPECIAL && \
|
||||
S_ISBLK(iso_node_get_mode(node)))
|
||||
#define LIBISO_ISFIFO(node) (iso_node_get_type(node) == LIBISO_SPECIAL && \
|
||||
S_ISFIFO(iso_node_get_mode(node)))
|
||||
#define LIBISO_ISSOCK(node) (iso_node_get_type(node) == LIBISO_SPECIAL && \
|
||||
S_ISSOCK(iso_node_get_mode(node)))
|
||||
#define LIBISO_ISBOOT(node) (iso_node_get_type(node) == LIBISO_BOOT)
|
||||
|
||||
|
||||
int Xorriso_node_from_path(struct XorrisO *xorriso, IsoImage *volume,
|
||||
char *path, IsoNode **node, int flag);
|
||||
|
||||
int Xorriso_get_node_by_path(struct XorrisO *xorriso,
|
||||
char *in_path, char *eff_path,
|
||||
IsoNode **node, int flag);
|
||||
|
||||
int Xorriso_node_get_dev(struct XorrisO *xorriso, IsoNode *node,
|
||||
char *path, dev_t *dev, int flag);
|
||||
|
||||
int Xorriso_fake_stbuf(struct XorrisO *xorriso, char *path, struct stat *stbuf,
|
||||
IsoNode **node, int flag);
|
||||
|
||||
int Xorriso_node_is_valid(struct XorrisO *xorriso, IsoNode *in_node, int flag);
|
||||
|
||||
int Xorriso_path_from_node(struct XorrisO *xorriso, IsoNode *in_node,
|
||||
char path[SfileadrL], int flag);
|
||||
|
||||
int Xorriso_path_from_lba(struct XorrisO *xorriso, IsoNode *node, int lba,
|
||||
char path[SfileadrL], int flag);
|
||||
|
||||
int Xorriso_get_attr_value(struct XorrisO *xorriso, void *in_node, char *path,
|
||||
char *name, size_t *value_length, char **value, int flag);
|
||||
|
||||
int Xorriso_stream_type(struct XorrisO *xorriso, IsoNode *node,
|
||||
IsoStream *stream, char type_text[], int flag);
|
||||
|
||||
|
||||
int Xorriso_show_du_subs(struct XorrisO *xorriso, IsoDir *dir_node,
|
||||
char *abs_path, char *rel_path, off_t *size,
|
||||
off_t boss_mem, int flag);
|
||||
|
||||
int Xorriso_sorted_dir_i(struct XorrisO *xorriso, IsoDir *dir_node,
|
||||
int *filec, char ***filev, off_t boss_mem, int flag);
|
||||
|
||||
int Xorriso_obtain_pattern_files_i(
|
||||
struct XorrisO *xorriso, char *wd, IsoDir *dir,
|
||||
int *filec, char **filev, int count_limit, off_t *mem,
|
||||
int *dive_count, int flag);
|
||||
|
||||
int Xorriso__start_end_lbas(IsoNode *node,
|
||||
int *lba_count, int **start_lbas, int **end_lbas,
|
||||
off_t *size, int flag);
|
||||
|
||||
int Xorriso__file_start_lba(IsoNode *node,
|
||||
int *lba, int flag);
|
||||
|
||||
int Xorriso_file_eval_damage(struct XorrisO *xorriso, IsoNode *node,
|
||||
off_t *damage_start, off_t *damage_end,
|
||||
int flag);
|
||||
|
||||
int Xorriso_report_lba(struct XorrisO *xorriso, char *show_path,
|
||||
IsoNode *node, int flag);
|
||||
|
||||
int Xorriso_report_damage(struct XorrisO *xorriso, char *show_path,
|
||||
IsoNode *node, int flag);
|
||||
|
||||
int Xorriso_getfname(struct XorrisO *xorriso, char *path, int flag);
|
||||
|
||||
int Xorriso_retrieve_disk_path(struct XorrisO *xorriso, IsoNode *node,
|
||||
char disk_path[SfileadrL], int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_iso_tree_includeD */
|
||||
|
488
xorriso/lib_mgt.c
Normal file
488
xorriso/lib_mgt.c
Normal file
@ -0,0 +1,488 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains functions which manage the relation between xorriso
|
||||
and the libraries: libburn, libisofs, libisoburn.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
|
||||
/* for -charset */
|
||||
#include <iconv.h>
|
||||
#include <langinfo.h>
|
||||
|
||||
|
||||
#include "xorriso.h"
|
||||
#include "xorriso_private.h"
|
||||
#include "xorrisoburn.h"
|
||||
|
||||
#include "lib_mgt.h"
|
||||
|
||||
|
||||
int Xorriso_abort(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret= burn_abort(4440, burn_abort_pacifier, "xorriso : ");
|
||||
if(ret<=0) {
|
||||
fprintf(stderr,
|
||||
"\nxorriso : ABORT : Cannot cancel burn session and release drive.\n");
|
||||
return(0);
|
||||
}
|
||||
fprintf(stderr,
|
||||
"xorriso : ABORT : Drive is released and library is shut down now.\n");
|
||||
fprintf(stderr,
|
||||
"xorriso : ABORT : Program done. Even if you do not see a shell prompt.\n");
|
||||
fprintf(stderr, "\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= asynchronous handling (else catch thread, wait, and exit)
|
||||
*/
|
||||
int Xorriso_set_signal_handling(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
char *handler_prefix= NULL;
|
||||
|
||||
if(Xorriso__get_signal_behavior(0) != 1)
|
||||
return(2);
|
||||
handler_prefix= calloc(strlen(xorriso->progname)+3+1, 1);
|
||||
if(handler_prefix==NULL) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Cannot allocate memory for for setting signal handler");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
return(-1);
|
||||
}
|
||||
sprintf(handler_prefix, "%s : ", xorriso->progname);
|
||||
burn_set_signal_handling(handler_prefix, NULL, (flag & 1) * 0x30);
|
||||
free(handler_prefix);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_startup_libraries(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, major, minor, micro;
|
||||
char *queue_sev, *print_sev, reason[1024];
|
||||
struct iso_zisofs_ctrl zisofs_ctrl= {0, 6, 15};
|
||||
|
||||
|
||||
/* First an ugly compile time check for header version compatibility.
|
||||
If everthing matches, then no C code is produced. In case of mismatch,
|
||||
intentionally faulty C code will be inserted.
|
||||
*/
|
||||
|
||||
/* The minimum requirement of xorriso towards the libisoburn header
|
||||
at compile time is defined in xorriso/xorrisoburn.h
|
||||
xorriso_libisoburn_req_major
|
||||
xorriso_libisoburn_req_minor
|
||||
xorriso_libisoburn_req_micro
|
||||
It gets compared against the version macros in libburn/libburn.h :
|
||||
isoburn_header_version_major
|
||||
isoburn_header_version_minor
|
||||
isoburn_header_version_micro
|
||||
If the header is too old then the following code shall cause failure of
|
||||
cdrskin compilation rather than to allow production of a program with
|
||||
unpredictable bugs or memory corruption.
|
||||
The compiler messages supposed to appear in this case are:
|
||||
error: 'LIBISOBURN_MISCONFIGURATION' undeclared (first use in this function)
|
||||
error: 'INTENTIONAL_ABORT_OF_COMPILATION__HEADERFILE_libisoburn_dot_h_TOO_OLD__SEE_xorrisoburn_dot_c' undeclared (first use in this function)
|
||||
error: 'LIBISOBURN_MISCONFIGURATION_' undeclared (first use in this function)
|
||||
*/
|
||||
/* The indendation is an advise of man gcc to help old compilers ignoring */
|
||||
#if xorriso_libisoburn_req_major > isoburn_header_version_major
|
||||
#define Isoburn_libisoburn_dot_h_too_olD 1
|
||||
#endif
|
||||
#if xorriso_libisoburn_req_major == isoburn_header_version_major && xorriso_libisoburn_req_minor > isoburn_header_version_minor
|
||||
#define Isoburn_libisoburn_dot_h_too_olD 1
|
||||
#endif
|
||||
#if xorriso_libisoburn_req_minor == isoburn_header_version_minor && xorriso_libisoburn_req_micro > isoburn_header_version_micro
|
||||
#define Isoburn_libisoburn_dot_h_too_olD 1
|
||||
#endif
|
||||
|
||||
#ifdef Isoburn_libisoburn_dot_h_too_olD
|
||||
LIBISOBURN_MISCONFIGURATION = 0;
|
||||
INTENTIONAL_ABORT_OF_COMPILATION__HEADERFILE_libisoburn_dot_h_TOO_OLD__SEE_xorrisoburn_dot_c = 0;
|
||||
LIBISOBURN_MISCONFIGURATION_ = 0;
|
||||
#endif
|
||||
|
||||
/* End of ugly compile time test (scroll up for explanation) */
|
||||
|
||||
reason[0]= 0;
|
||||
ret= isoburn_initialize(reason, 0);
|
||||
if(ret==0) {
|
||||
sprintf(xorriso->info_text, "Cannot initialize libraries");
|
||||
if(reason[0])
|
||||
sprintf(xorriso->info_text+strlen(xorriso->info_text),
|
||||
". Reason given:\n%s", reason);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
return(0);
|
||||
}
|
||||
ret= isoburn_is_compatible(isoburn_header_version_major,
|
||||
isoburn_header_version_minor,
|
||||
isoburn_header_version_micro, 0);
|
||||
if(ret<=0) {
|
||||
isoburn_version(&major, &minor, µ);
|
||||
sprintf(xorriso->info_text,
|
||||
"libisoburn version too old: %d.%d.%d . Need at least: %d.%d.%d .\n",
|
||||
major, minor, micro,
|
||||
isoburn_header_version_major, isoburn_header_version_minor,
|
||||
isoburn_header_version_micro);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
xorriso->libs_are_started= 1;
|
||||
|
||||
queue_sev= "ALL";
|
||||
if(xorriso->library_msg_direct_print) {
|
||||
|
||||
/* >>> need option for controlling this in XorrisO.
|
||||
See also Xorriso_msgs_submit */;
|
||||
|
||||
print_sev= xorriso->report_about_text;
|
||||
} else
|
||||
print_sev= "NEVER";
|
||||
|
||||
iso_set_msgs_severities(queue_sev, print_sev, "libsofs : ");
|
||||
burn_msgs_set_severities(queue_sev, print_sev, "libburn : ");
|
||||
|
||||
/* ??? >>> do we want united queues ? */
|
||||
/* burn_set_messenger(iso_get_messenger()); */
|
||||
|
||||
isoburn_set_msgs_submit(Xorriso_msgs_submit_void, (void *) xorriso,
|
||||
(3<<2) | 128 , 0);
|
||||
|
||||
ret= Xorriso_set_signal_handling(xorriso, 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
|
||||
ret = iso_zisofs_get_params(&zisofs_ctrl, 0);
|
||||
if (ret == 1) {
|
||||
xorriso->zisofs_block_size= xorriso->zisofs_block_size_default=
|
||||
(1 << zisofs_ctrl.block_size_log2);
|
||||
xorriso->zlib_level= xorriso->zlib_level_default=
|
||||
zisofs_ctrl.compression_level;
|
||||
}
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(reason[0]) {
|
||||
sprintf(xorriso->info_text, "%s", reason);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0);
|
||||
}
|
||||
strcpy(xorriso->info_text, "Using ");
|
||||
strncat(xorriso->info_text, burn_scsi_transport_id(0), 1024);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= global shutdown of libraries */
|
||||
int Xorriso_detach_libraries(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
Xorriso_give_up_drive(xorriso, 3);
|
||||
if(xorriso->in_volset_handle!=NULL) { /* standalone image */
|
||||
iso_image_unref((IsoImage *) xorriso->in_volset_handle);
|
||||
xorriso->in_volset_handle= NULL;
|
||||
Sectorbitmap_destroy(&(xorriso->in_sector_map), 0);
|
||||
Xorriso_destroy_di_array(xorriso, 0);
|
||||
Xorriso_destroy_hln_array(xorriso, 0);
|
||||
xorriso->boot_count= 0;
|
||||
}
|
||||
if(flag&1) {
|
||||
if(xorriso->libs_are_started==0)
|
||||
return(0);
|
||||
isoburn_finish();
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= suppress messages below UPDATE
|
||||
bit1= suppress messages below FAILURE
|
||||
*/
|
||||
int Xorriso_set_image_severities(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
char *queue_sev, *print_sev;
|
||||
|
||||
if(flag&2)
|
||||
queue_sev= "FAILURE";
|
||||
else if(flag&1)
|
||||
queue_sev= "UPDATE";
|
||||
else
|
||||
queue_sev= "ALL";
|
||||
if(xorriso->library_msg_direct_print)
|
||||
print_sev= xorriso->report_about_text;
|
||||
else
|
||||
print_sev= "NEVER";
|
||||
iso_set_msgs_severities(queue_sev, print_sev, "libisofs : ");
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0=prepare for a burn run */
|
||||
int Xorriso_set_abort_severity(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, abort_on_number;
|
||||
char *sev_text;
|
||||
static int note_number= -1, failure_number= -1;
|
||||
|
||||
if(note_number==-1)
|
||||
Xorriso__text_to_sev("NOTE", ¬e_number, 0);
|
||||
if(failure_number==-1)
|
||||
Xorriso__text_to_sev("FAILURE", &failure_number, 0);
|
||||
sev_text= xorriso->abort_on_text;
|
||||
ret= Xorriso__text_to_sev(xorriso->abort_on_text, &abort_on_number, 0);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
if(abort_on_number<note_number)
|
||||
sev_text= "NOTE";
|
||||
else if(abort_on_number>failure_number)
|
||||
sev_text= "FAILURE";
|
||||
ret= iso_set_abort_severity(sev_text);
|
||||
return(ret>=0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_report_lib_versions(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int major, minor, micro;
|
||||
int req_major, req_minor, req_micro;
|
||||
|
||||
iso_lib_version(&major, &minor, µ);
|
||||
isoburn_libisofs_req(&req_major, &req_minor, &req_micro);
|
||||
sprintf(xorriso->result_line,
|
||||
"libisofs in use : %d.%d.%d (min. %d.%d.%d)\n",
|
||||
major, minor, micro, req_major, req_minor, req_micro);
|
||||
Xorriso_result(xorriso, 0);
|
||||
burn_version(&major, &minor, µ);
|
||||
isoburn_libburn_req(&req_major, &req_minor, &req_micro);
|
||||
sprintf(xorriso->result_line,
|
||||
"libburn in use : %d.%d.%d (min. %d.%d.%d)\n",
|
||||
major, minor, micro, req_major, req_minor, req_micro);
|
||||
Xorriso_result(xorriso, 0);
|
||||
strcpy(xorriso->result_line, "libburn OS adapter: ");
|
||||
strncat(xorriso->result_line, burn_scsi_transport_id(0), 1024);
|
||||
strcat(xorriso->result_line, "\n");
|
||||
Xorriso_result(xorriso, 0);
|
||||
isoburn_version(&major, &minor, µ);
|
||||
sprintf(xorriso->result_line,
|
||||
"libisoburn in use : %d.%d.%d (min. %d.%d.%d)\n",
|
||||
major, minor, micro,
|
||||
isoburn_header_version_major, isoburn_header_version_minor,
|
||||
isoburn_header_version_micro);
|
||||
Xorriso_result(xorriso, 0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__sev_to_text(int severity, char **severity_name,
|
||||
int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret= iso_sev_to_text(severity, severity_name);
|
||||
if(ret>0)
|
||||
return(ret);
|
||||
ret= burn_sev_to_text(severity, severity_name, 0);
|
||||
if(ret>0)
|
||||
return(ret);
|
||||
*severity_name= "";
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__text_to_sev(char *severity_name, int *severity_number, int flag)
|
||||
{
|
||||
int ret= 1;
|
||||
|
||||
ret= iso_text_to_sev(severity_name, severity_number);
|
||||
if(ret>0)
|
||||
return(ret);
|
||||
ret= burn_text_to_sev(severity_name, severity_number, 0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= report libisofs error text
|
||||
bit1= victim is disk_path
|
||||
bit2= do not inquire libisofs, report msg_text and min_severity
|
||||
*/
|
||||
int Xorriso_report_iso_error(struct XorrisO *xorriso, char *victim,
|
||||
int iso_error_code, char msg_text[], int os_errno,
|
||||
char min_severity[], int flag)
|
||||
{
|
||||
int error_code, iso_sev, min_sev, ret;
|
||||
char *sev_text_pt, *msg_text_pt= NULL;
|
||||
char sfe[6*SfileadrL];
|
||||
static int sorry_sev= -1;
|
||||
|
||||
if(sorry_sev<0)
|
||||
Xorriso__text_to_sev("SORRY", &sorry_sev, 0);
|
||||
|
||||
if(flag&4) {
|
||||
error_code= 0x00050000;
|
||||
Xorriso__text_to_sev(min_severity, &iso_sev, 0);
|
||||
} else {
|
||||
error_code= iso_error_get_code(iso_error_code);
|
||||
if(error_code < 0x00030000 || error_code >= 0x00040000)
|
||||
error_code= (error_code & 0xffff) | 0x00050000;
|
||||
if(flag&1)
|
||||
msg_text_pt= (char *) iso_error_to_msg(iso_error_code);
|
||||
iso_sev= iso_error_get_severity(iso_error_code);
|
||||
}
|
||||
if(msg_text_pt==NULL)
|
||||
msg_text_pt= msg_text;
|
||||
|
||||
if(iso_sev >= sorry_sev && (flag & 2) && victim[0])
|
||||
Xorriso_msgs_submit(xorriso, 0, victim, 0, "ERRFILE", 0);
|
||||
sev_text_pt= min_severity;
|
||||
Xorriso__text_to_sev(min_severity, &min_sev, 0);
|
||||
if(min_sev < iso_sev && !(flag&4))
|
||||
Xorriso__sev_to_text(iso_sev, &sev_text_pt, 0);
|
||||
strcpy(sfe, msg_text_pt);
|
||||
if(victim[0]) {
|
||||
strcat(sfe, ": ");
|
||||
Text_shellsafe(victim, sfe+strlen(sfe), 0);
|
||||
}
|
||||
ret= Xorriso_msgs_submit(xorriso, error_code, sfe, os_errno, sev_text_pt, 4);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_get_local_charset(struct XorrisO *xorriso, char **name, int flag)
|
||||
{
|
||||
(*name)= iso_get_local_charset(0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_set_local_charset(struct XorrisO *xorriso, char *name, int flag)
|
||||
{
|
||||
int ret;
|
||||
char *nl_charset, sfe[5 * SfileadrL];
|
||||
iconv_t iconv_ret= (iconv_t) -1;
|
||||
|
||||
nl_charset= nl_langinfo(CODESET);
|
||||
if(name == NULL)
|
||||
name= nl_charset;
|
||||
|
||||
if(name != NULL) {
|
||||
iconv_ret= iconv_open(nl_charset, name);
|
||||
if(iconv_ret == (iconv_t) -1)
|
||||
goto cannot;
|
||||
else
|
||||
iconv_close(iconv_ret);
|
||||
}
|
||||
ret= iso_set_local_charset(name, 0);
|
||||
if(ret <= 0) {
|
||||
cannot:;
|
||||
sprintf(xorriso->info_text,
|
||||
"-local_charset: Cannot assume as local character set: %s",
|
||||
Text_shellsafe(name, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
return(0);
|
||||
}
|
||||
sprintf(xorriso->info_text, "Local character set is now assumed as: %s",
|
||||
Text_shellsafe(name, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_process_msg_queues(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, error_code= 0, os_errno= 0, count= 0, pass, imgid, tunneled;
|
||||
char severity[80];
|
||||
|
||||
if(!xorriso->libs_are_started)
|
||||
return(1);
|
||||
for(pass= 0; pass< 2; pass++) {
|
||||
while(1) {
|
||||
tunneled= 0;
|
||||
if(pass==0)
|
||||
ret= iso_obtain_msgs("ALL", &error_code, &imgid,
|
||||
xorriso->info_text, severity);
|
||||
else {
|
||||
ret= burn_msgs_obtain("ALL", &error_code, xorriso->info_text, &os_errno,
|
||||
severity);
|
||||
if((error_code>=0x00030000 && error_code<0x00040000) ||
|
||||
(error_code>=0x00050000 && error_code<0x00060000))
|
||||
tunneled= -1; /* "libisofs:" */
|
||||
else if(error_code>=0x00060000 && error_code<0x00070000)
|
||||
tunneled= 1; /* "libisoburn:" */
|
||||
}
|
||||
if(ret<=0)
|
||||
break;
|
||||
|
||||
/* <<< tunneled MISHAP from libisoburn through libburn
|
||||
or well known error codes of MISHAP events
|
||||
With libburn-0.4.4 this is not necessary */
|
||||
if(error_code==0x5ff73 || error_code==0x3ff73 ||
|
||||
error_code==0x3feb9 || error_code==0x3feb2)
|
||||
strcpy(severity, "MISHAP");
|
||||
else if(error_code==0x51001)
|
||||
strcpy(severity, "ERRFILE");
|
||||
|
||||
Xorriso_msgs_submit(xorriso, error_code, xorriso->info_text, os_errno,
|
||||
severity, ((pass+tunneled)+1)<<2);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
if(xorriso->library_msg_direct_print && count>0) {
|
||||
sprintf(xorriso->info_text," (%d library messages repeated by xorriso)\n",
|
||||
count);
|
||||
Xorriso_info(xorriso, 0);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_md5_start(struct XorrisO *xorriso, void **ctx, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret= iso_md5_start(ctx);
|
||||
if(ret == 1)
|
||||
return(1);
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_md5_compute(struct XorrisO *xorriso, void *ctx,
|
||||
char *data, int datalen, int flag)
|
||||
{
|
||||
iso_md5_compute(ctx, data, datalen);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_md5_end(struct XorrisO *xorriso, void **ctx, char md5[16],
|
||||
int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret= iso_md5_end(ctx, md5);
|
||||
Xorriso_process_msg_queues(xorriso,0);
|
||||
if(ret <= 0)
|
||||
return(0);
|
||||
return(1);
|
||||
}
|
||||
|
78
xorriso/lib_mgt.h
Normal file
78
xorriso/lib_mgt.h
Normal file
@ -0,0 +1,78 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which manage the relation
|
||||
between xorriso and the libraries: libburn, libisofs, and libisoburn.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_x_includeD
|
||||
#define Xorriso_pvt_x_includeD yes
|
||||
|
||||
|
||||
#ifndef Xorriso_standalonE
|
||||
|
||||
/* The library which does the ISO 9660 / RockRidge manipulations */
|
||||
#include <libisofs/libisofs.h>
|
||||
|
||||
/* The library which does MMC optical drive operations */
|
||||
#include <libburn/libburn.h>
|
||||
|
||||
/* The library which enhances overwriteable media with ISO 9660 multi-session
|
||||
capabilities via the method invented by Andy Polyakov for growisofs */
|
||||
#include <libisoburn/libisoburn.h>
|
||||
|
||||
/* The official xorriso options API. "No shortcuts" */
|
||||
#include "xorriso.h"
|
||||
|
||||
/* The inner description of XorrisO */
|
||||
#include "xorriso_private.h"
|
||||
|
||||
/* The inner isofs- and burn-library interface */
|
||||
#include "xorrisoburn.h"
|
||||
|
||||
#else /* ! Xorriso_standalonE */
|
||||
|
||||
#include "../libisofs/libisofs.h"
|
||||
#include "../libburn/libburn.h"
|
||||
#include "../libisoburn/libisoburn.h"
|
||||
#include "xorriso.h"
|
||||
#include "xorriso_private.h"
|
||||
#include "xorrisoburn.h"
|
||||
|
||||
#endif /* Xorriso_standalonE */
|
||||
|
||||
|
||||
int Xorriso_abort(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
|
||||
/* @param flag bit0= asynchronous handling (else catch thread, wait, and exit)
|
||||
*/
|
||||
int Xorriso_set_signal_handling(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* @param flag bit0= suppress messages below UPDATE
|
||||
bit1= suppress messages below FAILURE
|
||||
*/
|
||||
int Xorriso_set_image_severities(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso__sev_to_text(int severity, char **severity_name,
|
||||
int flag);
|
||||
|
||||
/* @param flag bit0= report libisofs error text
|
||||
bit1= victim is disk_path
|
||||
bit2= do not inquire libisofs, report msg_text and min_severity
|
||||
*/
|
||||
int Xorriso_report_iso_error(struct XorrisO *xorriso, char *victim,
|
||||
int iso_error_code, char msg_text[], int os_errno,
|
||||
char min_severity[], int flag);
|
||||
|
||||
int Xorriso_process_msg_queues(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_x_includeD */
|
||||
|
10
xorriso/make_docs.sh
Executable file
10
xorriso/make_docs.sh
Executable file
@ -0,0 +1,10 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Produce man page xorriso/xorriso.1 and info file xorriso/xorriso.info
|
||||
# from base file xorris/xorriso.texi.
|
||||
|
||||
( cd xorriso ; makeinfo ./xorriso.texi )
|
||||
|
||||
xorriso/make_xorriso_1 -auto
|
||||
|
||||
|
333
xorriso/make_xorriso_1.c
Normal file
333
xorriso/make_xorriso_1.c
Normal file
@ -0,0 +1,333 @@
|
||||
|
||||
/*
|
||||
( cd xorriso ; cc -g -Wall -o make_xorriso_1 make_xorriso_1.c )
|
||||
*/
|
||||
/*
|
||||
Specialized converter from xorriso/xorriso.texi to xorriso/xorriso.1.
|
||||
|
||||
The conversion rules are described at the beginning of xorriso/xorriso.texi
|
||||
|
||||
Copyright 2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
/* The conversion state
|
||||
*/
|
||||
struct Mx1 {
|
||||
|
||||
char prog[4096];
|
||||
|
||||
int count_in;
|
||||
int count_out;
|
||||
|
||||
int skipping; /* <0 stacked skipping , 0= no , >0 counting down */
|
||||
|
||||
};
|
||||
|
||||
|
||||
int Mx1_init(struct Mx1 *m, char *prog, int flag)
|
||||
{
|
||||
strncpy(m->prog, prog, sizeof(m->prog) - 1);
|
||||
m->prog[sizeof(m->prog) - 1]= 0;
|
||||
m->count_in= 0;
|
||||
m->count_out= 0;
|
||||
m->skipping= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Mx1_report_error(struct Mx1 *m, char *text, int flag)
|
||||
{
|
||||
fprintf(stderr, "%s : line %d : %s\n", m->prog, m->count_in, text);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Mx1__get_word(char *line, char word[256], char **remainder, int flag)
|
||||
{
|
||||
char *cpt, *start;
|
||||
int l;
|
||||
|
||||
word[0]= 0;
|
||||
*remainder= NULL;
|
||||
for(cpt= line; *cpt != 0 && isspace(*cpt); cpt++);
|
||||
if(*cpt == 0)
|
||||
return(0);
|
||||
start= cpt;
|
||||
for(cpt= line; *cpt != 0 && ! isspace(*cpt); cpt++);
|
||||
l= cpt - start;
|
||||
if(l > 0)
|
||||
strncpy(word, start, l);
|
||||
word[l]= 0;
|
||||
*remainder= cpt;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Mx1_substitute(struct Mx1 *m, char line_in[256], char line_out[256],
|
||||
int raw, int flag)
|
||||
{
|
||||
char *rpt, *wpt, *ept;
|
||||
int l;
|
||||
|
||||
wpt= line_out;
|
||||
for(rpt= line_in; *rpt != 0; rpt++) {
|
||||
if(rpt - line_in < raw) {
|
||||
*(wpt++)= *rpt;
|
||||
continue;
|
||||
}
|
||||
if(*rpt == '@') {
|
||||
if(strncmp(rpt, "@strong{", 8) == 0) {
|
||||
/* @strong{-...} gets mapped to \fB\-...\fR . */;
|
||||
/* @strong{... } gets mapped to \fB...\fR . */
|
||||
ept= strchr(rpt, '}');
|
||||
if(ept == NULL) {
|
||||
Mx1_report_error(m, "No closing bracket found for '@strong{'", 0);
|
||||
return(-1);
|
||||
}
|
||||
l= ept - rpt - 8;
|
||||
if((wpt - line_out) + l + 6 + (rpt[8] == '-') > 255)
|
||||
goto overflow;
|
||||
strcpy(wpt, "\\fB");
|
||||
wpt+= 3;
|
||||
if(rpt[8] == '-')
|
||||
*(wpt++)= '\\';
|
||||
strncpy(wpt, rpt + 8, l);
|
||||
wpt+= l;
|
||||
strcpy(wpt, "\\fR");
|
||||
wpt+= 3;
|
||||
rpt+= ept - rpt;
|
||||
} else if(strncmp(rpt, "@minus{}", 8) == 0) {
|
||||
/* @minus{} will become "-". */
|
||||
if((wpt - line_out) + 1 > 255)
|
||||
goto overflow;
|
||||
*(wpt++)= '-';
|
||||
rpt+= 7;
|
||||
} else if(strncmp(rpt, "@@", 2) == 0 ||
|
||||
strncmp(rpt, "@{", 2) == 0 ||
|
||||
strncmp(rpt, "@}", 2) == 0) {
|
||||
/* @@ , @{, @} will get stripped of their first @. */
|
||||
*(wpt++)= *(rpt + 1);
|
||||
rpt++;
|
||||
}
|
||||
} else if(*rpt == '\\') {
|
||||
/* "\" becomes "\\" */
|
||||
if((wpt - line_out) + 2 > 255)
|
||||
goto overflow;
|
||||
*(wpt++)= '\\';
|
||||
*(wpt++)= '\\';
|
||||
} else if((wpt - line_out) + 1 > 255) {
|
||||
overflow:;
|
||||
Mx1_report_error(m, "Line length overflow while text substitution", 0);
|
||||
return(-1);
|
||||
} else
|
||||
*(wpt++)= *rpt;
|
||||
}
|
||||
*wpt= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@return 1= line_out is valid, 0= do not put out line_out, -1 = error
|
||||
*/
|
||||
int Mx1_convert(struct Mx1 *m, char line_in[256], char line_out[256], int flag)
|
||||
{
|
||||
int l, num, keep= 0, ret, raw;
|
||||
char word[256], buf[256], *remainder;
|
||||
|
||||
m->count_in++;
|
||||
l= strlen(line_in);
|
||||
|
||||
if(m->skipping > 0) {
|
||||
m->skipping--;
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* The first line gets discarded. */
|
||||
if(m->count_in == 1)
|
||||
return(0);
|
||||
|
||||
/* Line start "@c man " will become "", the remainder is put out unaltered. */
|
||||
if(strncmp(line_in, "@c man ", 7) == 0) {
|
||||
strcpy(line_out, line_in + 7);
|
||||
m->count_out++;
|
||||
return(1);
|
||||
}
|
||||
|
||||
/* Lines "@*" will be converted to ".br" */
|
||||
if(strcmp(line_in, "@*") == 0) {
|
||||
strcpy(line_out, ".br");
|
||||
m->count_out++;
|
||||
return(1);
|
||||
}
|
||||
|
||||
/* @c man-ignore-lines N will discard N following lines.
|
||||
"@c man-ignore-lines begin" discards all following lines
|
||||
up to "@c man-ignore-lines end".
|
||||
*/
|
||||
if(strncmp(line_in, "@c man-ignore-lines ", 20) == 0) {
|
||||
if(strcmp(line_in + 20, "begin") == 0) {
|
||||
m->skipping--;
|
||||
return(0);
|
||||
} else if(strcmp(line_in + 20, "end") == 0) {
|
||||
if(m->skipping < 0)
|
||||
m->skipping++;
|
||||
return(0);
|
||||
} else if(m->skipping == 0) {
|
||||
num= 0;
|
||||
sscanf(line_in + 20, "%d", &num);
|
||||
if(num > 0) {
|
||||
m->skipping= num;
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
Mx1_report_error(m, "Inappropriate use of '@c man-ignore-lines'", 0);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
/* Line blocks of "@menu" "@end menu" will be discarded. */
|
||||
if(strcmp(line_in, "@menu") == 0) {
|
||||
m->skipping--;
|
||||
return(0);
|
||||
}
|
||||
if(strcmp(line_in, "@end menu") == 0) {
|
||||
if(m->skipping < 0)
|
||||
m->skipping++;
|
||||
return(0);
|
||||
}
|
||||
if(m->skipping)
|
||||
return(0);
|
||||
|
||||
/* "@item -word words" becomes "\fB\-word\fR words". */
|
||||
/* "@item word words" becomes "\fBword\fR words". */
|
||||
if(strncmp(line_in, "@item ", 6) == 0) {
|
||||
ret= Mx1__get_word(line_in + 6, word, &remainder, 0);
|
||||
if(ret <= 0) {
|
||||
Mx1_report_error(m, "Found no word after @item", 0);
|
||||
return(0);
|
||||
}
|
||||
strcpy(buf, "\\fB");
|
||||
if(word[0] == '-') {
|
||||
if(l >= 255) {
|
||||
Mx1_report_error(m, "Line length overflow while converting @item", 0);
|
||||
return(-1);
|
||||
}
|
||||
strcat(buf, "\\");
|
||||
}
|
||||
strcat(buf, word);
|
||||
strcat(buf, "\\fR");
|
||||
raw= strlen(buf);
|
||||
strcat(buf, remainder);
|
||||
ret= Mx1_substitute(m, buf, line_out, raw, 0);
|
||||
if(ret <= 0)
|
||||
return(-1);
|
||||
m->count_out++;
|
||||
return(1);
|
||||
}
|
||||
|
||||
/* @strong{-...} gets mapped to \fB\-...\fR . */
|
||||
/* @strong{... } gets mapped to \fB...\fR . */
|
||||
/* @minus{} will become "-". */
|
||||
/* @@ , @{, @} will get stripped of their first @. */
|
||||
/* "\" becomes "\\" */
|
||||
if(line_in[0] != '@' ||
|
||||
strncmp(line_in, "@strong{", 8) == 0 ||
|
||||
strncmp(line_in, "@minus{}", 8) == 0 ||
|
||||
strncmp(line_in, "@@", 2) == 0 ||
|
||||
strncmp(line_in, "@{", 2) == 0 ||
|
||||
strncmp(line_in, "@}", 2) == 0) {
|
||||
keep= 1;
|
||||
ret= Mx1_substitute(m, line_in, line_out, 0, 0);
|
||||
if(ret <= 0)
|
||||
return(-1);
|
||||
}
|
||||
|
||||
/* Other lines which begin by "@" will be discarded. */
|
||||
if(! keep) {
|
||||
if(line_in[0] == '@')
|
||||
return(0);
|
||||
strcpy(line_out, line_in);
|
||||
}
|
||||
m->count_out++;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int ret, l, as_filter= 0, i;
|
||||
char line_in[256], line_out[256], *got;
|
||||
static char name_in[]= {"xorriso/xorriso.texi"};
|
||||
static char name_out[]= {"xorriso/xorriso.1"};
|
||||
struct Mx1 m;
|
||||
FILE *fp_in= stdin, *fp_out= stdout;
|
||||
|
||||
Mx1_init(&m, argv[0], 0);
|
||||
|
||||
if(argc < 2) {
|
||||
usage:;
|
||||
fprintf(stderr, "usage: %s -auto|-filter\n", argv[0]);
|
||||
fprintf(stderr, " -auto xorriso/xorriso.texi -> xorriso/xorriso.1\n");
|
||||
fprintf(stderr, " -filter stdin -> stdout\n");
|
||||
exit(2);
|
||||
}
|
||||
for(i= 1; i < argc; i++) {
|
||||
if(strcmp(argv[i], "-filter") == 0)
|
||||
as_filter= 1;
|
||||
else if(strcmp(argv[i], "-auto") == 0)
|
||||
as_filter= 0;
|
||||
else {
|
||||
fprintf(stderr, "%s : unknown option %s\n", argv[0], argv[i]);
|
||||
goto usage;
|
||||
}
|
||||
}
|
||||
|
||||
if(!as_filter) {
|
||||
fp_in= fopen(name_in, "r");
|
||||
if(fp_in == NULL) {
|
||||
fprintf(stderr, "%s : failed to fopen( %s ,r) : %d %s\n",
|
||||
argv[0], name_in, errno, strerror(errno));
|
||||
exit(3);
|
||||
}
|
||||
fp_out= fopen(name_out, "w");
|
||||
if(fp_out == NULL) {
|
||||
fprintf(stderr, "%s : failed to fopen( %s ,w) : %d %s\n",
|
||||
argv[0], name_out, errno, strerror(errno));
|
||||
exit(4);
|
||||
}
|
||||
}
|
||||
while(1) {
|
||||
got= fgets(line_in, sizeof(line_in), fp_in);
|
||||
if(got == NULL)
|
||||
break;
|
||||
l= strlen(line_in);
|
||||
while(l > 0) {
|
||||
if(line_in[l - 1] == '\r' || line_in[l - 1] == '\n') {
|
||||
line_in[l - 1] = 0;
|
||||
l--;
|
||||
} else
|
||||
break;
|
||||
}
|
||||
ret= Mx1_convert(&m, line_in, line_out, 0);
|
||||
if(ret < 0)
|
||||
exit(1);
|
||||
if(ret == 0)
|
||||
continue;
|
||||
fprintf(fp_out, "%s\n", line_out);
|
||||
}
|
||||
exit(0);
|
||||
}
|
@ -1,35 +1,50 @@
|
||||
#!/bin/sh
|
||||
|
||||
# make_xorriso_standalone.sh
|
||||
# Copyright 2008 - 2009 Thomas Schmitt, scdbackup@gmx.net, GPL
|
||||
# Copyright 2008 - 2010 Thomas Schmitt, scdbackup@gmx.net, GPLv2+
|
||||
#
|
||||
# Not intended for general use in production installations !
|
||||
#
|
||||
# This is a development tool which expects a special setup of directories.
|
||||
# It is to be executed in a common parent of the directories
|
||||
# nglibisofs-develop libburn-develop libisoburn-develop
|
||||
# where tarballs or repository copies have been installed of
|
||||
# libisofs libburn libisoburn
|
||||
# obtained according to instructions on http://libburnia-project.org.
|
||||
#
|
||||
# Creates a standalone tree for building xorriso
|
||||
# from the contents of a unified libburnia development tree.
|
||||
# It creates a new directory tree
|
||||
# xorriso-standalone
|
||||
# for building GNU xorriso.
|
||||
#
|
||||
# The ./bootstrap script gets applied and a source tarball
|
||||
# is made.
|
||||
#
|
||||
# From that tree can be build a binary xorriso/xorriso
|
||||
# which at runtime depends only on libc and libpthread.
|
||||
# Execute in $lone_dir :
|
||||
# From that tree can be build a binary xorriso/xorriso which at runtime
|
||||
# does not depend on installed libburnia libraries.
|
||||
# Execute in xorriso-standalone :
|
||||
#
|
||||
# ./configure && make
|
||||
#
|
||||
|
||||
# By the variable setting create_gnu_xorriso="yes"
|
||||
# the result will become a GNU xorriso tarball under GPLv3+.
|
||||
# Without this setting, the result is technically equivalent but
|
||||
# stays under GPLv2+. In that case the files xorriso/*_gnu_xorriso
|
||||
# are merely informative.
|
||||
# Note that it is not permissible to revert the transition from
|
||||
# GPLv2+ to GPLv3+. (Rather derive a new GPLv2+ from libburnia.)
|
||||
|
||||
create_gnu_xorriso="yes"
|
||||
|
||||
|
||||
current_dir=$(pwd)
|
||||
lone_dir="$current_dir"/"xorriso-standalone"
|
||||
|
||||
xorriso_rev=0.4.1
|
||||
# For unstable uploads:
|
||||
xorriso_rev=0.6.0
|
||||
# For unstable uploads and patch level 0 of stable releases:
|
||||
xorriso_pl=""
|
||||
# For stable releases:
|
||||
## xorriso_pl=".pl00"
|
||||
# For higher patch levels of stable releases:
|
||||
## xorriso_pl=".pl01"
|
||||
|
||||
with_bootstrap_tarball=1
|
||||
|
||||
@ -99,14 +114,14 @@ copy_files \
|
||||
\
|
||||
"$lone_dir"
|
||||
|
||||
copy_files xorriso/xorriso_bootstrap.txt "$lone_dir"/bootstrap
|
||||
|
||||
copy_files xorriso/configure_ac.txt "$lone_dir"/configure.ac
|
||||
|
||||
copy_files xorriso/xorriso_makefile_am.txt "$lone_dir"/Makefile.am
|
||||
|
||||
# copy_files xorriso/xorriso_pc_in.txt "$lone_dir"/xorriso.pc.in
|
||||
|
||||
copy_files xorriso/README "$lone_dir"/README
|
||||
|
||||
# echo "See end of xorriso/changelog.txt" >"$lone_dir"/TODO
|
||||
|
||||
|
||||
@ -121,14 +136,66 @@ xorriso/convert_man_to_html.sh
|
||||
|
||||
create_dir "$lone_dir"/xorriso
|
||||
copy_files \
|
||||
xorriso/xorrisoburn.[ch] \
|
||||
xorriso/xorriso.[ch1] \
|
||||
xorriso/xorriso.h \
|
||||
xorriso/xorriso_private.h \
|
||||
xorriso/sfile.h \
|
||||
xorriso/sfile.c \
|
||||
xorriso/aux_objects.h \
|
||||
xorriso/aux_objects.c \
|
||||
xorriso/findjob.h \
|
||||
xorriso/findjob.c \
|
||||
xorriso/check_media.h \
|
||||
xorriso/check_media.c \
|
||||
xorriso/misc_funct.h \
|
||||
xorriso/misc_funct.c \
|
||||
xorriso/text_io.h \
|
||||
xorriso/text_io.c \
|
||||
xorriso/match.h \
|
||||
xorriso/match.c \
|
||||
xorriso/emulators.h \
|
||||
xorriso/emulators.c \
|
||||
xorriso/disk_ops.h \
|
||||
xorriso/disk_ops.c \
|
||||
xorriso/cmp_update.h \
|
||||
xorriso/cmp_update.c \
|
||||
xorriso/parse_exec.h \
|
||||
xorriso/parse_exec.c \
|
||||
xorriso/opts_a_c.c \
|
||||
xorriso/opts_d_h.c \
|
||||
xorriso/opts_i_o.c \
|
||||
xorriso/opts_p_z.c \
|
||||
\
|
||||
xorriso/xorrisoburn.h \
|
||||
xorriso/base_obj.h \
|
||||
xorriso/base_obj.c \
|
||||
xorriso/lib_mgt.h \
|
||||
xorriso/lib_mgt.c \
|
||||
xorriso/sort_cmp.h \
|
||||
xorriso/sort_cmp.c \
|
||||
xorriso/drive_mgt.h \
|
||||
xorriso/drive_mgt.c \
|
||||
xorriso/iso_img.h \
|
||||
xorriso/iso_img.c \
|
||||
xorriso/iso_tree.h \
|
||||
xorriso/iso_tree.c \
|
||||
xorriso/iso_manip.h \
|
||||
xorriso/iso_manip.c \
|
||||
xorriso/write_run.h \
|
||||
xorriso/write_run.c \
|
||||
xorriso/read_run.h \
|
||||
xorriso/read_run.c \
|
||||
xorriso/filters.h \
|
||||
xorriso/filters.c \
|
||||
\
|
||||
xorriso/xorriso_main.c \
|
||||
xorriso/xorriso_timestamp.h \
|
||||
\
|
||||
xorriso/changelog.txt \
|
||||
xorriso/xorriso_eng.html \
|
||||
xorriso/xorriso.texi \
|
||||
xorriso/xorriso.info \
|
||||
xorriso/make_xorriso_1.c \
|
||||
xorriso/xorriso.1 \
|
||||
xorriso/man_1_xorriso.html \
|
||||
"$lone_dir"/xorriso
|
||||
|
||||
@ -153,7 +220,9 @@ copy_files libisofs/*.[ch] "$lone_dir"/libisofs
|
||||
copy_files libisofs/filters/*.[ch] "$lone_dir"/libisofs/filters
|
||||
copy_files doc/susp_aaip*.txt "$lone_dir"/doc
|
||||
copy_files doc/zisofs_format.txt "$lone_dir"/doc
|
||||
copy_files doc/checksums.txt "$lone_dir"/doc
|
||||
copy_files COPYRIGHT "$lone_dir"/libisofs
|
||||
test -e CONTRIBUTORS && cat CONTRIBUTORS >>"$lone_dir"/CONTRIBUTORS
|
||||
|
||||
# To get a common version.h
|
||||
cat version.h.in >> "$lone_dir"/version.h.in
|
||||
@ -196,18 +265,43 @@ create_dir "$lone_dir"/libburn
|
||||
goto_dir "$current_dir"/libburn-develop
|
||||
copy_files libburn/*.[ch] "$lone_dir"/libburn
|
||||
copy_files COPYRIGHT "$lone_dir"/libburn
|
||||
cat CONTRIBUTORS >>"$lone_dir"/CONTRIBUTORS
|
||||
|
||||
# Delete a source module of yet unclear ancestry.
|
||||
# The build process will avoid to use it.
|
||||
rm "$lone_dir"/libburn/crc.c
|
||||
|
||||
|
||||
# To get a common version.h
|
||||
cat version.h.in >> "$lone_dir"/version.h.in
|
||||
|
||||
# Decision about legal situation
|
||||
goto_dir "$current_dir"/libisoburn-develop
|
||||
if test "$create_gnu_xorriso" = "yes"
|
||||
then
|
||||
copy_files xorriso/README_gnu_xorriso "$lone_dir"/README
|
||||
copy_files xorriso/COPYRIGHT_gnu_xorriso "$lone_dir"/COPYRIGHT
|
||||
copy_files xorriso/COPYING_gnu_xorriso "$lone_dir"/COPYING
|
||||
copy_files xorriso/AUTHORS_gnu_xorriso "$lone_dir"/AUTHORS
|
||||
|
||||
# patch xorriso/xorriso.c to be GNU xorriso
|
||||
sed -e's/define Xorriso_libburnia_xorrisO/define Xorriso_GNU_xorrisO/' \
|
||||
-e's/This may be changed to Xorriso_GNU_xorrisO in order to c/C/' \
|
||||
<xorriso/xorriso.h >"$lone_dir"/xorriso/xorriso.h
|
||||
|
||||
else
|
||||
|
||||
copy_files README "$lone_dir"/README
|
||||
|
||||
fi
|
||||
|
||||
|
||||
# tarball
|
||||
|
||||
if test "$with_bootstrap_tarball" = 1
|
||||
then
|
||||
|
||||
tarball_dir="$current_dir"/xorriso-"$xorriso_rev"
|
||||
tarball_dir="$current_dir"/xorriso-"$xorriso_rev""$xorriso_pl"
|
||||
mv "$lone_dir" "$tarball_dir"
|
||||
|
||||
goto_dir "$tarball_dir"
|
||||
@ -230,6 +324,16 @@ rm -r ./autom4te.cache
|
||||
chmod a+rx,go-w,u+w ./configure
|
||||
)
|
||||
|
||||
if test "$create_gnu_xorriso" = "yes"
|
||||
then
|
||||
# ftp-upload@gnu.org rejects Makefile.in with a dangerous chmod on make dist
|
||||
sed -e 's/-perm -777 -exec chmod a+rwx/-perm -755 -exec chmod u+rwx,go+rx/' \
|
||||
< Makefile.in > new_Makefile.in
|
||||
|
||||
mv new_Makefile.in Makefile.in
|
||||
fi
|
||||
|
||||
|
||||
cd "$current_dir"
|
||||
tar czf ./xorriso-"$xorriso_rev""$xorriso_pl".tar.gz $(basename "$tarball_dir")
|
||||
|
||||
|
@ -1,196 +0,0 @@
|
||||
|
||||
# ts A90315 : LIBBURNIA_PKGCONFDIR is defined OS specific in acinclude.m4
|
||||
# was: pkgconfigdir=$(libdir)/pkgconfig
|
||||
pkgconfigdir=$(LIBBURNIA_PKGCONFDIR)
|
||||
|
||||
libincludedir=$(includedir)/libisoburn
|
||||
|
||||
lib_LTLIBRARIES = libisoburn/libisoburn.la libxorriso/libxorriso.la
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
# Build libraries
|
||||
libisoburn_libisoburn_la_LDFLAGS = \
|
||||
-version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
|
||||
libisoburn_libisoburn_la_SOURCES = \
|
||||
libisoburn/burn_wrap.c \
|
||||
libisoburn/data_source.c \
|
||||
libisoburn/isoburn.c \
|
||||
libisoburn/isoburn.h \
|
||||
libisoburn/isofs_wrap.c \
|
||||
libisoburn/libisoburn.h \
|
||||
version.h
|
||||
|
||||
libisoburn_libisoburn_la_LIBADD = \
|
||||
-lisofs \
|
||||
-lburn
|
||||
|
||||
libxorriso_libxorriso_la_LDFLAGS = \
|
||||
-version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
|
||||
libxorriso_libxorriso_la_SOURCES = \
|
||||
xorriso/xorriso.h \
|
||||
xorriso/xorriso_private.h \
|
||||
xorriso/xorriso.c \
|
||||
xorriso/xorrisoburn.h \
|
||||
xorriso/xorrisoburn.c \
|
||||
xorriso/xorriso_timestamp.h \
|
||||
xorriso/xorriso_buildstamp.h \
|
||||
version.h
|
||||
|
||||
libxorriso_libxorriso_la_LIBADD = \
|
||||
-lisofs \
|
||||
-lburn \
|
||||
-lisoburn
|
||||
|
||||
libinclude_HEADERS = \
|
||||
libisoburn/libisoburn.h \
|
||||
xorriso/xorriso.h
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
|
||||
# This is the reference application of libisoburn. See man xorriso/xorriso.1
|
||||
#
|
||||
bin_PROGRAMS = \
|
||||
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_CFLAGS = -DXorriso_with_maiN -DXorriso_without_subS \
|
||||
$(READLINE_DEF) $(LIBACL_DEF) $(XATTR_DEF) \
|
||||
$(EXTF_DEF) $(EXTF_SUID_DEF) $(ZLIB_DEF)
|
||||
|
||||
xorriso_xorriso_LDADD = libisoburn/libisoburn.la -lisofs -lburn \
|
||||
libxorriso/libxorriso.la \
|
||||
$(THREAD_LIBS) $(LIBBURN_ARCH_LIBS)
|
||||
|
||||
xorriso_xorriso_SOURCES = \
|
||||
xorriso/xorriso.h \
|
||||
xorriso/xorriso_private.h \
|
||||
xorriso/xorriso.c \
|
||||
xorriso/xorrisoburn.h \
|
||||
xorriso/xorriso_timestamp.h \
|
||||
xorriso/xorriso_buildstamp.h
|
||||
|
||||
# xorriso/xorrisoburn.c \
|
||||
#
|
||||
|
||||
# Install symbolic links to the xorriso binary
|
||||
#
|
||||
install-exec-hook:
|
||||
if test -e "$(DESTDIR)$(bindir)"/xorrisofs ; then rm "$(DESTDIR)$(bindir)"/xorrisofs ; else echo ; fi
|
||||
ln -s xorriso "$(DESTDIR)$(bindir)"/xorrisofs
|
||||
if test -e "$(DESTDIR)$(bindir)"/osirrox ; then rm "$(DESTDIR)$(bindir)"/osirrox ; else echo ; fi
|
||||
ln -s xorriso "$(DESTDIR)$(bindir)"/osirrox
|
||||
if test -e "$(DESTDIR)$(bindir)"/xorrecord ; then rm "$(DESTDIR)$(bindir)"/xorrecord ; else echo ; fi
|
||||
ln -s xorriso "$(DESTDIR)$(bindir)"/xorrecord
|
||||
|
||||
|
||||
# Alternative to the disabled .PHONY above.
|
||||
# Trying to create a build timestamp file semi-manually: make buildstamped
|
||||
#
|
||||
buildstamp:
|
||||
date -u '+#define Xorriso_build_timestamP "%Y.%m.%d.%H%M%S"' >xorriso/xorriso_buildstamp.h
|
||||
cat xorriso/xorriso_buildstamp.h
|
||||
|
||||
# For now make buildstamped has to be performed explicitely.
|
||||
buildstamped: buildstamp
|
||||
make
|
||||
|
||||
|
||||
|
||||
## Build test applications
|
||||
noinst_PROGRAMS = \
|
||||
test/compare_file
|
||||
|
||||
# A program to compare two files in mirrored trees in mounted filesystems
|
||||
# To compare tree /media/dvd and /original/dir :
|
||||
# find /media/dvd -exec test/compare_file '{}' /media/dvd /original/dir ';'
|
||||
#
|
||||
test_compare_file_CPPFLAGS =
|
||||
test_compare_file_CFLAGS =
|
||||
test_compare_file_LDADD =
|
||||
test_compare_file_SOURCES = test/compare_file.c
|
||||
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
## Build documentation (You need Doxygen for this to work)
|
||||
webhost = http://libburn-api.pykix.org
|
||||
webpath = /
|
||||
docdir = $(DESTDIR)$(prefix)/share/doc/$(PACKAGE)-$(VERSION)
|
||||
|
||||
doc: doc/html
|
||||
|
||||
doc/html: doc/doxygen.conf
|
||||
if [ -f ./doc/doc.lock ]; then \
|
||||
$(RM) -r doc/html; \
|
||||
doxygen doc/doxygen.conf; \
|
||||
fi
|
||||
|
||||
doc-upload: doc/html
|
||||
scp -r $</* $(webhost):$(webpath)
|
||||
|
||||
all: doc
|
||||
|
||||
install-data-local:
|
||||
if [ -f ./doc/doc.lock ]; then \
|
||||
$(mkinstalldirs) $(docdir)/html; \
|
||||
$(INSTALL_DATA) doc/html/* $(docdir)/html; \
|
||||
fi
|
||||
|
||||
uninstall-local:
|
||||
rm -rf $(docdir)
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
# Indent source files
|
||||
indent_files = \
|
||||
$(libisoburn_libisoburn_la_SOURCES)
|
||||
|
||||
|
||||
indent: $(indent_files)
|
||||
indent -bad -bap -nbbb -nbbo -nbc -bli0 -br -bls \
|
||||
-cdw -ce -cli0 -ncs -nbfda -i8 -l79 -lc79 \
|
||||
-lp -saf -sai -nprs -npsl -saw -sob -ss -ut \
|
||||
-sbi0 -nsc -ts8 -npcs -ncdb -fca \
|
||||
$^
|
||||
|
||||
.PHONY: indent
|
||||
|
||||
## ========================================================================= ##
|
||||
|
||||
# Extra things
|
||||
nodist_pkgconfig_DATA = \
|
||||
libisoburn-1.pc
|
||||
|
||||
man_MANS = xorriso/xorriso.1
|
||||
|
||||
EXTRA_DIST = \
|
||||
libisoburn-1.pc.in \
|
||||
version.h.in \
|
||||
doc/comments \
|
||||
doc/doxygen.conf.in \
|
||||
README \
|
||||
AUTHORS \
|
||||
CONTRIBUTORS \
|
||||
COPYRIGHT \
|
||||
COPYING \
|
||||
INSTALL \
|
||||
xorriso/changelog.txt \
|
||||
xorriso/xorriso_buildstamp_none.h \
|
||||
xorriso/README \
|
||||
$(man_MANS)
|
||||
|
759
xorriso/match.c
Normal file
759
xorriso/match.c
Normal file
@ -0,0 +1,759 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains the implementation of functions for pattern matching.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "xorriso.h"
|
||||
#include "xorriso_private.h"
|
||||
#include "xorrisoburn.h"
|
||||
|
||||
|
||||
/* @param flag bit0= do not augment relative structured search by xorriso->wdi
|
||||
bit1= return 2 if bonked at start point by ..
|
||||
(caller then aborts or retries without bit0)
|
||||
bit2= eventually prepend wdx rather than wdi
|
||||
@return <=0 error, 1= ok, 2= with bit1: relative pattern exceeds start point
|
||||
*/
|
||||
int Xorriso_prepare_regex(struct XorrisO *xorriso, char *adr, int flag)
|
||||
{
|
||||
int l,ret,i,count,bonked= 0,is_constant,is_still_relative= 0;
|
||||
char *cpt,*npt,adr_part[2*SfileadrL],absolute_adr[2*SfileadrL],*adr_start,*wd;
|
||||
|
||||
if(flag&4)
|
||||
wd= xorriso->wdx;
|
||||
else
|
||||
wd= xorriso->wdi;
|
||||
|
||||
if(xorriso->search_mode>=2 && xorriso->search_mode<=4) {
|
||||
if(xorriso->search_mode==3 || xorriso->search_mode==4) {
|
||||
l= strlen(adr)+strlen(wd)+1;
|
||||
if(l*2+2>sizeof(xorriso->reg_expr) || l*2+2>sizeof(adr_part)) {
|
||||
sprintf(xorriso->info_text,"Search pattern too long");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
Xorriso_destroy_re(xorriso,0);
|
||||
if(xorriso->structured_search && xorriso->search_mode==3) {
|
||||
if(adr[0]!='/')
|
||||
is_still_relative= 1;
|
||||
if(is_still_relative && !(flag&1)) {
|
||||
/* relative expression : prepend working directory */
|
||||
sprintf(absolute_adr,"%s/%s",wd,adr);
|
||||
adr_start= absolute_adr;
|
||||
xorriso->prepended_wd= 1;
|
||||
is_still_relative= 0;
|
||||
} else
|
||||
adr_start= adr;
|
||||
/* count slashes */;
|
||||
cpt= adr_start;
|
||||
while(*cpt=='/')
|
||||
cpt++;
|
||||
for(i= 0;1;i++) {
|
||||
cpt= strchr(cpt,'/');
|
||||
if(cpt==NULL)
|
||||
break;
|
||||
while(*cpt=='/')
|
||||
cpt++;
|
||||
}
|
||||
count= i+1;
|
||||
xorriso->re= TSOB_FELD(regex_t,count);
|
||||
if(xorriso->re==NULL)
|
||||
return(-1);
|
||||
xorriso->re_constants= TSOB_FELD(char *,count);
|
||||
if(xorriso->re_constants==NULL)
|
||||
return(-1);
|
||||
for(i= 0;i<count;i++)
|
||||
xorriso->re_constants[i]= NULL;
|
||||
xorriso->re_count= count;
|
||||
xorriso->re_fill= 0;
|
||||
|
||||
/* loop over slash chunks*/;
|
||||
cpt= adr_start;
|
||||
xorriso->re_fill= 0;
|
||||
while(*cpt=='/')
|
||||
cpt++;
|
||||
for(i= 0;i<count;i++) {
|
||||
npt= strchr(cpt,'/');
|
||||
if(npt==NULL) {
|
||||
if(strlen(cpt)>=sizeof(adr_part))
|
||||
return(-1);
|
||||
strcpy(adr_part,cpt);
|
||||
} else {
|
||||
if(npt-cpt>=sizeof(adr_part))
|
||||
return(-1);
|
||||
strncpy(adr_part,cpt,npt-cpt);
|
||||
adr_part[npt-cpt]= 0;
|
||||
}
|
||||
|
||||
if(adr_part[0]==0)
|
||||
goto next_adr_part;
|
||||
if(adr_part[0]=='.' && adr_part[1]==0 &&
|
||||
(xorriso->re_fill>0 || i<count-1))
|
||||
goto next_adr_part;
|
||||
if(adr_part[0]=='.' && adr_part[1]=='.' && adr_part[2]==0) {
|
||||
/* delete previous part */
|
||||
if(xorriso->re_fill <= 0) {
|
||||
bonked= 1;
|
||||
goto next_adr_part;
|
||||
}
|
||||
if(xorriso->re_constants[xorriso->re_fill-1]!=NULL) {
|
||||
free(xorriso->re_constants[xorriso->re_fill-1]);
|
||||
xorriso->re_constants[xorriso->re_fill-1]= NULL;
|
||||
} else
|
||||
regfree(&(xorriso->re[xorriso->re_fill-1]));
|
||||
(xorriso->re_fill)--;
|
||||
goto next_adr_part;
|
||||
}
|
||||
if(strcmp(adr_part,"*")==0) {
|
||||
adr_part[0]= 0;
|
||||
ret= 2;
|
||||
} else
|
||||
ret= Xorriso__bourne_to_reg(adr_part,xorriso->reg_expr,0);
|
||||
if(ret==2) {
|
||||
if(Sregex_string(&(xorriso->re_constants[xorriso->re_fill]),adr_part,0)
|
||||
<=0)
|
||||
return(-1);
|
||||
} else {
|
||||
if(regcomp(&(xorriso->re[xorriso->re_fill]),xorriso->reg_expr,0)!=0)
|
||||
goto cannot_compile;
|
||||
}
|
||||
xorriso->re_fill++;
|
||||
next_adr_part:;
|
||||
if(i==count-1)
|
||||
break;
|
||||
cpt= npt+1;
|
||||
while(*cpt=='/')
|
||||
cpt++;
|
||||
}
|
||||
if(bonked) {
|
||||
if(flag&2)
|
||||
return(2);
|
||||
sprintf(xorriso->info_text, "Your '..' bonked at the %s directory.",
|
||||
is_still_relative ? "working" : "root");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE",0);
|
||||
return(0);
|
||||
}
|
||||
|
||||
Xorriso__bourne_to_reg(adr_start,xorriso->reg_expr,0); /* just for show */
|
||||
|
||||
} else {
|
||||
is_constant= 0;
|
||||
if(strcmp(adr,"*")==0 || adr[0]==0) {
|
||||
is_constant= 1;
|
||||
} else if(xorriso->search_mode==3 || xorriso->search_mode==4) {
|
||||
ret= Xorriso__bourne_to_reg(adr,xorriso->reg_expr,0);
|
||||
is_constant= (ret==2);
|
||||
} else {
|
||||
if(strlen(adr)>=sizeof(xorriso->reg_expr))
|
||||
return(-1);
|
||||
strcpy(xorriso->reg_expr,adr);
|
||||
}
|
||||
xorriso->re_count= 0; /* tells matcher that this is not structured */
|
||||
xorriso->re_constants= TSOB_FELD(char *,1);
|
||||
if(xorriso->re_constants==NULL)
|
||||
return(-1);
|
||||
xorriso->re_constants[0]= NULL;
|
||||
if(is_constant) {
|
||||
if(strcmp(adr,"*")==0) {
|
||||
if(Sregex_string(&(xorriso->re_constants[0]),"",0)<=0)
|
||||
return(-1);
|
||||
} else {
|
||||
if(Sregex_string(&(xorriso->re_constants[0]),adr,0)<=0)
|
||||
return(-1);
|
||||
}
|
||||
xorriso->re_fill= 1;
|
||||
} else {
|
||||
xorriso->re= TSOB_FELD(regex_t,1);
|
||||
if(xorriso->re==NULL)
|
||||
return(-1);
|
||||
if(regcomp(&(xorriso->re[0]),xorriso->reg_expr,0)!=0) {
|
||||
cannot_compile:;
|
||||
sprintf(xorriso->info_text, "Cannot compile regular expression : %s",
|
||||
xorriso->reg_expr);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE",0);
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= do not shortcut last component of to_match
|
||||
bit1= consider match if regex matches parent of path
|
||||
bit2= retry beginning at failed last component
|
||||
|
||||
@return 0=match , else no match
|
||||
*/
|
||||
int Xorriso_regexec(struct XorrisO *xorriso, char *to_match, int *failed_at,
|
||||
int flag)
|
||||
{
|
||||
int ret,i,re_start= 0,reg_nomatch= -1;
|
||||
char *cpt,*npt,adr_part[SfileadrL],*mpt;
|
||||
|
||||
reg_nomatch= REG_NOMATCH;
|
||||
|
||||
*failed_at= 0;
|
||||
if(!(xorriso->structured_search && xorriso->re_count>0)) {
|
||||
if(xorriso->re_constants!=NULL)
|
||||
if(xorriso->re_constants[0]!=NULL) {
|
||||
if(xorriso->re_constants[0][0]==0)
|
||||
return(0);
|
||||
if(strcmp(xorriso->re_constants[0],to_match)!=0)
|
||||
return(reg_nomatch);
|
||||
return(0);
|
||||
}
|
||||
ret= regexec(&(xorriso->re[0]),to_match,1,xorriso->match,0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
cpt= to_match;
|
||||
while(*cpt=='/')
|
||||
cpt++;
|
||||
if(flag&4)
|
||||
re_start= xorriso->re_failed_at;
|
||||
if(re_start<0)
|
||||
re_start= 0;
|
||||
for(i= re_start;i<xorriso->re_fill;i++) {
|
||||
*failed_at= i;
|
||||
npt= strchr(cpt,'/');
|
||||
if(npt==NULL) {
|
||||
if(i<xorriso->re_fill-1 && !(flag&1))
|
||||
return(reg_nomatch); /* this must be the last expression part */
|
||||
mpt= cpt;
|
||||
} else {
|
||||
strncpy(adr_part,cpt,npt-cpt);
|
||||
adr_part[npt-cpt]= 0;
|
||||
mpt= adr_part;
|
||||
}
|
||||
if(xorriso->re_constants[i]!=NULL) {
|
||||
if(xorriso->re_constants[i][0]!=0) /* empty constant matches anything */
|
||||
if(strcmp(xorriso->re_constants[i],mpt)!=0)
|
||||
return(reg_nomatch);
|
||||
} else {
|
||||
ret= regexec(&(xorriso->re[i]),mpt,1,xorriso->match,0);
|
||||
if(ret!=0)
|
||||
return(ret);
|
||||
}
|
||||
if(npt==NULL) {
|
||||
if(i>=xorriso->re_fill-1)
|
||||
return(0); /* MATCH */
|
||||
*failed_at= i+1;
|
||||
return(reg_nomatch);
|
||||
}
|
||||
cpt= npt+1;
|
||||
while(*cpt=='/')
|
||||
cpt++;
|
||||
}
|
||||
*failed_at= xorriso->re_fill;
|
||||
if(flag & 2)
|
||||
return(0); /* MATCH */
|
||||
return(reg_nomatch);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_is_in_patternlist(struct XorrisO *xorriso,
|
||||
struct Xorriso_lsT *patternlist, char *path,
|
||||
int flag)
|
||||
{
|
||||
int ret, failed_at, i= 0;
|
||||
struct Xorriso_lsT *s;
|
||||
|
||||
xorriso->search_mode= 3;
|
||||
xorriso->structured_search= 1;
|
||||
|
||||
for(s= patternlist; s != NULL; s= Xorriso_lst_get_next(s, 0)) {
|
||||
ret= Xorriso_prepare_regex(xorriso, Xorriso_lst_get_text(s, 0), 0);
|
||||
if(ret <= 0)
|
||||
return(-1);
|
||||
/* Match path or parent of path */
|
||||
ret= Xorriso_regexec(xorriso, path, &failed_at, 2);
|
||||
if(ret == 0)
|
||||
return(i + 1);
|
||||
i++;
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
char *Xorriso_get_pattern(struct XorrisO *xorriso,
|
||||
struct Xorriso_lsT *patternlist, int index, int flag)
|
||||
{
|
||||
int i= 0;
|
||||
struct Xorriso_lsT *s;
|
||||
|
||||
for(s= patternlist; s != NULL; s= Xorriso_lst_get_next(s, 0)) {
|
||||
if(i == index)
|
||||
return(Xorriso_lst_get_text(s, 0));
|
||||
i++;
|
||||
}
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* @param flag bit2= this is a disk_pattern
|
||||
@return <=0 failure , 1 pattern ok , 2 pattern needed prepended wd */
|
||||
int Xorriso_prepare_expansion_pattern(struct XorrisO *xorriso, char *pattern,
|
||||
int flag)
|
||||
{
|
||||
int ret, prepwd= 0;
|
||||
|
||||
ret= Xorriso_prepare_regex(xorriso, pattern, 1|2|(flag&4));
|
||||
if(ret==2) {
|
||||
ret= Xorriso_prepare_regex(xorriso, pattern, flag&4);
|
||||
prepwd= 1;
|
||||
}
|
||||
if(ret<=0) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Cannot compile pattern to regular expression: %s", pattern);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
return(1+prepwd);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= count results rather than storing them
|
||||
bit1= unexpected change of number is a FATAL event
|
||||
@return <=0 error , 1 is root (end processing) ,
|
||||
2 is not root (go on processing)
|
||||
*/
|
||||
int Xorriso_check_for_root_pattern(struct XorrisO *xorriso,
|
||||
int *filec, char **filev, int count_limit, off_t *mem, int flag)
|
||||
{
|
||||
if(xorriso->re_fill!=0)
|
||||
return(2);
|
||||
/* This is the empty pattern representing root */
|
||||
if(flag&1) {
|
||||
(*filec)++;
|
||||
(*mem)+= 8;
|
||||
} else {
|
||||
if(*filec >= count_limit) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Number of matching files changed unexpectedly (> %d)",
|
||||
count_limit);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
|
||||
(flag&2 ? "FATAL" : "WARNING"), 0);
|
||||
return(flag&2 ? -1 : 0);
|
||||
}
|
||||
filev[*filec]= strdup("/");
|
||||
if(filev[*filec]==NULL) {
|
||||
Xorriso_no_pattern_memory(xorriso, (off_t) 2, 0);
|
||||
return(-1);
|
||||
}
|
||||
(*filec)++;
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= count result rather than storing it
|
||||
bit1= unexpected change of number is a FATAL event
|
||||
*/
|
||||
int Xorriso_register_matched_adr(struct XorrisO *xorriso,
|
||||
char *adr, int count_limit,
|
||||
int *filec, char **filev, off_t *mem, int flag)
|
||||
{
|
||||
int l;
|
||||
|
||||
if(flag&1) {
|
||||
(*filec)++;
|
||||
l= strlen(adr)+1;
|
||||
(*mem)+= sizeof(char *)+l;
|
||||
if(l % sizeof(char *))
|
||||
(*mem)+= sizeof(char *)-(l % sizeof(char *));
|
||||
} else {
|
||||
if(*filec >= count_limit) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Number of matching files changed unexpectedly (> %d)",
|
||||
count_limit);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
|
||||
(flag&2 ? "FATAL" : "WARNING"), 0);
|
||||
return(flag&2 ? -1 : 0);
|
||||
}
|
||||
filev[*filec]= strdup(adr);
|
||||
if(filev[*filec]==NULL) {
|
||||
Xorriso_no_pattern_memory(xorriso, (off_t) (strlen(adr)+1), 0);
|
||||
return(-1);
|
||||
}
|
||||
(*filec)++;
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= count results rather than storing them
|
||||
bit1= this is a recursion
|
||||
bit2= prepend wd (automatically done if wd[0]!=0)
|
||||
@return <=0 error , 1 ok , 2 could not open directory
|
||||
*/
|
||||
int Xorriso_obtain_pattern_files_x(
|
||||
struct XorrisO *xorriso, char *wd, char *dir_adr,
|
||||
int *filec, char **filev, int count_limit, off_t *mem,
|
||||
int *dive_count, int flag)
|
||||
{
|
||||
int ret, failed_at, follow_mount, follow_links;
|
||||
struct DirseQ *dirseq= NULL;
|
||||
struct stat stbuf;
|
||||
dev_t dir_dev;
|
||||
char *path;
|
||||
char *adr= NULL, *name= NULL, *path_data= NULL;
|
||||
|
||||
adr= malloc(SfileadrL);
|
||||
name= malloc(SfileadrL);
|
||||
path_data= malloc(SfileadrL);
|
||||
if(adr==NULL || name==NULL || path_data==NULL) {
|
||||
Xorriso_no_malloc_memory(xorriso, &adr, 0);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
follow_mount= (xorriso->do_follow_mount || xorriso->do_follow_pattern);
|
||||
follow_links= (xorriso->do_follow_links || xorriso->do_follow_pattern);
|
||||
if(!(flag&2))
|
||||
*dive_count= 0;
|
||||
else
|
||||
(*dive_count)++;
|
||||
|
||||
ret= Xorriso_check_for_root_pattern(xorriso, filec, filev, count_limit,
|
||||
mem, flag&1);
|
||||
if(ret!=2)
|
||||
goto ex;
|
||||
|
||||
if(lstat(dir_adr, &stbuf)==-1)
|
||||
{ret= 2; goto ex;}
|
||||
dir_dev= stbuf.st_dev;
|
||||
if(S_ISLNK(stbuf.st_mode)) {
|
||||
if(stat(dir_adr, &stbuf)==-1)
|
||||
{ret= 2; goto ex;}
|
||||
if(dir_dev != stbuf.st_dev && !follow_mount)
|
||||
{ret= 2; goto ex;}
|
||||
}
|
||||
ret= Dirseq_new(&dirseq, dir_adr, 1);
|
||||
if(ret<0) {
|
||||
sprintf(xorriso->info_text, "Cannot obtain disk directory iterator");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
if(ret==0)
|
||||
{ret= 2; goto ex;}
|
||||
|
||||
while(1) {
|
||||
ret= Dirseq_next_adr(dirseq,name,0);
|
||||
if(ret==0)
|
||||
break;
|
||||
if(ret<0) {
|
||||
sprintf(xorriso->info_text,"Failed to obtain next directory entry");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
|
||||
ret= Xorriso_make_abs_adr(xorriso, wd, name, adr, flag&4);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
|
||||
ret= Xorriso_regexec(xorriso, adr, &failed_at, 1);
|
||||
if(ret>0) { /* no match */
|
||||
if(failed_at <= *dive_count) /* no hope for a match */
|
||||
continue;
|
||||
path= adr;
|
||||
if(adr[0]!='/') {
|
||||
path= path_data;
|
||||
ret= Xorriso_make_abs_adr(xorriso, xorriso->wdx, adr, path, 1|4);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
}
|
||||
|
||||
if(follow_links)
|
||||
ret= stat(path,&stbuf);
|
||||
else
|
||||
ret= lstat(path,&stbuf);
|
||||
if(ret==-1)
|
||||
continue;
|
||||
if(!S_ISDIR(stbuf.st_mode))
|
||||
continue;
|
||||
if(dir_dev != stbuf.st_dev && !follow_mount)
|
||||
continue;
|
||||
|
||||
/* dive deeper */
|
||||
ret= Xorriso_obtain_pattern_files_x(xorriso, adr, path,
|
||||
filec, filev, count_limit, mem, dive_count, flag|2);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
} else {
|
||||
ret= Xorriso_register_matched_adr(xorriso, adr, count_limit,
|
||||
filec, filev, mem, flag&1);
|
||||
if(ret<0)
|
||||
goto ex;
|
||||
if(ret==0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(adr!=NULL)
|
||||
free(adr);
|
||||
if(name!=NULL)
|
||||
free(name);
|
||||
if(path_data!=NULL)
|
||||
free(path_data);
|
||||
Dirseq_destroy(&dirseq,0);
|
||||
if(flag&2)
|
||||
(*dive_count)--;
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_eval_nonmatch(struct XorrisO *xorriso, char *pattern,
|
||||
int *nonconst_mismatches, off_t *mem, int flag)
|
||||
{
|
||||
int k,l;
|
||||
|
||||
/* Is this a constant pattern ? */
|
||||
for(k= 0; k<xorriso->re_fill; k++) {
|
||||
if(xorriso->re_constants[k]==NULL)
|
||||
break;
|
||||
if(xorriso->re_constants[k][0]==0)
|
||||
break;
|
||||
}
|
||||
if(k<xorriso->re_fill)
|
||||
(*nonconst_mismatches)++; /* it is not */
|
||||
|
||||
l= strlen(pattern)+1;
|
||||
(*mem)+= sizeof(char *)+l;
|
||||
if(l % sizeof(char *))
|
||||
(*mem)+= sizeof(char *)-(l % sizeof(char *));
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= a match count !=1 is a SORRY event
|
||||
bit1= a match count !=1 is a FAILURE event
|
||||
*/
|
||||
int Xorriso_check_matchcount(struct XorrisO *xorriso,
|
||||
int count, int nonconst_mismatches, int num_patterns,
|
||||
char **patterns, int flag)
|
||||
{
|
||||
char sfe[5*SfileadrL];
|
||||
|
||||
if((flag&1) && (count!=1 || nonconst_mismatches)){
|
||||
if(count-nonconst_mismatches>0)
|
||||
sprintf(xorriso->info_text,
|
||||
"Pattern match with more than one file object");
|
||||
else
|
||||
sprintf(xorriso->info_text, "No pattern match with any file object");
|
||||
if(num_patterns==1)
|
||||
sprintf(xorriso->info_text+strlen(xorriso->info_text), ": %s",
|
||||
Text_shellsafe(patterns[0], sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
|
||||
(flag&2 ? "FAILURE" : "SORRY"), 0);
|
||||
return(0);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_no_pattern_memory(struct XorrisO *xorriso, off_t mem, int flag)
|
||||
{
|
||||
char mem_text[80];
|
||||
|
||||
Sfile_scale((double) mem, mem_text,5,1e4,1);
|
||||
sprintf(xorriso->info_text,
|
||||
"Cannot allocate enough memory (%s) for pattern expansion",
|
||||
mem_text);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_alloc_pattern_mem(struct XorrisO *xorriso, off_t mem,
|
||||
int count, char ***filev, int flag)
|
||||
{
|
||||
char mem_text[80], limit_text[80];
|
||||
|
||||
Sfile_scale((double) mem, mem_text,5,1e4,0);
|
||||
sprintf(xorriso->info_text,
|
||||
"Temporary memory needed for pattern expansion : %s", mem_text);
|
||||
if(!(flag&1))
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0);
|
||||
if(mem > xorriso->temp_mem_limit) {
|
||||
Sfile_scale((double) xorriso->temp_mem_limit, limit_text,5,1e4,1);
|
||||
sprintf(xorriso->info_text,
|
||||
"List of matching file addresses exceeds -temp_mem_limit (%s > %s)",
|
||||
mem_text, limit_text);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(0);
|
||||
}
|
||||
|
||||
(*filev)= (char **) calloc(count, sizeof(char *));
|
||||
if(*filev==NULL) {
|
||||
Xorriso_no_pattern_memory(xorriso, mem, 0);
|
||||
return(-1);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= a match count !=1 is a FAILURE event
|
||||
bit1= with bit0 tolerate 0 matches if pattern is a constant
|
||||
*/
|
||||
int Xorriso_expand_disk_pattern(struct XorrisO *xorriso,
|
||||
int num_patterns, char **patterns, int extra_filec,
|
||||
int *filec, char ***filev, off_t *mem, int flag)
|
||||
{
|
||||
int ret, count= 0, abs_adr= 0, i, was_count, was_filec;
|
||||
int nonconst_mismatches= 0, dive_count= 0;
|
||||
char sfe[5*SfileadrL], dir_adr[SfileadrL];
|
||||
|
||||
*filec= 0;
|
||||
*filev= NULL;
|
||||
|
||||
xorriso->search_mode= 3;
|
||||
xorriso->structured_search= 1;
|
||||
|
||||
for(i= 0; i<num_patterns; i++) {
|
||||
|
||||
ret= Xorriso_prepare_expansion_pattern(xorriso, patterns[i], 4);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
if(ret==2)
|
||||
abs_adr= 4;
|
||||
|
||||
if(patterns[i][0]=='/' || abs_adr) {
|
||||
strcpy(dir_adr, "/");
|
||||
abs_adr= 4;
|
||||
} else {
|
||||
strcpy(dir_adr, xorriso->wdx);
|
||||
if(dir_adr[0]==0)
|
||||
strcpy(dir_adr, "/");
|
||||
ret= Sfile_type(dir_adr, 1|4);
|
||||
if(ret!=2) {
|
||||
Xorriso_msgs_submit(xorriso, 0, dir_adr, 0, "ERRFILE", 0);
|
||||
sprintf(xorriso->info_text,
|
||||
"Address set by -cdx is not a directory: %s",
|
||||
Text_shellsafe(dir_adr, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
}
|
||||
|
||||
/* count the matches */
|
||||
was_count= count;
|
||||
ret= Xorriso_obtain_pattern_files_x(xorriso, "", dir_adr, &count, NULL, 0,
|
||||
mem, &dive_count, 1 | abs_adr);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
if(was_count==count && strcmp(patterns[i],"*")!=0 && (flag&3)!=1) {
|
||||
count++;
|
||||
ret= Xorriso_eval_nonmatch(xorriso, patterns[i],
|
||||
&nonconst_mismatches, mem, 0);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
|
||||
ret= Xorriso_check_matchcount(xorriso, count, nonconst_mismatches,
|
||||
num_patterns, patterns, (flag&1)|2);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
|
||||
count+= extra_filec;
|
||||
mem+= extra_filec*sizeof(char *);
|
||||
|
||||
if(count<=0)
|
||||
{ret= 0; goto ex;}
|
||||
|
||||
ret= Xorriso_alloc_pattern_mem(xorriso, *mem, count, filev, 0);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
|
||||
/* now store addresses */
|
||||
for(i= 0; i<num_patterns; i++) {
|
||||
|
||||
ret= Xorriso_prepare_expansion_pattern(xorriso, patterns[i], 4);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
|
||||
if(patterns[i][0]=='/' || abs_adr) {
|
||||
strcpy(dir_adr, "/");
|
||||
abs_adr= 4;
|
||||
} else {
|
||||
strcpy(dir_adr, xorriso->wdx);
|
||||
if(dir_adr[0]==0)
|
||||
strcpy(dir_adr, "/");
|
||||
}
|
||||
|
||||
was_filec= *filec;
|
||||
ret= Xorriso_obtain_pattern_files_x(xorriso, "", dir_adr, filec, *filev,
|
||||
count, mem, &dive_count, abs_adr);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
|
||||
if(was_filec == *filec && strcmp(patterns[i],"*")!=0) {
|
||||
(*filev)[*filec]= strdup(patterns[i]);
|
||||
if((*filev)[*filec]==NULL) {
|
||||
(*mem)= strlen(patterns[i])+1;
|
||||
Xorriso_no_pattern_memory(xorriso, *mem, 0);
|
||||
ret= -1; goto ex;
|
||||
}
|
||||
(*filec)++;
|
||||
}
|
||||
}
|
||||
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(ret<=0) {
|
||||
if(filev!=NULL)
|
||||
Sfile_destroy_argv(&count, filev, 0);
|
||||
*filec= 0;
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= command without pattern capability
|
||||
bit1= disk_pattern rather than iso_rr_pattern
|
||||
*/
|
||||
int Xorriso_warn_of_wildcards(struct XorrisO *xorriso, char *path, int flag)
|
||||
{
|
||||
if(strchr(path,'*')!=NULL || strchr(path,'?')!=NULL ||
|
||||
strchr(path,'[')!=NULL) {
|
||||
if(flag&1) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Pattern expansion of wildcards \"*?[\" does not apply to this command");
|
||||
} else {
|
||||
sprintf(xorriso->info_text,
|
||||
"Pattern expansion of wildcards \"*?[\" is disabled by command %s",
|
||||
(flag&2) ? "-disk_pattern or -pathspecs" : "-iso_rr_pattern");
|
||||
}
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 0);
|
||||
sprintf(xorriso->info_text,"Pattern seen: %s\n", path);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 0);
|
||||
return(1);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
74
xorriso/match.h
Normal file
74
xorriso/match.h
Normal file
@ -0,0 +1,74 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains the implementation of functions for pattern matching.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_match_includeD
|
||||
#define Xorriso_pvt_match_includeD yes
|
||||
|
||||
|
||||
int Xorriso_prepare_regex(struct XorrisO *xorriso, char *adr, int flag);
|
||||
|
||||
/* @return 0=match , else no match
|
||||
*/
|
||||
int Xorriso_regexec(struct XorrisO *xorriso, char *to_match, int *failed_at,
|
||||
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 Xorriso_prepare_expansion_pattern(struct XorrisO *xorriso, char *pattern,
|
||||
int flag);
|
||||
|
||||
/* @param flag bit0= count results rather than storing them
|
||||
@return <=0 error , 1 is root (end processing) ,
|
||||
2 is not root (go on processing)
|
||||
*/
|
||||
int Xorriso_check_for_root_pattern(struct XorrisO *xorriso,
|
||||
int *filec, char **filev, int count_limit, off_t *mem, int flag);
|
||||
|
||||
/* @param flag bit0= count result rather than storing it
|
||||
bit1= unexpected change of number is a FATAL event
|
||||
*/
|
||||
int Xorriso_register_matched_adr(struct XorrisO *xorriso,
|
||||
char *adr, int count_limit,
|
||||
int *filec, char **filev, off_t *mem, int flag);
|
||||
|
||||
int Xorriso_eval_nonmatch(struct XorrisO *xorriso, char *pattern,
|
||||
int *nonconst_mismatches, off_t *mem, int flag);
|
||||
|
||||
/* @param flag bit0= a match count !=1 is a SORRY event
|
||||
*/
|
||||
int Xorriso_check_matchcount(struct XorrisO *xorriso,
|
||||
int count, int nonconst_mismatches, int num_patterns,
|
||||
char **patterns, int flag);
|
||||
|
||||
int Xorriso_no_pattern_memory(struct XorrisO *xorriso, off_t mem, int flag);
|
||||
|
||||
int Xorriso_alloc_pattern_mem(struct XorrisO *xorriso, off_t mem,
|
||||
int count, char ***filev, int flag);
|
||||
|
||||
/* @param flag bit0= command without pattern capability
|
||||
bit1= disk_pattern rather than iso_rr_pattern
|
||||
*/
|
||||
int Xorriso_warn_of_wildcards(struct XorrisO *xorriso, char *path, int flag);
|
||||
|
||||
/* @param flag bit0= a match count !=1 is a FAILURE event
|
||||
bit1= with bit0 tolerate 0 matches if pattern is a constant
|
||||
*/
|
||||
int Xorriso_expand_disk_pattern(struct XorrisO *xorriso,
|
||||
int num_patterns, char **patterns, int extra_filec,
|
||||
int *filec, char ***filev, off_t *mem, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_match_includeD */
|
||||
|
1211
xorriso/misc_funct.c
Normal file
1211
xorriso/misc_funct.c
Normal file
File diff suppressed because it is too large
Load Diff
94
xorriso/misc_funct.h
Normal file
94
xorriso/misc_funct.h
Normal file
@ -0,0 +1,94 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of cellaneous helper functions of xorriso.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_misc_includeD
|
||||
#define Xorriso_pvt_misc_includeD yes
|
||||
|
||||
#include <regex.h>
|
||||
|
||||
|
||||
char *Text_shellsafe(char *in_text, char *out_text, int flag);
|
||||
|
||||
int Sort_argv(int argc, char **argv, int flag);
|
||||
|
||||
/* @param flag bit0= single letters */
|
||||
char *Ftypetxt(mode_t st_mode, int flag);
|
||||
|
||||
/* @param flag bit0=with year and seconds
|
||||
bit1=timestamp format YYYY.MM.DD.hhmmss
|
||||
*/
|
||||
char *Ftimetxt(time_t t, char timetext[40], int flag);
|
||||
|
||||
int System_uname(char **sysname, char **release, char **version,
|
||||
char **machine, int flag);
|
||||
|
||||
/** Convert a text into a number of type double and multiply it by unit code
|
||||
[kmgtpe] (2^10 to 2^60) or [s] (2048). (Also accepts capital letters.)
|
||||
@param text Input like "42", "2k", "3.14m" or "-1g"
|
||||
@param flag Bitfield for control purposes:
|
||||
bit0= return -1 rathern than 0 on failure
|
||||
@return The derived double value
|
||||
*/
|
||||
double Scanf_io_size(char *text, int flag);
|
||||
|
||||
/*
|
||||
@flag bit0= do not initialize *diff_count
|
||||
@return <0 error , 0 = mismatch , 1 = match
|
||||
*/
|
||||
int Compare_text_lines(char *text1, char *text2, int *diff_count, int flag);
|
||||
|
||||
time_t Decode_timestring(char *code, time_t *date, int flag);
|
||||
|
||||
int Decode_ecma119_format(struct tm *erg, char *text, int flag);
|
||||
|
||||
int Wait_for_input(int fd, int microsec, int flag);
|
||||
|
||||
int Fileliste__target_source_limit(char *line, char sep, char **limit_pt,
|
||||
int flag);
|
||||
|
||||
int Hex_to_bin(char *hex,
|
||||
int bin_size, int *bin_count, unsigned char *bin_data, 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);
|
||||
|
||||
/*
|
||||
vars[][0] points to the variable names, vars[][1] to their contents.
|
||||
start marks the begin of variable names. It must be non-empty. esc before
|
||||
start disables this meaning. start and esc may be equal but else they must
|
||||
have disjoint character sets.
|
||||
end marks the end of a variable name. It may be empty but if non-empty it
|
||||
must not appear in vars[][0].
|
||||
@param flag bit0= Substitute unknown variables by empty text
|
||||
(else copy start,name,end unaltered to result).
|
||||
Parameter end must be non-empty for that.
|
||||
*/
|
||||
int Sregex_resolve_var(char *form, char *vars[][2], int num_vars,
|
||||
char *start, char *end, char *esc,
|
||||
char *result, int result_size, int flag);
|
||||
|
||||
/* reg_expr should be twice as large as bourne_expr ( + 2 to be exact) */
|
||||
/* return: 2= bourne_expr is surely a constant */
|
||||
int Xorriso__bourne_to_reg(char bourne_expr[], char reg_expr[], int flag);
|
||||
|
||||
|
||||
int Xorriso__hide_mode(char *mode, int flag);
|
||||
|
||||
char *Xorriso__hide_mode_text(int hide_mode, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_misc_includeD */
|
||||
|
1949
xorriso/opts_a_c.c
Normal file
1949
xorriso/opts_a_c.c
Normal file
File diff suppressed because it is too large
Load Diff
1927
xorriso/opts_d_h.c
Normal file
1927
xorriso/opts_d_h.c
Normal file
File diff suppressed because it is too large
Load Diff
1229
xorriso/opts_i_o.c
Normal file
1229
xorriso/opts_i_o.c
Normal file
File diff suppressed because it is too large
Load Diff
1784
xorriso/opts_p_z.c
Normal file
1784
xorriso/opts_p_z.c
Normal file
File diff suppressed because it is too large
Load Diff
2233
xorriso/parse_exec.c
Normal file
2233
xorriso/parse_exec.c
Normal file
File diff suppressed because it is too large
Load Diff
92
xorriso/parse_exec.h
Normal file
92
xorriso/parse_exec.h
Normal file
@ -0,0 +1,92 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which deal with parsing
|
||||
and interpretation of command input.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_cmd_includeD
|
||||
#define Xorriso_pvt_cmd_includeD yes
|
||||
|
||||
|
||||
/* @param flag bit0= do not warn of wildcards
|
||||
bit1= these are disk_paths
|
||||
*/
|
||||
int Xorriso_end_idx(struct XorrisO *xorriso,
|
||||
int argc, char **argv, int idx, int flag);
|
||||
|
||||
int Xorriso_opt_args(struct XorrisO *xorriso, char *cmd,
|
||||
int argc, char **argv, int idx,
|
||||
int *end_idx, int *optc, char ***optv, int flag);
|
||||
|
||||
int Xorriso_get_problem_status(struct XorrisO *xorriso, char severity[80],
|
||||
int flag);
|
||||
|
||||
int Xorriso_set_problem_status(struct XorrisO *xorriso, char *severity,
|
||||
int flag);
|
||||
|
||||
/**
|
||||
@param flag bit0= do not issue own event messages
|
||||
bit1= take xorriso->request_to_abort as reason for abort
|
||||
@return Gives the advice:
|
||||
2= pardon was given, go on
|
||||
1= no problem, go on
|
||||
0= function failed but xorriso would not abort, go on
|
||||
<0= do abort
|
||||
-1 = due to problem_status
|
||||
-2 = due to xorriso->request_to_abort
|
||||
*/
|
||||
int Xorriso_eval_problem_status(struct XorrisO *xorriso, int ret, int flag);
|
||||
|
||||
int Xorriso_cpmv_args(struct XorrisO *xorriso, char *cmd,
|
||||
int argc, char **argv, int *idx,
|
||||
int *optc, char ***optv, char eff_dest[SfileadrL],
|
||||
int flag);
|
||||
|
||||
/* @param flag bit0= with adr_mode sbsector: adr_value is possibly 16 too high
|
||||
*/
|
||||
int Xorriso_decode_load_adr(struct XorrisO *xorriso, char *cmd,
|
||||
char *adr_mode, char *adr_value,
|
||||
int *entity_code, char entity_id[81],
|
||||
int flag);
|
||||
|
||||
int Xorriso_check_name_len(struct XorrisO *xorriso, char *name, int size,
|
||||
char *cmd, int flag);
|
||||
|
||||
/* @param flag bit0= prepend wd only if name does not begin by '/'
|
||||
bit2= prepend wd (automatically done if wd[0]!=0)
|
||||
*/
|
||||
int Xorriso_make_abs_adr(struct XorrisO *xorriso, char *wd, char *name,
|
||||
char adr[], int flag);
|
||||
|
||||
/* @param flag bit0= do not complain in case of error, but set info_text */
|
||||
int Xorriso_convert_datestring(struct XorrisO *xorriso, char *cmd,
|
||||
char *time_type, char *timestring,
|
||||
int *t_type, time_t *t, int flag);
|
||||
|
||||
int Xorriso_check_temp_mem_limit(struct XorrisO *xorriso, off_t mem, 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_path_is_excluded(struct XorrisO *xorriso, char *path, int flag);
|
||||
|
||||
int Xorriso_path_is_hidden(struct XorrisO *xorriso, char *path, int flag);
|
||||
|
||||
|
||||
/* Normalize ACL and sort apart "access" ACL from "default" ACL.
|
||||
*/
|
||||
int Xorriso_normalize_acl_text(struct XorrisO *xorriso, char *in_text,
|
||||
char **access_acl_text, char **default_acl_text, int flag);
|
||||
|
||||
int Xorriso_read_mkisofsrc(struct XorrisO *xorriso, int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_cmd_includeD */
|
||||
|
2015
xorriso/read_run.c
Normal file
2015
xorriso/read_run.c
Normal file
File diff suppressed because it is too large
Load Diff
70
xorriso/read_run.h
Normal file
70
xorriso/read_run.h
Normal file
@ -0,0 +1,70 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_read_run_includeD
|
||||
#define Xorriso_pvt_read_run_includeD yes
|
||||
|
||||
|
||||
int Xorriso__read_pacifier(IsoImage *image, IsoFileSource *filesource);
|
||||
|
||||
int Xorriso_restore_properties(struct XorrisO *xorriso, char *disk_path,
|
||||
IsoNode *node, int flag);
|
||||
|
||||
int Xorriso_restore_implicit_properties(struct XorrisO *xorriso,
|
||||
char *full_disk_path, char *disk_path, char *full_img_path, int flag);
|
||||
|
||||
int Xorriso_tree_restore_node(struct XorrisO *xorriso, IsoNode *node,
|
||||
char *img_path, off_t img_offset,
|
||||
char *disk_path, off_t disk_offset, off_t bytes,
|
||||
int flag);
|
||||
|
||||
int Xorriso_restore_overwrite(struct XorrisO *xorriso,
|
||||
IsoNode *node, char *img_path,
|
||||
char *path, char *nominal_path,
|
||||
struct stat *stbuf, int flag);
|
||||
|
||||
int Xorriso_restore_target_hl(struct XorrisO *xorriso, IsoNode *node,
|
||||
char *disk_path, int *node_idx, int flag);
|
||||
|
||||
int Xorriso_restore_prefix_hl(struct XorrisO *xorriso, IsoNode *node,
|
||||
char *disk_path, int node_idx, int flag);
|
||||
|
||||
int Xorriso_register_node_target(struct XorrisO *xorriso, int node_idx,
|
||||
char *disk_path, int flag);
|
||||
|
||||
int Xorriso_restore_disk_object(struct XorrisO *xorriso,
|
||||
char *img_path, IsoNode *node,
|
||||
char *disk_path,
|
||||
off_t offset, off_t bytes, int flag);
|
||||
|
||||
int Xorriso_handle_collision(struct XorrisO *xorriso,
|
||||
IsoNode *node, char *img_path,
|
||||
char *disk_path, char *nominal_disk_path,
|
||||
int *stbuf_ret, int flag);
|
||||
|
||||
int Xorriso_restore_tree(struct XorrisO *xorriso, IsoDir *dir,
|
||||
char *img_dir_path, char *disk_dir_path,
|
||||
off_t boss_mem,
|
||||
struct LinkiteM *link_stack, int flag);
|
||||
|
||||
int Xorriso_read_file_data(struct XorrisO *xorriso, IsoNode *node,
|
||||
char *img_path, char *disk_path,
|
||||
off_t img_offset, off_t disk_offset,
|
||||
off_t bytes, int flag);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_read_run_includeD */
|
||||
|
881
xorriso/sfile.c
Normal file
881
xorriso/sfile.c
Normal file
@ -0,0 +1,881 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains the implementation of functions around files and strings.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <pwd.h>
|
||||
#include <grp.h>
|
||||
|
||||
|
||||
#include "sfile.h"
|
||||
|
||||
|
||||
/* @param flag bit0= do not clip off carriage return at line end
|
||||
*/
|
||||
char *Sfile_fgets_n(char *line, int maxl, FILE *fp, int flag)
|
||||
{
|
||||
int l;
|
||||
char *ret;
|
||||
|
||||
ret= fgets(line,maxl,fp);
|
||||
if(ret==NULL)
|
||||
return(NULL);
|
||||
l= strlen(line);
|
||||
if(l > 0 && !(flag & 1)) if(line[l-1] == '\r') line[--l]= 0;
|
||||
if(l > 0) if(line[l-1] == '\n') line[--l]= 0;
|
||||
if(l > 0 && !(flag & 1)) if(line[l-1] == '\r') line[--l]= 0;
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_count_components(char *path, int flag)
|
||||
/*
|
||||
bit0= do not ignore trailing slash
|
||||
bit1= do not ignore empty components (other than the empty root name)
|
||||
*/
|
||||
{
|
||||
int l,count= 0;
|
||||
char *cpt;
|
||||
|
||||
l= strlen(path);
|
||||
if(l==0)
|
||||
return(0);
|
||||
count= 1;
|
||||
for(cpt= path+l-1;cpt>=path;cpt--) {
|
||||
if(*cpt=='/') {
|
||||
if(*(cpt+1)==0 && !(flag&1))
|
||||
continue;
|
||||
if(*(cpt+1)=='/' && !(flag&2))
|
||||
continue;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
return(count);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_component_pointer(char *path, char **sourcept, int idx, int flag)
|
||||
/*
|
||||
bit0= do not ignore trailing slash
|
||||
bit1= do not ignore empty components (other than the empty root name)
|
||||
bit2= accept 0 as '/'
|
||||
*/
|
||||
{
|
||||
int count= 0;
|
||||
char *spt;
|
||||
|
||||
for(spt= path;*spt!=0 || (flag&4);spt++) {
|
||||
if(count>=idx) {
|
||||
*sourcept= spt;
|
||||
return(1);
|
||||
}
|
||||
if(*spt=='/' || *spt==0) {
|
||||
if(*(spt+1)=='/' && !(flag&2))
|
||||
continue;
|
||||
if(*(spt+1)==0 && !(flag&1))
|
||||
continue;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
if((flag&1) && count>=idx)
|
||||
return(1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_leafname(char *path, char leafname[SfileadrL], int flag)
|
||||
{
|
||||
int count, ret;
|
||||
char *lpt;
|
||||
|
||||
leafname[0]= 0;
|
||||
count= Sfile_count_components(path, 0);
|
||||
if(count==0)
|
||||
return(0);
|
||||
ret= Sfile_component_pointer(path, &lpt, count-1, 0);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
if(Sfile_str(leafname, lpt, 0)<=0)
|
||||
return(0);
|
||||
lpt= strchr(leafname, '/');
|
||||
if(lpt!=NULL)
|
||||
*lpt= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_add_to_path(char path[SfileadrL], char *addon, int flag)
|
||||
{
|
||||
int l;
|
||||
|
||||
l= strlen(path);
|
||||
if(l+1>=SfileadrL)
|
||||
return(0);
|
||||
if(l==0) {
|
||||
strcpy(path,"/");
|
||||
l= 1;
|
||||
} else if(path[l-1]!='/') {
|
||||
path[l++]= '/';
|
||||
path[l]= 0;
|
||||
}
|
||||
if(l+strlen(addon)>=SfileadrL)
|
||||
return(0);
|
||||
if(addon[0]=='/')
|
||||
strcpy(path+l,addon+1);
|
||||
else
|
||||
strcpy(path+l,addon);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_prepend_path(char *prefix, char path[SfileadrL], int flag)
|
||||
{
|
||||
int l, i;
|
||||
|
||||
l= strlen(path)+strlen(prefix)+1;
|
||||
if(l>=SfileadrL) {
|
||||
|
||||
#ifdef Not_yeT
|
||||
/* >>> ??? how to transport messages to xorriso ? */
|
||||
sprintf(xorriso->info_text,
|
||||
"Combination of wd and relative address too long (%d > %d)",
|
||||
l,SfileadrL-1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
#endif
|
||||
|
||||
return(-1);
|
||||
}
|
||||
l-= strlen(path);
|
||||
for(i= strlen(path)+1; i>=0; i--)
|
||||
path[i+l]= path[i];
|
||||
strcpy(path,prefix);
|
||||
path[l-1]= '/';
|
||||
return(1);
|
||||
}
|
||||
|
||||
int Sfile_being_group_member(struct stat *stbuf, int flag)
|
||||
{
|
||||
int i, suppl_groups;
|
||||
gid_t *suppl_glist;
|
||||
|
||||
if (getegid()==stbuf->st_gid)
|
||||
return(1);
|
||||
suppl_groups= getgroups(0, NULL);
|
||||
suppl_glist= (gid_t *) malloc((suppl_groups + 1) * sizeof(gid_t));
|
||||
if (suppl_glist==NULL)
|
||||
return(-1);
|
||||
suppl_groups= getgroups(suppl_groups+1,suppl_glist);
|
||||
for (i= 0; i<suppl_groups; i++) {
|
||||
if (suppl_glist[i]==stbuf->st_gid) {
|
||||
free((char *) suppl_glist);
|
||||
return(1);
|
||||
}
|
||||
}
|
||||
free((char *) suppl_glist);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_type(char *filename, int flag)
|
||||
/*
|
||||
bit0= return -1 if file is missing
|
||||
bit1= return a hardlink with siblings as type 5
|
||||
bit2= evaluate eventual link target rather than the link object itself
|
||||
bit3= return a socket or a char device as types 7 or 8 rather than 0
|
||||
*/
|
||||
/*
|
||||
return:
|
||||
0=unknown
|
||||
1=regular
|
||||
2=directory
|
||||
3=symbolic link
|
||||
4=named pipe
|
||||
5=multiple hardlink (with bit1)
|
||||
6=block device
|
||||
7=socket (with bit3)
|
||||
8=character device (with bit3)
|
||||
*/
|
||||
{
|
||||
struct stat stbuf;
|
||||
if(flag&4) {
|
||||
if(stat(filename,&stbuf)==-1) {
|
||||
if(flag&1) return(-1);
|
||||
else return(0);
|
||||
}
|
||||
} else {
|
||||
if(lstat(filename,&stbuf)==-1) {
|
||||
if(flag&1) return(-1);
|
||||
else return(0);
|
||||
}
|
||||
}
|
||||
if(S_ISREG(stbuf.st_mode)) {
|
||||
if(flag&2)
|
||||
if(stbuf.st_nlink>1)
|
||||
return(5);
|
||||
return(1);
|
||||
}
|
||||
if(S_ISDIR(stbuf.st_mode))
|
||||
return(2);
|
||||
if((stbuf.st_mode&S_IFMT)==S_IFLNK)
|
||||
return(3);
|
||||
if(S_ISFIFO(stbuf.st_mode))
|
||||
return(4);
|
||||
if(S_ISBLK(stbuf.st_mode))
|
||||
return(6);
|
||||
if(flag&8)
|
||||
if((stbuf.st_mode&S_IFMT)==S_IFSOCK)
|
||||
return(7);
|
||||
if(flag&8)
|
||||
if(S_ISCHR(stbuf.st_mode))
|
||||
return(8);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
char *Sfile_datestr(time_t tim, short int flag)
|
||||
/*
|
||||
bit0=with hours+minutes
|
||||
bit1=with seconds
|
||||
|
||||
bit8= local time rather than UTC
|
||||
*/
|
||||
{
|
||||
static char zeitcode[80]={"000000"};
|
||||
char puff[80];
|
||||
struct tm *azt;
|
||||
|
||||
if(flag&256)
|
||||
azt = localtime(&tim);
|
||||
else
|
||||
azt = gmtime(&tim);
|
||||
|
||||
if(azt->tm_year>99)
|
||||
sprintf(zeitcode,"%c%1.1d%2.2d%2.2d",
|
||||
'A'+(azt->tm_year-100)/10,azt->tm_year%10,
|
||||
azt->tm_mon+1,azt->tm_mday);
|
||||
else
|
||||
sprintf(zeitcode,"%2.2d%2.2d%2.2d",
|
||||
azt->tm_year,azt->tm_mon+1,azt->tm_mday);
|
||||
if(flag&1){
|
||||
sprintf(puff,".%2.2d%2.2d",azt->tm_hour,azt->tm_min);
|
||||
strcat(zeitcode,puff);
|
||||
}
|
||||
if(flag&2){
|
||||
sprintf(puff,"%2.2d",azt->tm_sec);
|
||||
strcat(zeitcode,puff);
|
||||
}
|
||||
|
||||
return(zeitcode);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_scale(double value, char *result, int siz, double thresh, int flag)
|
||||
/*
|
||||
bit0= eventually ommit 'b'
|
||||
bit1= make text as short as possible
|
||||
bit2= no fraction (if it would fit at all)
|
||||
*/
|
||||
{
|
||||
char scale_c,scales[7],form[80], *negpt= NULL, *cpt;
|
||||
int i,dec_siz= 0,avail_siz= 1;
|
||||
|
||||
if(value<0) {
|
||||
value= -value;
|
||||
siz--;
|
||||
result[0]= '-';
|
||||
negpt= result;
|
||||
result++;
|
||||
}
|
||||
strcpy(scales,"bkmgtp");
|
||||
scale_c= scales[0];
|
||||
for(i=1;scales[i]!=0;i++) {
|
||||
if(value<thresh-0.5)
|
||||
break;
|
||||
value/= 1024.0;
|
||||
scale_c= scales[i];
|
||||
}
|
||||
if(scale_c!='b' && !(flag&4)) { /* is there room for fractional part ? */
|
||||
avail_siz= siz-1;
|
||||
sprintf(form,"%%.f");
|
||||
sprintf(result,"%.f",value);
|
||||
if(strlen(result)<=avail_siz-2)
|
||||
dec_siz= 1; /* we are very modest */
|
||||
}
|
||||
if(scale_c=='b' && (flag&1)) {
|
||||
if(flag&2)
|
||||
sprintf(form,"%%.f");
|
||||
else
|
||||
sprintf(form,"%%%d.f",siz);
|
||||
sprintf(result,form,value);
|
||||
} else {
|
||||
if(flag&2)
|
||||
sprintf(form,"%%.f%%c");
|
||||
else if(dec_siz>0)
|
||||
sprintf(form,"%%%d.%df%%c",avail_siz,dec_siz);
|
||||
else
|
||||
sprintf(form,"%%%d.f%%c",siz-1);
|
||||
sprintf(result,form,value,scale_c);
|
||||
}
|
||||
if(negpt != NULL) {
|
||||
for(cpt= result; *cpt==' '; cpt++);
|
||||
if(cpt > result) {
|
||||
*negpt= ' ';
|
||||
*(cpt - 1)= '-';
|
||||
}
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_off_t_text(char text[80], off_t num, int flag)
|
||||
{
|
||||
char *tpt;
|
||||
off_t hnum, scale= 1;
|
||||
int digits= 0, d, i;
|
||||
|
||||
tpt= text;
|
||||
hnum= num;
|
||||
if(hnum<0) {
|
||||
*(tpt++)= '-';
|
||||
hnum= -num;
|
||||
}
|
||||
if(hnum<0) { /* it can stay nastily persistent */
|
||||
strcpy(text, "_overflow_");
|
||||
return(0);
|
||||
}
|
||||
for(i= 0; i<23; i++) { /* good for up to 70 bit = 10 exp 21.07... */
|
||||
if(hnum==0)
|
||||
break;
|
||||
hnum/= 10;
|
||||
if(hnum)
|
||||
scale*= 10;
|
||||
}
|
||||
if(i==0) {
|
||||
strcpy(text, "0");
|
||||
return(1);
|
||||
}
|
||||
if(i==23) {
|
||||
strcpy(text, "_overflow_");
|
||||
return(0);
|
||||
}
|
||||
digits= i;
|
||||
hnum= num;
|
||||
for(; i>0; i--) {
|
||||
d= hnum/scale;
|
||||
tpt[digits-i]= '0'+d;
|
||||
hnum= hnum%scale;
|
||||
scale/= 10;
|
||||
}
|
||||
tpt[digits]= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* Converts backslash codes into single characters:
|
||||
\a BEL 7 , \b BS 8 , \e ESC 27 , \f FF 12 , \n LF 10 , \r CR 13 ,
|
||||
\t HT 9 , \v VT 11 , \\ \ 92
|
||||
\[0-9][0-9][0-9] octal code , \x[0-9a-f][0-9a-f] hex code ,
|
||||
\cX control-x (ascii(X)-64)
|
||||
@param upto maximum number of characters to examine for backslash.
|
||||
The scope of a backslash (0 to 3 characters) is not affected.
|
||||
@param eaten returns the difference in length between input and output
|
||||
@param flag bit0= only determine *eaten, do not convert
|
||||
bit1= allow to convert \000 to binary 0
|
||||
*/
|
||||
int Sfile_bsl_interpreter(char *text, int upto, int *eaten, int flag)
|
||||
{
|
||||
char *rpt, *wpt, num_text[8], wdummy[8];
|
||||
unsigned int num= 0;
|
||||
|
||||
*eaten= 0;
|
||||
wpt= text;
|
||||
for(rpt= text; *rpt != 0 && rpt - text < upto; rpt++) {
|
||||
if(flag & 1)
|
||||
wpt= wdummy;
|
||||
if(*rpt == '\\') {
|
||||
rpt++;
|
||||
(*eaten)++;
|
||||
if(*rpt == 'a') {
|
||||
*(wpt++)= 7;
|
||||
} else if(*rpt == 'b') {
|
||||
*(wpt++)= 8;
|
||||
} else if(*rpt == 'e') {
|
||||
*(wpt++)= 27;
|
||||
} else if(*rpt == 'f') {
|
||||
*(wpt++)= 12;
|
||||
} else if(*rpt == 'n') {
|
||||
*(wpt++)= 10;
|
||||
} else if(*rpt == 'r') {
|
||||
*(wpt++)= 13;
|
||||
} else if(*rpt == 't') {
|
||||
*(wpt++)= 9;
|
||||
} else if(*rpt == 'v') {
|
||||
*(wpt++)= 11;
|
||||
} else if(*rpt == '\\') {
|
||||
*(wpt++)= '\\';
|
||||
} else if(rpt[0] >= '0' && rpt[0] <= '7' &&
|
||||
rpt[1] >= '0' && rpt[1] <= '7' &&
|
||||
rpt[2] >= '0' && rpt[2] <= '7') {
|
||||
num_text[0]= '0';
|
||||
num_text[1]= *(rpt + 0);
|
||||
num_text[2]= *(rpt + 1);
|
||||
num_text[3]= *(rpt + 2);
|
||||
num_text[4]= 0;
|
||||
sscanf(num_text, "%o", &num);
|
||||
if((num > 0 || (flag & 2)) && num <= 255) {
|
||||
rpt+= 2;
|
||||
(*eaten)+= 2;
|
||||
*(wpt++)= num;
|
||||
} else
|
||||
goto not_a_code;
|
||||
} else if(rpt[0] == 'x' &&
|
||||
((rpt[1] >= '0' && rpt[1] <= '9') ||
|
||||
(rpt[1] >= 'A' && rpt[1] <= 'F') ||
|
||||
(rpt[1] >= 'a' && rpt[1] <= 'f'))
|
||||
&&
|
||||
((rpt[2] >= '0' && rpt[2] <= '9') ||
|
||||
(rpt[2] >= 'A' && rpt[2] <= 'F') ||
|
||||
(rpt[2] >= 'a' && rpt[2] <= 'f'))
|
||||
) {
|
||||
num_text[0]= *(rpt + 1);
|
||||
num_text[1]= *(rpt + 2);
|
||||
num_text[2]= 0;
|
||||
sscanf(num_text, "%x", &num);
|
||||
if(num > 0 && num <= 255) {
|
||||
rpt+= 2;
|
||||
(*eaten)+= 2;
|
||||
*(wpt++)= num;
|
||||
} else
|
||||
goto not_a_code;
|
||||
} else if(*rpt == 'c') {
|
||||
if(rpt[1] > 64 && rpt[1] < 96) {
|
||||
*(wpt++)= rpt[1] - 64;
|
||||
rpt++;
|
||||
(*eaten)++;
|
||||
} else
|
||||
goto not_a_code;
|
||||
} else {
|
||||
not_a_code:;
|
||||
*(wpt++)= '\\';
|
||||
rpt--;
|
||||
(*eaten)--;
|
||||
}
|
||||
} else
|
||||
*(wpt++)= *rpt;
|
||||
}
|
||||
*wpt= *rpt;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_argv_bsl(int argc, char ***argv, int flag)
|
||||
{
|
||||
int i, ret, eaten;
|
||||
char **new_argv= NULL;
|
||||
|
||||
if(argc <= 0)
|
||||
return(0);
|
||||
new_argv= (char **) Smem_malloC(argc * sizeof(char *));
|
||||
if(new_argv == NULL)
|
||||
return(-1);
|
||||
for(i= 0; i < argc; i++) {
|
||||
new_argv[i]= strdup((*argv)[i]);
|
||||
if(new_argv[i] == NULL)
|
||||
{ret= -1; goto ex;}
|
||||
ret= Sfile_bsl_interpreter(new_argv[i], strlen(new_argv[i]), &eaten, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(ret <= 0) {
|
||||
if(new_argv != NULL)
|
||||
free((char *) new_argv);
|
||||
} else
|
||||
*argv= new_argv;
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= only encode inside quotes
|
||||
bit1= encode < 32 outside quotes except 7, 8, 9, 10, 12, 13
|
||||
bit2= encode in any case above 126
|
||||
bit3= encode in any case shellsafe and name-value-safe:
|
||||
<=42 , 59, 60, 61, 62, 63, 92, 94, 96, >=123
|
||||
*/
|
||||
int Sfile_bsl_encoder(char **result, char *text, size_t text_len, int flag)
|
||||
{
|
||||
char *rpt, *wpt;
|
||||
int count, sq_open= 0, dq_open= 0;
|
||||
|
||||
count= 0;
|
||||
for(rpt= text; rpt - text < text_len; rpt++) {
|
||||
count++;
|
||||
if(flag & 8) {
|
||||
if(!(*rpt <= 42 || (*rpt >= 59 && *rpt <= 63) ||
|
||||
*rpt == 92 || *rpt == 94 || *rpt == 96 || *rpt >= 123))
|
||||
continue;
|
||||
} else if(*rpt >= 32 && *rpt <= 126 && *rpt != '\\')
|
||||
continue;
|
||||
if(((*rpt >= 7 && *rpt <= 13) || *rpt == 27 || *rpt == '\\') && !(flag & 8))
|
||||
count++;
|
||||
else
|
||||
count+= 3;
|
||||
}
|
||||
(*result)= wpt= calloc(count + 1, 1);
|
||||
if(wpt == NULL)
|
||||
return(-1);
|
||||
for(rpt= text; rpt - text < text_len; rpt++) {
|
||||
if(*rpt == '\'')
|
||||
sq_open= !(sq_open || dq_open);
|
||||
if(*rpt == '"')
|
||||
dq_open= !(sq_open || dq_open);
|
||||
|
||||
if(flag & 8) {
|
||||
if(!(*rpt <= 42 || (*rpt >= 59 && *rpt <= 63) ||
|
||||
*rpt == 92 || *rpt == 94 || *rpt == 96 || *rpt >= 123)) {
|
||||
*(wpt++)= *rpt;
|
||||
continue;
|
||||
}
|
||||
} else if(*rpt >= 32 && *rpt <= 126 && *rpt != '\\') {
|
||||
*(wpt++)= *rpt;
|
||||
continue;
|
||||
} else if( ((flag & 1) && !(sq_open || dq_open)) &&
|
||||
!((flag & 2) && (*rpt >= 1 && * rpt <= 31 &&
|
||||
!(*rpt == 7 || *rpt == 8 || *rpt == 9 || *rpt == 10 ||
|
||||
*rpt == 12 || *rpt == 13))) &&
|
||||
!((flag & 4) && (*rpt > 126 || *rpt < 0)) &&
|
||||
!((flag & 6) && *rpt == '\\')) {
|
||||
*(wpt++)= *rpt;
|
||||
continue;
|
||||
}
|
||||
*(wpt++)= '\\';
|
||||
if(((*rpt >= 7 && *rpt <= 13) || *rpt == 27 || *rpt == '\\') && !(flag&8)) {
|
||||
if(*rpt == 7)
|
||||
*(wpt++)= 'a';
|
||||
else if(*rpt == 8)
|
||||
*(wpt++)= 'b';
|
||||
else if(*rpt == 9)
|
||||
*(wpt++)= 't';
|
||||
else if(*rpt == 10) {
|
||||
*(wpt++)= 'n';
|
||||
} else if(*rpt == 11)
|
||||
*(wpt++)= 'v';
|
||||
else if(*rpt == 12)
|
||||
*(wpt++)= 'f';
|
||||
else if(*rpt == 13)
|
||||
*(wpt++)= 'c';
|
||||
else if(*rpt == 27)
|
||||
*(wpt++)= 'e';
|
||||
else if(*rpt == '\\')
|
||||
*(wpt++)= '\\';
|
||||
} else {
|
||||
sprintf(wpt, "%-3.3o", (unsigned int) *((unsigned char *) rpt));
|
||||
wpt+= 3;
|
||||
}
|
||||
}
|
||||
*wpt= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_destroy_argv(int *argc, char ***argv, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(*argc>0 && *argv!=NULL){
|
||||
for(i=0;i<*argc;i++){
|
||||
if((*argv)[i]!=NULL)
|
||||
Smem_freE((*argv)[i]);
|
||||
}
|
||||
Smem_freE((char *) *argv);
|
||||
}
|
||||
*argc= 0;
|
||||
*argv= NULL;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Sfile_make_argv(char *progname, char *line, int *argc, char ***argv,
|
||||
int flag)
|
||||
/*
|
||||
bit0= read progname as first argument from line
|
||||
bit1= just release argument list argv and return
|
||||
bit2= abort with return(0) if incomplete quotes are found
|
||||
bit3= eventually prepend missing '-' to first argument read from line
|
||||
bit4= like bit2 but only check quote completeness, do not allocate memory
|
||||
bit5+6= interpretation of backslashes:
|
||||
0= no interpretation, leave unchanged
|
||||
1= only inside double quotes
|
||||
2= outside single quotes
|
||||
3= everywhere
|
||||
bit7= append a NULL element to argv
|
||||
*/
|
||||
{
|
||||
int i,pass,maxl=0,l,argzaehl=0,bufl,line_start_argc, bsl_mode, ret= 0, eaten;
|
||||
char *cpt,*start;
|
||||
char *buf= NULL;
|
||||
|
||||
Sfile_destroy_argv(argc,argv,0);
|
||||
if(flag&2)
|
||||
{ret= 1; goto ex;}
|
||||
|
||||
if(flag & 16)
|
||||
flag|= 4;
|
||||
bsl_mode= (flag >> 5) & 3;
|
||||
|
||||
buf= calloc(strlen(line) + SfileadrL, 1);
|
||||
if(buf == NULL)
|
||||
{ret= -1; goto ex;}
|
||||
for(pass=0;pass<2;pass++) {
|
||||
cpt= line-1;
|
||||
if(!(flag&1)){
|
||||
argzaehl= line_start_argc= 1;
|
||||
if(pass==0)
|
||||
maxl= strlen(progname);
|
||||
else
|
||||
strcpy((*argv)[0],progname);
|
||||
} else {
|
||||
argzaehl= line_start_argc= 0;
|
||||
if(pass==0) maxl= 0;
|
||||
}
|
||||
while(*(++cpt)!=0){
|
||||
if(isspace(*cpt)) continue;
|
||||
start= cpt;
|
||||
buf[0]= 0;
|
||||
cpt--;
|
||||
while(*(++cpt)!=0) {
|
||||
if(isspace(*cpt)) break;
|
||||
if(*cpt=='"'){
|
||||
l= cpt-start; bufl= strlen(buf);
|
||||
if(l>0) {
|
||||
strncpy(buf + bufl, start, l); buf[bufl + l]= 0;
|
||||
if(bsl_mode >= 3) {
|
||||
ret= Sfile_bsl_interpreter(buf, l, &eaten, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
l= strlen(buf);
|
||||
start= cpt+1;
|
||||
while(*(++cpt)!=0) if(*cpt=='"') break;
|
||||
if((flag&4) && *cpt==0)
|
||||
{ret= 0; goto ex;}
|
||||
l= cpt-start; bufl= strlen(buf);
|
||||
if(l>0) {
|
||||
strncpy(buf + bufl, start, l);
|
||||
buf[bufl + l]= 0;
|
||||
if(bsl_mode >= 1) {
|
||||
ret= Sfile_bsl_interpreter(buf + bufl, l, &eaten, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
start= cpt+1;
|
||||
}else if(*cpt=='\''){
|
||||
l= cpt-start; bufl= strlen(buf);
|
||||
if(l>0) {
|
||||
strncpy(buf + bufl, start, l); buf[bufl + l]= 0;
|
||||
if(bsl_mode >= 3) {
|
||||
ret= Sfile_bsl_interpreter(buf, l, &eaten, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
l= strlen(buf);
|
||||
start= cpt+1;
|
||||
while(*(++cpt)!=0) if(*cpt=='\'') break;
|
||||
if((flag&4) && *cpt==0)
|
||||
{ret= 0; goto ex;}
|
||||
l= cpt-start; bufl= strlen(buf);
|
||||
if(l>0) {
|
||||
strncat(buf,start,l);buf[bufl+l]= 0;
|
||||
if(bsl_mode >= 2) {
|
||||
ret= Sfile_bsl_interpreter(buf + bufl, l, &eaten, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
start= cpt+1;
|
||||
}
|
||||
if(*cpt==0) break;
|
||||
}
|
||||
l= cpt-start;
|
||||
bufl= strlen(buf);
|
||||
if(l>0) {
|
||||
strncpy(buf + bufl, start, l); buf[bufl + l]= 0;
|
||||
if(bsl_mode >= 3) {
|
||||
ret= Sfile_bsl_interpreter(buf, l, &eaten, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
}
|
||||
}
|
||||
l= strlen(buf);
|
||||
if(pass==0){
|
||||
if(argzaehl==line_start_argc && (flag&8))
|
||||
if(buf[0]!='-' && buf[0]!=0 && buf[0]!='#')
|
||||
l++;
|
||||
if(l>maxl) maxl= l;
|
||||
}else{
|
||||
strcpy((*argv)[argzaehl],buf);
|
||||
if(argzaehl==line_start_argc && (flag&8))
|
||||
if(buf[0]!='-' && buf[0]!=0 && buf[0]!='#')
|
||||
sprintf((*argv)[argzaehl],"-%s", buf);
|
||||
}
|
||||
argzaehl++;
|
||||
if(*cpt==0) break;
|
||||
}
|
||||
if(pass==0){
|
||||
if(flag & 16)
|
||||
{ret= 1; goto ex;}
|
||||
*argc= argzaehl;
|
||||
if(argzaehl>0 || (flag & 128)) {
|
||||
*argv= (char **) Smem_malloC((argzaehl + !!(flag & 128))
|
||||
* sizeof(char *));
|
||||
if(*argv==NULL)
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
for(i=0;i<*argc;i++) {
|
||||
(*argv)[i]= (char *) Smem_malloC((maxl+1));
|
||||
if((*argv)[i]==NULL)
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
if(flag & 128)
|
||||
(*argv)[*argc]= NULL;
|
||||
}
|
||||
}
|
||||
ret= 1;
|
||||
ex:
|
||||
if(buf != NULL)
|
||||
free(buf);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= append */
|
||||
int Sfile_str(char target[SfileadrL], char *source, int flag)
|
||||
{
|
||||
int l;
|
||||
|
||||
l= strlen(source);
|
||||
if(flag&1)
|
||||
l+= strlen(target);
|
||||
if(l>=SfileadrL) {
|
||||
fprintf(stderr, "--- Path string overflow (%d > %d). Malicious input ?\n",
|
||||
l,SfileadrL-1);
|
||||
return(0);
|
||||
}
|
||||
if(flag&1)
|
||||
strcat(target, source);
|
||||
else
|
||||
strcpy(target, source);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/** Combine environment variable HOME with given filename
|
||||
@param filename Address relative to $HOME
|
||||
@param fileadr Resulting combined address
|
||||
@param fa_size Size of array fileadr
|
||||
@param flag Unused yet
|
||||
@return 1=ok , 0=no HOME variable , -1=result address too long
|
||||
*/
|
||||
int Sfile_home_adr_s(char *filename, char *fileadr, int fa_size, int flag)
|
||||
{
|
||||
char *home;
|
||||
|
||||
strcpy(fileadr,filename);
|
||||
home= getenv("HOME");
|
||||
if(home==NULL)
|
||||
return(0);
|
||||
if(strlen(home)+strlen(filename)+1>=fa_size)
|
||||
return(-1);
|
||||
strcpy(fileadr,home);
|
||||
if(filename[0]!=0){
|
||||
strcat(fileadr,"/");
|
||||
strcat(fileadr,filename);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/** Return a double representing seconds and microseconds since 1 Jan 1970 */
|
||||
double Sfile_microtime(int flag)
|
||||
{
|
||||
struct timeval tv;
|
||||
struct timezone tz;
|
||||
gettimeofday(&tv,&tz);
|
||||
return((double) (tv.tv_sec+1.0e-6*tv.tv_usec));
|
||||
}
|
||||
|
||||
|
||||
int Sfile_decode_datestr(struct tm *reply, char *text, int flag)
|
||||
/* YYMMDD[.hhmm[ss]] */
|
||||
{
|
||||
int i,l;
|
||||
time_t current_time;
|
||||
struct tm *now;
|
||||
|
||||
current_time= time(0);
|
||||
now= localtime(¤t_time);
|
||||
for(i=0;i<sizeof(struct tm);i++)
|
||||
((char *) reply)[i]= ((char *) now)[i];
|
||||
|
||||
if(text[0]<'0'|| (text[0]>'9' && text[0]<'A') || text[0]>'Z')
|
||||
return(0);
|
||||
l= strlen(text);
|
||||
for(i=1;i<l;i++)
|
||||
if(text[i]<'0'||text[i]>'9')
|
||||
break;
|
||||
if(i!=6)
|
||||
return(0);
|
||||
if(text[i]==0)
|
||||
goto decode;
|
||||
if(text[i]!='.' || (l!=11 && l!=13))
|
||||
return(0);
|
||||
for(i++;i<l;i++)
|
||||
if(text[i]<'0'||text[i]>'9')
|
||||
break;
|
||||
if(i!=l)
|
||||
return(0);
|
||||
|
||||
decode:;
|
||||
reply->tm_hour= 0;
|
||||
reply->tm_min= 0;
|
||||
reply->tm_sec= 0;
|
||||
i= 0;
|
||||
if(text[0]>='A')
|
||||
reply->tm_year= 100+(text[i]-'A')*10+text[1]-'0';
|
||||
else
|
||||
reply->tm_year= 10*(text[0]-'0')+text[1]-'0';
|
||||
reply->tm_mon= 10*(text[2]-'0')+text[3]-'0'-1;
|
||||
reply->tm_mday= 10*(text[4]-'0')+text[5]-'0';
|
||||
if(l==6)
|
||||
return(1);
|
||||
reply->tm_hour= 10*(text[7]-'0')+text[8]-'0';
|
||||
reply->tm_min= 10*(text[9]-'0')+text[10]-'0';
|
||||
if(l==11)
|
||||
return(1);
|
||||
reply->tm_sec= 10*(text[11]-'0')+text[12]-'0';
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
121
xorriso/sfile.h
Normal file
121
xorriso/sfile.h
Normal file
@ -0,0 +1,121 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions around files and strings.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_sfile_includeD
|
||||
#define Xorriso_pvt_sfile_includeD yes
|
||||
|
||||
#define TSOB_FELD(typ,anz) (typ *) calloc(1, (anz)*sizeof(typ));
|
||||
#define Smem_malloC malloc
|
||||
#define Smem_freE free
|
||||
|
||||
#define SfileadrL 4096
|
||||
|
||||
|
||||
int Sfile_str(char target[SfileadrL], char *source, int flag);
|
||||
|
||||
double Sfile_microtime(int flag);
|
||||
|
||||
int Sfile_add_to_path(char path[SfileadrL], char *addon, int flag);
|
||||
|
||||
int Sfile_scale(double value, char *result, int siz, double thresh, int flag);
|
||||
|
||||
int Sfile_destroy_argv(int *argc, char ***argv, int flag);
|
||||
|
||||
/*
|
||||
bit0= do not ignore trailing slash
|
||||
bit1= do not ignore empty components (other than the empty root name)
|
||||
*/
|
||||
int Sfile_count_components(char *path, int flag);
|
||||
|
||||
/*
|
||||
@param flag
|
||||
bit0= return -1 if file is missing
|
||||
bit1= return a hardlink with siblings as type 5
|
||||
bit2= evaluate eventual link target rather than the link object itself
|
||||
bit3= return a socket or a char device as types 7 or 8 rather than 0
|
||||
@return
|
||||
0=unknown
|
||||
1=regular
|
||||
2=directory
|
||||
3=symbolic link
|
||||
4=named pipe
|
||||
5=multiple hardlink (with bit1)
|
||||
6=block device
|
||||
7=socket (with bit3)
|
||||
8=character device (with bit3)
|
||||
*/
|
||||
int Sfile_type(char *filename, int flag);
|
||||
|
||||
/* @param flag bit0= only encode inside quotes
|
||||
bit1= encode < 32 outside quotes except 7, 8, 9, 10, 12, 13
|
||||
bit2= encode in any case above 126
|
||||
bit3= encode in any case shellsafe:
|
||||
<=42 , 59, 60, 62, 63, 92, 94, 96, >=123
|
||||
*/
|
||||
int Sfile_bsl_encoder(char **result, char *text, size_t text_len, int flag);
|
||||
|
||||
int Sfile_argv_bsl(int argc, char ***argv, int flag);
|
||||
|
||||
/*
|
||||
bit0= read progname as first argument from line
|
||||
bit1= just release argument list argv and return
|
||||
bit2= abort with return(0) if incomplete quotes are found
|
||||
bit3= eventually prepend missing '-' to first argument read from line
|
||||
bit4= like bit2 but only check quote completeness, do not allocate memory
|
||||
bit5+6= interpretation of backslashes:
|
||||
0= no interpretation, leave unchanged
|
||||
1= only inside double quotes
|
||||
2= outside single quotes
|
||||
3= everywhere
|
||||
bit7= append a NULL element to argv
|
||||
*/
|
||||
int Sfile_make_argv(char *progname, char *line, int *argc, char ***argv,
|
||||
int flag);
|
||||
|
||||
/* YYMMDD[.hhmm[ss]] */
|
||||
int Sfile_decode_datestr(struct tm *reply, char *text, int flag);
|
||||
|
||||
int Sfile_off_t_text(char text[80], off_t num, int flag);
|
||||
|
||||
int Sfile_leafname(char *path, char leafname[SfileadrL], int flag);
|
||||
|
||||
/* @param flag bit0= do not clip of carriage return at line end
|
||||
*/
|
||||
char *Sfile_fgets_n(char *line, int maxl, FILE *fp, int flag);
|
||||
|
||||
/*
|
||||
bit0=with hours+minutes
|
||||
bit1=with seconds
|
||||
|
||||
bit8= local time rather than UTC
|
||||
*/
|
||||
char *Sfile_datestr(time_t tim, short int flag);
|
||||
|
||||
/* Converts backslash codes into single characters:
|
||||
\a BEL 7 , \b BS 8 , \e ESC 27 , \f FF 12 , \n LF 10 , \r CR 13 ,
|
||||
\t HT 9 , \v VT 11 , \\ \ 92
|
||||
\[0-9][0-9][0-9] octal code , \x[0-9a-f][0-9a-f] hex code ,
|
||||
\cX control-x (ascii(X)-64)
|
||||
@param upto maximum number of characters to examine for backslash.
|
||||
The scope of a backslash (0 to 3 characters) is not affected.
|
||||
@param eaten returns the difference in length between input and output
|
||||
@param flag bit0= only determine *eaten, do not convert
|
||||
bit1= allow to convert \000 to binary 0
|
||||
*/
|
||||
int Sfile_bsl_interpreter(char *text, int upto, int *eaten, int flag);
|
||||
|
||||
int Sfile_prepend_path(char *prefix, char path[SfileadrL], int flag);
|
||||
|
||||
int Sfile_home_adr_s(char *filename, char *fileadr, int fa_size, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_sfile_includeD */
|
||||
|
714
xorriso/sort_cmp.c
Normal file
714
xorriso/sort_cmp.c
Normal file
@ -0,0 +1,714 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains functions which sort and compare tree nodes.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
#include "base_obj.h"
|
||||
#include "lib_mgt.h"
|
||||
#include "sort_cmp.h"
|
||||
#include "iso_tree.h"
|
||||
#include "iso_manip.h"
|
||||
|
||||
|
||||
int Xorriso__findi_sorted_ino_cmp(const void *p1, const void *p2)
|
||||
{
|
||||
int ret;
|
||||
IsoNode *n1, *n2;
|
||||
|
||||
n1= *((IsoNode **) p1);
|
||||
n2= *((IsoNode **) p2);
|
||||
|
||||
ret= Xorriso__node_lba_cmp(&n1, &n2);
|
||||
if(ret)
|
||||
return (ret > 0 ? 1 : -1);
|
||||
ret= iso_node_cmp_ino(n1, n2, 0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* Not suitable for qsort() but for cross-array comparisons.
|
||||
p1 and p2 are actually IsoNode *p1, IsoNode *p2
|
||||
*/
|
||||
int Xorriso__hln_cmp(const void *p1, const void *p2)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret= Xorriso__findi_sorted_ino_cmp(&p1, &p2);
|
||||
if(ret)
|
||||
return (ret > 0 ? 1 : -1);
|
||||
if(p1 != p2)
|
||||
return(p1 < p2 ? -1 : 1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
p1 and p2 are actually IsoNode **p1, IsoNode **p2
|
||||
*/
|
||||
int Xorriso__findi_sorted_cmp(const void *p1, const void *p2)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret= Xorriso__findi_sorted_ino_cmp(p1, p2);
|
||||
if(ret)
|
||||
return (ret > 0 ? 1 : -1);
|
||||
if(p1 != p2)
|
||||
return(p1 < p2 ? -1 : 1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_sort_node_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
if(xorriso->node_counter <= 0)
|
||||
return(0);
|
||||
qsort(xorriso->node_array, xorriso->node_counter, sizeof(IsoNode *),
|
||||
Xorriso__findi_sorted_cmp);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__search_node(void *node_array[], int n,
|
||||
int (*cmp)(const void *p1, const void *p2),
|
||||
void *node, int *idx, int flag)
|
||||
{
|
||||
int ret, l, r, p, pos;
|
||||
|
||||
if(n == 0)
|
||||
return(0);
|
||||
l= 0;
|
||||
r= n + 1;
|
||||
while(1) {
|
||||
p= (r - l) / 2;
|
||||
if(p == 0)
|
||||
break;
|
||||
p+= l;
|
||||
|
||||
/* NULL elements may indicate invalid nodes. Their first valid right neigbor
|
||||
will serve as proxy. If none exists, then the test pushes leftwards.
|
||||
*/
|
||||
for(pos= p - 1; pos < n; pos++)
|
||||
if(node_array[pos] != NULL)
|
||||
break;
|
||||
if(pos < n)
|
||||
ret= (*cmp)(&(node_array[pos]), &node);
|
||||
else
|
||||
ret= 1;
|
||||
|
||||
if(ret < 0)
|
||||
l= p;
|
||||
else if(ret > 0)
|
||||
r= p;
|
||||
else {
|
||||
*idx= pos;
|
||||
return(1);
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_search_in_hln_array(struct XorrisO *xorriso,
|
||||
void *node, int *idx, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if(xorriso->hln_array == NULL || xorriso->hln_count <= 0)
|
||||
return(0);
|
||||
ret= Xorriso__search_node(xorriso->hln_array, xorriso->hln_count,
|
||||
Xorriso__findi_sorted_ino_cmp, node, idx, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__get_di(IsoNode *node, dev_t *dev, ino_t *ino, int flag)
|
||||
{
|
||||
int ret, i, i_end, imgid, error_code;
|
||||
size_t value_length= 0;
|
||||
char *value= NULL, msg[ISO_MSGS_MESSAGE_LEN], severity[80];
|
||||
unsigned char *vpt;
|
||||
static char *name= "isofs.di";
|
||||
|
||||
#ifdef NIX
|
||||
/* <<< */
|
||||
Xorriso_get_di_counteR++;
|
||||
#endif /* NIX */
|
||||
|
||||
*dev= 0;
|
||||
*ino= 0;
|
||||
ret= iso_node_lookup_attr(node, name, &value_length, &value, 0);
|
||||
if(ret <= 0) {
|
||||
/* Drop any pending messages because there is no xorriso to take them */
|
||||
iso_obtain_msgs("NEVER", &error_code, &imgid, msg, severity);
|
||||
return(ret);
|
||||
}
|
||||
vpt= (unsigned char *) value;
|
||||
for(i= 1; i <= vpt[0] && i < value_length; i++)
|
||||
*dev= ((*dev) << 8) | vpt[i];
|
||||
i_end= i + vpt[i] + 1;
|
||||
for(i++; i < i_end && i < value_length; i++)
|
||||
*ino= ((*ino) << 8) | vpt[i];
|
||||
free(value);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__di_ino_cmp(const void *p1, const void *p2)
|
||||
{
|
||||
int ret;
|
||||
IsoNode *n1, *n2;
|
||||
dev_t d1, d2;
|
||||
ino_t i1, i2;
|
||||
|
||||
n1= *((IsoNode **) p1);
|
||||
n2= *((IsoNode **) p2);
|
||||
|
||||
ret= Xorriso__get_di(n1, &d1, &i1, 0);
|
||||
if(ret <= 0)
|
||||
{d1= 0; i1= 0;}
|
||||
ret= Xorriso__get_di(n2, &d2, &i2, 0);
|
||||
if(ret <= 0)
|
||||
{d2= 0; i2= 0;}
|
||||
|
||||
if(d1 < d2)
|
||||
return(-1);
|
||||
if(d1 > d2)
|
||||
return(1);
|
||||
if(i1 < i2)
|
||||
return(-1);
|
||||
if(i1 > i2)
|
||||
return(1);
|
||||
if(d1 == 0 && i1 == 0 && n1 != n2)
|
||||
return(n1 < n2 ? -1 : 1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__di_cmp(const void *p1, const void *p2)
|
||||
{
|
||||
int ret;
|
||||
IsoNode *n1, *n2;
|
||||
|
||||
ret= Xorriso__di_ino_cmp(p1, p2);
|
||||
if(ret)
|
||||
return(ret);
|
||||
n1= *((IsoNode **) p1);
|
||||
n2= *((IsoNode **) p2);
|
||||
if(n1 != n2)
|
||||
return(n1 < n2 ? -1 : 1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__sort_di(void *node_array[], int count, int flag)
|
||||
{
|
||||
if(count <= 0)
|
||||
return(0);
|
||||
qsort(node_array, count, sizeof(IsoNode *), Xorriso__di_cmp);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_invalidate_di_item(struct XorrisO *xorriso, IsoNode *node,
|
||||
int flag)
|
||||
{
|
||||
int ret, idx;
|
||||
|
||||
if(xorriso->di_array == NULL)
|
||||
return(1);
|
||||
ret= Xorriso__search_node(xorriso->di_array, xorriso->di_count,
|
||||
Xorriso__di_cmp, node, &idx, 0);
|
||||
if(ret <= 0)
|
||||
return(ret == 0);
|
||||
if(xorriso->di_array[idx] != NULL)
|
||||
iso_node_unref(xorriso->di_array[idx]);
|
||||
xorriso->di_array[idx]= NULL;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= return 1 even if matching nodes were found but node is
|
||||
not among them
|
||||
bit1= use Xorriso__di_cmp() rather than Xorriso__di_ino_cmp()
|
||||
*/
|
||||
int Xorriso_search_di_range(struct XorrisO *xorriso, IsoNode *node,
|
||||
int *idx, int *low, int *high, int flag)
|
||||
{
|
||||
int ret, i, found;
|
||||
int (*cmp)(const void *p1, const void *p2)= Xorriso__di_ino_cmp;
|
||||
|
||||
if(flag & 2)
|
||||
cmp= Xorriso__di_cmp;
|
||||
|
||||
*high= *low= *idx= -1;
|
||||
ret= Xorriso__search_node(xorriso->di_array, xorriso->di_count,
|
||||
cmp, node, &found, 0);
|
||||
if(ret <= 0)
|
||||
return(0);
|
||||
*low= *high= found;
|
||||
for(i= found + 1; i < xorriso->di_count; i++)
|
||||
if(xorriso->di_array[i] != NULL) {
|
||||
if((*cmp)(&node, &(xorriso->di_array[i])) != 0)
|
||||
break;
|
||||
*high= i;
|
||||
}
|
||||
for(i= found - 1; i >= 0; i--)
|
||||
if(xorriso->di_array[i] != NULL) {
|
||||
if((*cmp)(&node, &(xorriso->di_array[i])) != 0)
|
||||
break;
|
||||
*low= i;
|
||||
}
|
||||
for(i= *low; i <= *high; i++)
|
||||
if(xorriso->di_array[i] == node) {
|
||||
*idx= i;
|
||||
break;
|
||||
}
|
||||
return(*idx >= 0 || (flag & 1));
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__node_lba_cmp(const void *node1, const void *node2)
|
||||
{
|
||||
int ret;
|
||||
int lba1= 0, lba2= 0;
|
||||
|
||||
ret= Xorriso__file_start_lba(*((IsoNode **) node1), &lba1, 0);
|
||||
if(ret!=1)
|
||||
lba1= 0;
|
||||
ret= Xorriso__file_start_lba(*((IsoNode **) node2), &lba2, 0);
|
||||
if(ret!=1)
|
||||
lba2= 0;
|
||||
return(lba1-lba2);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso__node_name_cmp(const void *node1, const void *node2)
|
||||
{
|
||||
char *name1, *name2;
|
||||
|
||||
name1= (char *) iso_node_get_name(*((IsoNode **) node1));
|
||||
name2= (char *) iso_node_get_name(*((IsoNode **) node2));
|
||||
return(strcmp(name1,name2));
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= only accept directory nodes
|
||||
bit1= do not report memory usage as DEBUG
|
||||
bit2= do not apply search pattern but accept any node
|
||||
*/
|
||||
int Xorriso_sorted_node_array(struct XorrisO *xorriso,
|
||||
IsoDir *dir_node,
|
||||
int *nodec, IsoNode ***node_array,
|
||||
off_t boss_mem, int flag)
|
||||
{
|
||||
int i, ret, failed_at;
|
||||
char *npt;
|
||||
IsoDirIter *iter= NULL;
|
||||
IsoNode *node;
|
||||
off_t mem;
|
||||
|
||||
mem= ((*nodec)+1)*sizeof(IsoNode *);
|
||||
ret= Xorriso_check_temp_mem_limit(xorriso, mem+boss_mem, flag&2);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
|
||||
*node_array= calloc(sizeof(IsoNode *), (*nodec)+1);
|
||||
if(*node_array==NULL) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Cannot allocate memory for %d directory entries", *nodec);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
ret= iso_dir_get_children(dir_node, &iter);
|
||||
if(ret<0) {
|
||||
Xorriso_cannot_create_iter(xorriso, ret, 0);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
for(i= 0; iso_dir_iter_next(iter, &node) == 1 && i<*nodec; ) {
|
||||
npt= (char *) iso_node_get_name(node);
|
||||
if(!(flag&4)) {
|
||||
ret= Xorriso_regexec(xorriso, npt, &failed_at, 0);
|
||||
if(ret)
|
||||
continue; /* no match */
|
||||
}
|
||||
if(flag&1)
|
||||
if(!LIBISO_ISDIR(node))
|
||||
continue;
|
||||
(*node_array)[i++]= node;
|
||||
}
|
||||
iso_dir_iter_free(iter);
|
||||
*nodec= i;
|
||||
if(*nodec<=0)
|
||||
return(1);
|
||||
qsort(*node_array, *nodec, sizeof(IsoNode *), Xorriso__node_name_cmp);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_remake_hln_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, addon_nodes= 0, i, old_count, old_pt, new_pt;
|
||||
IsoNode **old_nodes;
|
||||
char **old_targets;
|
||||
|
||||
/* Count hln_targets of which the node has been deleted meanwhile */
|
||||
for(i= 0; i < xorriso->hln_count; i++) {
|
||||
if(xorriso->hln_targets[i] == NULL)
|
||||
continue;
|
||||
if(Xorriso_node_is_valid(xorriso, xorriso->hln_array[i], 0))
|
||||
continue;
|
||||
addon_nodes++;
|
||||
}
|
||||
ret= Xorriso_all_node_array(xorriso, addon_nodes, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
if(addon_nodes > 0) {
|
||||
/* Transfer delete nodes with hln_target to node array */
|
||||
for(i= 0; i < xorriso->hln_count; i++) {
|
||||
if(xorriso->hln_targets[i] == NULL)
|
||||
continue;
|
||||
if(Xorriso_node_is_valid(xorriso, xorriso->hln_array[i], 0))
|
||||
continue;
|
||||
if(xorriso->node_counter < xorriso->node_array_size) {
|
||||
xorriso->node_array[xorriso->node_counter++]= xorriso->hln_array[i];
|
||||
iso_node_ref(xorriso->node_array[xorriso->node_counter - 1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Xorriso_sort_node_array(xorriso, 0);
|
||||
old_nodes= (IsoNode **) xorriso->hln_array;
|
||||
old_targets= (char **) xorriso->hln_targets;
|
||||
old_count= xorriso->hln_count;
|
||||
xorriso->hln_array= 0;
|
||||
xorriso->hln_targets= NULL;
|
||||
|
||||
/* Transfer node_array to di_array without unrefering nodes */
|
||||
xorriso->hln_count= xorriso->node_counter;
|
||||
xorriso->hln_array= xorriso->node_array;
|
||||
xorriso->node_counter= 0;
|
||||
xorriso->node_array_size= 0;
|
||||
xorriso->node_array= NULL;
|
||||
|
||||
/* Allocate hln_targets */
|
||||
ret= Xorriso_new_hln_array(xorriso, xorriso->temp_mem_limit, 1);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
xorriso->node_targets_availmem= xorriso->temp_mem_limit;
|
||||
if(old_targets != NULL) {
|
||||
/* Transfer targets from old target array */;
|
||||
new_pt= old_pt= 0;
|
||||
while(new_pt < xorriso->hln_count && old_pt < old_count) {
|
||||
ret= Xorriso__hln_cmp(xorriso->hln_array[new_pt], old_nodes[old_pt]);
|
||||
if(ret < 0) {
|
||||
new_pt++;
|
||||
} else if(ret > 0) {
|
||||
old_pt++;
|
||||
} else {
|
||||
xorriso->hln_targets[new_pt]= old_targets[old_pt];
|
||||
if(old_targets[old_pt] != NULL)
|
||||
xorriso->temp_mem_limit-= strlen(old_targets[old_pt]) + 1;
|
||||
old_targets[old_pt]= NULL;
|
||||
new_pt++;
|
||||
old_pt++;
|
||||
}
|
||||
}
|
||||
for(old_pt= 0; old_pt < old_count; old_pt++)
|
||||
if(old_targets[old_pt] != NULL) /* (should not happen) */
|
||||
free(old_targets[old_pt]);
|
||||
free((char *) old_targets);
|
||||
}
|
||||
if(old_nodes != NULL) {
|
||||
for(old_pt= 0; old_pt < old_count; old_pt++)
|
||||
if(old_nodes[old_pt] != NULL)
|
||||
iso_node_unref(old_nodes[old_pt]);
|
||||
free((char *) old_nodes);
|
||||
}
|
||||
xorriso->hln_change_pending= 0;
|
||||
ret= 1;
|
||||
ex:;
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= overwrite existing hln_array (else return 2)
|
||||
*/
|
||||
int Xorriso_make_hln_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if(xorriso->hln_array != NULL && !(flag & 1)) {
|
||||
/* If no fresh image manipulations occured: keep old array */
|
||||
if(!xorriso->hln_change_pending)
|
||||
return(2);
|
||||
ret= Xorriso_remake_hln_array(xorriso, 0);
|
||||
return(ret);
|
||||
}
|
||||
Xorriso_destroy_hln_array(xorriso, 0);
|
||||
|
||||
ret= Xorriso_all_node_array(xorriso, 0, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
Xorriso_sort_node_array(xorriso, 0);
|
||||
|
||||
/* Transfer node_array to di_array without unrefering nodes */
|
||||
xorriso->hln_count= xorriso->node_counter;
|
||||
xorriso->hln_array= xorriso->node_array;
|
||||
xorriso->node_counter= 0;
|
||||
xorriso->node_array_size= 0;
|
||||
xorriso->node_array= NULL;
|
||||
|
||||
/* Allocate hln_targets */
|
||||
ret= Xorriso_new_hln_array(xorriso, xorriso->temp_mem_limit, 1);
|
||||
if(ret<=0) {
|
||||
Xorriso_destroy_hln_array(xorriso, 0);
|
||||
goto ex;
|
||||
}
|
||||
xorriso->node_targets_availmem= xorriso->temp_mem_limit;
|
||||
xorriso->hln_change_pending= 0;
|
||||
ret= 1;
|
||||
ex:;
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= overwrite existing di_array (else return 2)
|
||||
bit1= make di_array despite xorriso->ino_behavior bit 3
|
||||
*/
|
||||
int Xorriso_make_di_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, bytes;
|
||||
|
||||
#ifdef NIX
|
||||
/* <<< */
|
||||
unsigned long old_gdic;
|
||||
old_gdic= Xorriso_get_di_counteR;
|
||||
#endif /* NIX */
|
||||
|
||||
if((xorriso->ino_behavior & 8 ) && !(flag & 2))
|
||||
return(2);
|
||||
if(xorriso->di_array != NULL && !(flag & 1))
|
||||
return(2);
|
||||
Xorriso_finish_hl_update(xorriso, 0);
|
||||
|
||||
ret= Xorriso_all_node_array(xorriso, 0, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
bytes= xorriso->node_array_size / 8 + 1;
|
||||
xorriso->di_do_widen= calloc(bytes, 1);
|
||||
if(xorriso->di_do_widen == NULL) {
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
ret= -1; goto ex;
|
||||
}
|
||||
|
||||
/* Transfer node_array to di_array without unrefering nodes */
|
||||
xorriso->di_count= xorriso->node_counter;
|
||||
xorriso->di_array= xorriso->node_array;
|
||||
xorriso->node_counter= 0;
|
||||
xorriso->node_array_size= 0;
|
||||
xorriso->node_array= NULL;
|
||||
|
||||
Xorriso__sort_di((void *) xorriso->di_array, xorriso->di_count, 0);
|
||||
|
||||
ret= 1;
|
||||
ex:;
|
||||
|
||||
#ifdef NIX
|
||||
/* <<< */
|
||||
fprintf(stderr, "xorriso_DEBUG: sort_count= %lu\n",
|
||||
Xorriso_get_di_counteR - old_gdic);
|
||||
#endif /* NIX */
|
||||
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@param flag bit0= iso_rr_path is freshly added and up to date
|
||||
bit2= -follow: this is not a command parameter
|
||||
@return -1= severe error
|
||||
0= not applicable for hard links
|
||||
1= go on with processing
|
||||
2= iso_rr_path is fully updated
|
||||
*/
|
||||
int Xorriso_hardlink_update(struct XorrisO *xorriso, int *compare_result,
|
||||
char *disk_path, char *iso_rr_path, int flag)
|
||||
{
|
||||
int ret, hret, idx, low, high, i, do_overwrite= 0, did_fake_di= 0;
|
||||
int follow_links, old_idx= -1;
|
||||
IsoNode *node;
|
||||
struct stat stbuf;
|
||||
dev_t old_dev;
|
||||
ino_t old_ino;
|
||||
|
||||
if(xorriso->di_array == NULL)
|
||||
return(1);
|
||||
follow_links= xorriso->do_follow_links ||
|
||||
(xorriso->do_follow_param && !(flag & 4));
|
||||
ret= Xorriso_node_from_path(xorriso, NULL, iso_rr_path, &node, 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
if(LIBISO_ISDIR(node))
|
||||
return(1);
|
||||
|
||||
/* Handle eventual hardlink split : */
|
||||
/* This is achieved by setting the content change bit. Reason:
|
||||
The node needs to be removed from di_array because its di is
|
||||
not matching its array index any more. So it becomes invisible for
|
||||
the join check of eventual later hardlink siblings. Therefore
|
||||
it must be updated now, even if it has currently no siblings
|
||||
which it leaves or which it joins.
|
||||
*/
|
||||
if(!(flag & 1))
|
||||
do_overwrite= 1;
|
||||
|
||||
Xorriso__get_di(node, &old_dev, &old_ino, 0);
|
||||
ret= Xorriso__search_node(xorriso->di_array, xorriso->di_count,
|
||||
Xorriso__di_cmp, node, &idx, 0);
|
||||
if(ret < 0)
|
||||
{ret= 0; goto ex;}
|
||||
if(ret > 0)
|
||||
old_idx= idx;
|
||||
|
||||
/* Handle eventual hardlink joining : */
|
||||
|
||||
if(follow_links)
|
||||
ret= stat(disk_path, &stbuf);
|
||||
else
|
||||
ret= lstat(disk_path, &stbuf);
|
||||
if(ret==-1)
|
||||
{ret= 0; goto ex;}
|
||||
|
||||
/* Are there new dev-ino-siblings in the image ? */
|
||||
/* Fake isofs.di */
|
||||
if(!(flag & 1)) {
|
||||
ret= Xorriso_record_dev_inode(xorriso, disk_path, stbuf.st_dev,
|
||||
stbuf.st_ino, node, iso_rr_path, 1);
|
||||
if(ret <= 0)
|
||||
{ret= -1; goto ex;}
|
||||
did_fake_di= 1;
|
||||
/* temporarily remove node from di_array so it does not disturb
|
||||
search by its fake di info */;
|
||||
if(old_idx >= 0)
|
||||
xorriso->di_array[old_idx]= NULL;
|
||||
}
|
||||
ret= Xorriso_search_di_range(xorriso, node, &idx, &low, &high, 1);
|
||||
if(did_fake_di) {
|
||||
/* Revoke fake of isofs.di */
|
||||
hret= Xorriso_record_dev_inode(xorriso, disk_path, old_dev, old_ino,
|
||||
node, iso_rr_path, 1);
|
||||
if(hret <= 0)
|
||||
{ret= -1; goto ex;}
|
||||
if(old_idx >= 0)
|
||||
xorriso->di_array[old_idx]= node;
|
||||
}
|
||||
if(ret == 0)
|
||||
{ret= 1; goto ex;}
|
||||
if(ret < 0)
|
||||
{ret= 0; goto ex;}
|
||||
|
||||
|
||||
#ifdef Xorriso_hardlink_update_debuG
|
||||
/* <<< */
|
||||
if(low < high || idx < 0) {
|
||||
fprintf(stderr,
|
||||
"xorriso_DEBUG: old_idx= %d , low= %d , high= %d , iso= '%s' , disk='%s'\n",
|
||||
old_idx, low, high, iso_rr_path, disk_path);
|
||||
fprintf(stderr,
|
||||
"xorriso_DEBUG: old_dev= %lu , old_ino= %lu , dev= %lu , ino= %lu\n",
|
||||
(unsigned long) old_dev, (unsigned long) old_ino,
|
||||
(unsigned long) stbuf.st_dev, (unsigned long) stbuf.st_ino);
|
||||
|
||||
if(idx >= 0 && idx != old_idx)
|
||||
fprintf(stderr, "xorriso_DEBUG: idx= %d , old_idx = %d\n", idx, old_idx);
|
||||
}
|
||||
#endif /* Xorriso_hardlink_update_debuG */
|
||||
|
||||
/* Overwrite all valid siblings : */
|
||||
for(i= low; i <= high; i++) {
|
||||
if(i == idx || xorriso->di_array[i] == NULL)
|
||||
continue;
|
||||
|
||||
#ifdef Xorriso_hardlink_update_debuG
|
||||
/* <<< */
|
||||
{
|
||||
ino_t ino;
|
||||
dev_t dev;
|
||||
|
||||
Xorriso__get_di(xorriso->di_array[i], &dev, &ino, 0);
|
||||
fprintf(stderr, "xorriso_DEBUG: iso_sibling= '%s' , dev= %lu , ino= %lu\n",
|
||||
node_path, (unsigned long) dev, (unsigned long) ino);
|
||||
}
|
||||
#endif /* Xorriso_hardlink_update_debuG */
|
||||
|
||||
xorriso->di_do_widen[i / 8]|= 1 << (i % 8);
|
||||
}
|
||||
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(do_overwrite)
|
||||
*compare_result|= (1<<15);
|
||||
if(old_idx >= 0 && (*compare_result & (3 << 21))) {
|
||||
/* The old di info is obsolete */
|
||||
if(xorriso->di_array[old_idx] != NULL)
|
||||
iso_node_unref(xorriso->di_array[old_idx]);
|
||||
xorriso->di_array[old_idx]= NULL;
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= do not destroy di_array
|
||||
*/
|
||||
int Xorriso_finish_hl_update(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, zero= 0;
|
||||
char *argv[4];
|
||||
struct Xorriso_lsT *disk_lst, *iso_lst;
|
||||
|
||||
if(xorriso->di_array == NULL)
|
||||
{ret= 1; goto ex;}
|
||||
disk_lst= xorriso->di_disk_paths;
|
||||
iso_lst= xorriso->di_iso_paths;
|
||||
while(disk_lst != NULL && iso_lst != NULL) {
|
||||
argv[0]= Xorriso_lst_get_text(iso_lst, 0);
|
||||
argv[1]= "-exec";
|
||||
argv[2]= "widen_hardlinks";
|
||||
argv[3]= Xorriso_lst_get_text(disk_lst, 0);
|
||||
zero= 0;
|
||||
ret= Xorriso_option_find(xorriso, 4, argv, &zero, 0); /* -findi */
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
disk_lst= Xorriso_lst_get_next(disk_lst, 0);
|
||||
iso_lst= Xorriso_lst_get_next(iso_lst, 0);
|
||||
}
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(!(flag & 1))
|
||||
Xorriso_destroy_di_array(xorriso, 0);
|
||||
return(ret);
|
||||
}
|
||||
|
62
xorriso/sort_cmp.h
Normal file
62
xorriso/sort_cmp.h
Normal file
@ -0,0 +1,62 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which sort and compare
|
||||
tree nodes.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_sort_cmp_includeD
|
||||
#define Xorriso_pvt_sort_cmp_includeD yes
|
||||
|
||||
|
||||
int Xorriso__findi_sorted_ino_cmp(const void *p1, const void *p2);
|
||||
|
||||
int Xorriso__hln_cmp(const void *p1, const void *p2);
|
||||
|
||||
int Xorriso__findi_sorted_cmp(const void *p1, const void *p2);
|
||||
|
||||
int Xorriso__search_node(void *node_array[], int n,
|
||||
int (*cmp)(const void *p1, const void *p2),
|
||||
void *node, int *idx, int flag);
|
||||
|
||||
int Xorriso_search_in_hln_array(struct XorrisO *xorriso,
|
||||
void *node, int *idx, int flag);
|
||||
|
||||
int Xorriso__get_di(IsoNode *node, dev_t *dev, ino_t *ino, int flag);
|
||||
|
||||
int Xorriso__di_ino_cmp(const void *p1, const void *p2);
|
||||
|
||||
int Xorriso__di_cmp(const void *p1, const void *p2);
|
||||
|
||||
int Xorriso__sort_di(void *node_array[], int count, int flag);
|
||||
|
||||
int Xorriso_invalidate_di_item(struct XorrisO *xorriso, IsoNode *node,
|
||||
int flag);
|
||||
|
||||
int Xorriso_search_di_range(struct XorrisO *xorriso, IsoNode *node,
|
||||
int *idx, int *low, int *high, int flag);
|
||||
|
||||
int Xorriso__node_lba_cmp(const void *node1, const void *node2);
|
||||
|
||||
int Xorriso__node_name_cmp(const void *node1, const void *node2);
|
||||
|
||||
int Xorriso_sorted_node_array(struct XorrisO *xorriso,
|
||||
IsoDir *dir_node,
|
||||
int *nodec, IsoNode ***node_array,
|
||||
off_t boss_mem, int flag);
|
||||
|
||||
int Xorriso_remake_hln_array(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_make_di_array(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_search_hardlinks(struct XorrisO *xorriso, IsoNode *node,
|
||||
int *node_idx, int *min_hl, int *max_hl, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_sort_cmp_includeD */
|
||||
|
2028
xorriso/text_io.c
Normal file
2028
xorriso/text_io.c
Normal file
File diff suppressed because it is too large
Load Diff
90
xorriso/text_io.h
Normal file
90
xorriso/text_io.h
Normal file
@ -0,0 +1,90 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of text i/o functions.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_textio_includeD
|
||||
#define Xorriso_pvt_textio_includeD yes
|
||||
|
||||
|
||||
int Xorriso_dialog_input(struct XorrisO *xorriso, char line[], int linesize,
|
||||
int flag);
|
||||
|
||||
/** @return -1= abort , 0= no , 1= yes
|
||||
*/
|
||||
int Xorriso_reassure(struct XorrisO *xorriso, char *cmd, char *which_will,
|
||||
int flag);
|
||||
|
||||
int Xorriso_request_confirmation(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* @param flag bit0= quoted multiline mode
|
||||
bit1= release allocated memory and return 1
|
||||
bit2= with bit0: warn of empty text arguments
|
||||
bit3= deliver as single quoted text including all whitespace
|
||||
and without any backslash interpretation
|
||||
@return -1=out of memory , 0=line format error , 1=ok, go on , 2=done
|
||||
*/
|
||||
int Xorriso_read_lines(struct XorrisO *xorriso, FILE *fp, int *linecount,
|
||||
int *argc, char ***argv, int flag);
|
||||
|
||||
int Xorriso_write_to_channel(struct XorrisO *xorriso,
|
||||
char *in_text, int channel_no, int flag);
|
||||
|
||||
int Xorriso_result(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_restxt(struct XorrisO *xorriso, char *text);
|
||||
|
||||
int Xorriso_info(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_mark(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
int Xorriso_write_session_log(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
int Xorriso_status_result(struct XorrisO *xorriso, char *filter, FILE *fp,
|
||||
int flag);
|
||||
|
||||
int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag);
|
||||
|
||||
int Xorriso_pacifier_reset(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* This call is to be issued by long running workers in short intervals.
|
||||
It will check whether enough time has elapsed since the last pacifier
|
||||
message and eventually issue an update message.
|
||||
@param what_done A sparse description of the action, preferrably in past
|
||||
tense. E.g. "done" , "files added".
|
||||
@param count The number of objects processed so far.
|
||||
Is ignored if <=0.
|
||||
@param todo The number of objects to be done in total.
|
||||
Is ignored if <=0.
|
||||
@param current_object A string telling the object currently processed.
|
||||
Ignored if "".
|
||||
@param flag bit0= report unconditionally, no time check
|
||||
*/
|
||||
int Xorriso_pacifier_callback(struct XorrisO *xorriso, char *what_done,
|
||||
off_t count, off_t todo, char *current_object,
|
||||
int flag);
|
||||
|
||||
int Xorriso_reset_counters(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_no_malloc_memory(struct XorrisO *xorriso, char **to_free,
|
||||
int flag);
|
||||
|
||||
int Xorriso_much_too_long(struct XorrisO *xorriso, int len, int flag);
|
||||
|
||||
int Xorriso_no_findjob(struct XorrisO *xorriso, char *cmd, int flag);
|
||||
|
||||
int Xorriso_report_md5_outcome(struct XorrisO *xorriso, char *severity,
|
||||
int flag);
|
||||
|
||||
int Xorriso_protect_stdout(struct XorrisO *xorriso, int flag);
|
||||
|
||||
#endif /* ! Xorriso_pvt_textio_includeD */
|
||||
|
2165
xorriso/write_run.c
Normal file
2165
xorriso/write_run.c
Normal file
File diff suppressed because it is too large
Load Diff
53
xorriso/write_run.h
Normal file
53
xorriso/write_run.h
Normal file
@ -0,0 +1,53 @@
|
||||
|
||||
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains declarations of functions which are needed to write
|
||||
sessions.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef Xorriso_pvt_write_run_includeD
|
||||
#define Xorriso_pvt_write_run_includeD yes
|
||||
|
||||
|
||||
/* CD specs say one shall not write tracks < 600 kiB */
|
||||
#define Xorriso_cd_min_track_sizE 300
|
||||
|
||||
|
||||
/* Default setting for -compliance */
|
||||
#define Xorriso_relax_compliance_defaulT \
|
||||
(isoburn_igopt_allow_deep_paths | isoburn_igopt_allow_longer_paths | \
|
||||
isoburn_igopt_always_gmt | \
|
||||
isoburn_igopt_rrip_version_1_10 | isoburn_igopt_aaip_susp_1_10 | \
|
||||
isoburn_igopt_only_iso_versions | isoburn_igopt_no_j_force_dots)
|
||||
|
||||
|
||||
int Xorriso_make_write_options(
|
||||
struct XorrisO *xorriso, struct burn_drive *drive,
|
||||
struct burn_write_opts **burn_options, int flag);
|
||||
|
||||
int Xorriso_sanitize_image_size(struct XorrisO *xorriso,
|
||||
struct burn_drive *drive, struct burn_disc *disc,
|
||||
struct burn_write_opts *burn_options, int flag);
|
||||
|
||||
int Xorriso_auto_format(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_set_system_area(struct XorrisO *xorriso, struct burn_drive *drive,
|
||||
IsoImage *img, struct isoburn_imgen_opts *sopts,
|
||||
int flag);
|
||||
|
||||
int Xorriso_check_burn_abort(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_pacifier_loop(struct XorrisO *xorriso, struct burn_drive *drive,
|
||||
int flag);
|
||||
|
||||
int Xorriso_set_isolinux_options(struct XorrisO *xorriso,
|
||||
IsoImage *image, int flag);
|
||||
|
||||
|
||||
#endif /* ! Xorriso_pvt_write_run_includeD */
|
||||
|
2344
xorriso/xorriso.1
2344
xorriso/xorriso.1
File diff suppressed because it is too large
Load Diff
20112
xorriso/xorriso.c
20112
xorriso/xorriso.c
File diff suppressed because it is too large
Load Diff
@ -1,12 +1,35 @@
|
||||
|
||||
/* Command line oriented batch and dialog tool which creates, loads,
|
||||
manipulates and burns ISO 9660 filesystem images.
|
||||
/* xorriso - libisoburn higher level API which creates, loads, manipulates
|
||||
and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2009 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2.
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains the public option interface of xorriso.
|
||||
This file contains the public API of xorriso which covers all of its
|
||||
operations.
|
||||
|
||||
An example of its usage is xorriso_main.c which checks version compatibility,
|
||||
creates a xorriso object, initializes the libraries, and runs the command
|
||||
interpreters of the API to constitute the command line oriented batch and
|
||||
dialog tool xorriso.
|
||||
|
||||
Alternatively to command interpreters it is possible to run all options of
|
||||
xorriso directly via the calls of the "Options API".
|
||||
The "Problem Status and Message API" shall then be used to obtain the
|
||||
text output of the options.
|
||||
|
||||
Mandatory calls are:
|
||||
Xorriso_new(), Xorriso_startup_libraries(), Xorriso_destroy()
|
||||
|
||||
This architecture is fully public since version 0.5.8. From then on, new
|
||||
features get marked by
|
||||
@since major.minor.micro
|
||||
If this mark is missing, then the feature was present before release 0.5.8.
|
||||
|
||||
|
||||
There is a lower level of API which consists of libisofs.h, libburn.h and
|
||||
libisoburn.h. One should not mix those calls with the ones of xorriso.h .
|
||||
*/
|
||||
|
||||
#ifndef Xorriso_includeD
|
||||
@ -16,17 +39,102 @@
|
||||
struct XorrisO;
|
||||
|
||||
|
||||
#define Xorriso_program_versioN "0.4.1"
|
||||
|
||||
/* This may be changed to Xorriso_GNU_xorrisO in order to create GNU xorriso
|
||||
under GPLv3+ derived from above GPLv2+.
|
||||
*/
|
||||
#define Xorriso_libburnia_xorrisO yes
|
||||
|
||||
|
||||
/* --------------------- Fundamental Management ------------------- */
|
||||
|
||||
|
||||
/* Get the version text (e.g. "0.4.1") of the program code.
|
||||
/** These three release version numbers tell the revision of this header file
|
||||
and of the API which it describes. They shall be memorized by applications
|
||||
at build time.
|
||||
@since 0.5.8
|
||||
*/
|
||||
#define Xorriso_header_version_majoR 0
|
||||
#define Xorriso_header_version_minoR 6
|
||||
#define Xorriso_header_version_micrO 0
|
||||
|
||||
|
||||
/** Eventually something like ".pl01" to indicate a bug fix. Normally empty.
|
||||
@since 0.5.8
|
||||
*/
|
||||
#define Xorriso_program_patch_leveL ""
|
||||
|
||||
|
||||
/** Obtain the three release version numbers of the library. These are the
|
||||
numbers encountered by the application when linking with libisoburn,
|
||||
i.e. possibly not before run time.
|
||||
Better do not base the fundamental compatibility decision of an application
|
||||
on these numbers. For a reliable check use Xorriso__is_compatible().
|
||||
@since 0.5.8
|
||||
@param major The maturity version (0 for now, as we are still learning)
|
||||
@param minor The development goal version.
|
||||
@param micro The development step version. This has an additional meaning:
|
||||
|
||||
Pare numbers indicate a version with frozen API. I.e. you can
|
||||
rely on the same set of features to be present in all
|
||||
published releases with that major.minor.micro combination.
|
||||
Features of a pare release will stay available and ABI
|
||||
compatible as long as the SONAME of libisoburn stays "1".
|
||||
Currently there are no plans to ever change the SONAME.
|
||||
|
||||
Odd numbers indicate that API upgrades are in progress.
|
||||
I.e. new features might be already present or they might
|
||||
be still missing. Newly introduced features may be changed
|
||||
incompatibly or even be revoked before release of a pare
|
||||
version.
|
||||
So micro revisions {1,3,5,7,9} should never be used for
|
||||
dynamic linking unless the proper library match can be
|
||||
guaranteed by external circumstances.
|
||||
|
||||
@return 1 success, <=0 might in future become an error indication
|
||||
*/
|
||||
void Xorriso__version(int *major, int *minor, int *micro);
|
||||
|
||||
|
||||
/** Check whether all features of header file xorriso.h from the given
|
||||
major.minor.micro revision triple can be delivered by the library version
|
||||
which is performing this call.
|
||||
if (! Xorriso__is_compatible(Xorriso_header_version_majoR,
|
||||
Xorriso_header_version_minoR,
|
||||
Xorriso_header_version_micrO, 0))
|
||||
...refuse to start the program with this dynamic library version...
|
||||
@since 0.5.8
|
||||
@param major obtained at build time
|
||||
@param minor obtained at build time
|
||||
@param micro obtained at build time
|
||||
@param flag Bitfield for control purposes. Unused yet. Submit 0.
|
||||
@return 1= library can work for caller
|
||||
0= library is not usable in some aspects. Caller must restrict
|
||||
itself to an earlier API version or must not use this libray
|
||||
at all.
|
||||
*/
|
||||
int Xorriso__is_compatible(int major, int minor, int micro, int flag);
|
||||
|
||||
|
||||
/* Get the patch level text (e.g. "" or ".pl01") of the program code.
|
||||
@param flag unused yet, submit 0
|
||||
@return readonly character string
|
||||
*/
|
||||
char *Xorriso__get_version_text(int flag);
|
||||
char *Xorriso__get_patch_level_text(int flag);
|
||||
|
||||
|
||||
/* Choose how Xorriso_startup_libraries() and the XorrisO object shall
|
||||
prepare for eventual signals.
|
||||
@param behavior Default is behavior 1.
|
||||
0= no own signal handling. The main application has to do
|
||||
that. Do not start burn runs without any handling !
|
||||
1= use libburn signal handler. Most time with action
|
||||
0. During writing, formatting, blanking: 0x30.
|
||||
Only usable with a single xorriso object.
|
||||
@param flag unused yet, submit 0
|
||||
@return <= 0 is error, >0 is success
|
||||
*/
|
||||
int Xorriso__preset_signal_behavior(int behavior, int flag);
|
||||
|
||||
|
||||
/* Mandatory call:
|
||||
@ -36,18 +144,85 @@ char *Xorriso__get_version_text(int flag);
|
||||
@param progname typically argv[0] of main(). Some leafnames of the progname
|
||||
path have special meaning and trigger special behavior:
|
||||
"osirrox" allows image-to-disk copying: -osirrox "on"
|
||||
"xorrisofs" activates permanent mkisofs emulation
|
||||
"xorrisofs" activates -as "mkisofs" emulation from start
|
||||
"genisofs" alias of "xorrisofs"
|
||||
"mkisofs" alias of "xorrisofs"
|
||||
"genisoimage" alias of "xorrisofs"
|
||||
"xorrecord" activates -as "cdrecord" emulation from start
|
||||
"cdrecord" alias of "xorrecord"
|
||||
"wodim" alias of "xorrecord"
|
||||
"cdrskin" alias of "xorrecord"
|
||||
@param flag unused yet, submit 0
|
||||
@return >0 success , <=0 failure, no object created
|
||||
*/
|
||||
int Xorriso_new(struct XorrisO ** xorriso, char *progname, int flag);
|
||||
|
||||
|
||||
/* Interpret certain commands which shall get into effect before the
|
||||
libraries get initialized:
|
||||
/* Note: Between Xorriso_new() and the next call Xorriso_startup_libraries()
|
||||
there may be called the special command interpreter
|
||||
Xorriso_prescan_args().
|
||||
The other command interpreters may be used only after
|
||||
Xorriso_startup_libraries(). The same restriction applies to the
|
||||
calls of the Options API further below.
|
||||
*/
|
||||
|
||||
|
||||
/* Mandatory call:
|
||||
It has to be made before calling any function listed below this point.
|
||||
Only exception is the special command interpreter Xorriso_prescan_args().
|
||||
|
||||
Make global library initializations.
|
||||
This must be done with the first xorriso object that gets created and
|
||||
with the first xorriso object that gets created after Xorriso_destroy(,1).
|
||||
@param xorriso The context object.
|
||||
@param flag unused yet, submit 0
|
||||
@return <=0 error , >0 success
|
||||
*/
|
||||
int Xorriso_startup_libraries(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
/* Note: After library startup, you may run Command Interpreters or call
|
||||
functions from the Options API.
|
||||
|
||||
Wenn all desired activities are done, you may check whether there are
|
||||
uncommited chages pending, compute an exit value, destroy the XorrisO
|
||||
object, and exit your program.
|
||||
*/
|
||||
|
||||
|
||||
/* Inquire whether option -commit would make sense.
|
||||
@param xorriso The context object to inquire.
|
||||
@param flag unused yet, submit 0
|
||||
@return 0= -commit would have nothing to do
|
||||
1= a new image session would emerge at -commit
|
||||
*/
|
||||
int Xorriso_change_is_pending(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
/* Compute the exit value from the recorded maximum event severity.
|
||||
@param xorriso The context object to inquire.
|
||||
@param flag unused yet, submit 0
|
||||
@return The computed exit value
|
||||
*/
|
||||
int Xorriso_make_return_value(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
/* Mandatory call:
|
||||
Destroy xorriso object when it is no longer needed.
|
||||
@param xorriso The context object to destroy. *xorriso will become NULL.
|
||||
@param flag bit0= Perform global library shutdown.
|
||||
Use only with last xorriso object to be destroyed.
|
||||
@return <=0 error, >0 success
|
||||
*/
|
||||
int Xorriso_destroy(struct XorrisO **xorriso, int flag);
|
||||
|
||||
|
||||
/* --------------------- Command Interpreters ------------------- */
|
||||
|
||||
|
||||
/* This special interpreter is eventually called between Xorriso_new() and
|
||||
Xorriso_startup_libraries(). It interprets certain commands which shall
|
||||
get into effect before the libraries get initialized:
|
||||
-abort_on , -report_about , -return_with , -list_delimiter
|
||||
Some commands get executed only if they are the only command in argv:
|
||||
-prog_help , -help , -no_rc
|
||||
@ -70,19 +245,6 @@ int Xorriso_prescan_args(struct XorrisO *xorriso, int argc, char **argv,
|
||||
int flag);
|
||||
|
||||
|
||||
/* Mandatory call:
|
||||
It has to be made before calling any function listed below this point.
|
||||
|
||||
Make global library initializations.
|
||||
This must be done with the first xorriso object that gets created and
|
||||
with the first xorriso object that gets created after Xorriso_destroy(,1).
|
||||
@param xorriso The context object.
|
||||
@param flag unused yet, submit 0
|
||||
@return <=0 error , >0 success
|
||||
*/
|
||||
int Xorriso_startup_libraries(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
/* Read and interpret commands from eventual startup files as listed in
|
||||
man xorriso.
|
||||
@param xorriso The context object in which to perform the commands.
|
||||
@ -102,6 +264,12 @@ int Xorriso_read_rc(struct XorrisO *xorriso, int flag);
|
||||
@param argc Number of arguments.
|
||||
@param argv The arguments. (*argv)[0] contains the program name.
|
||||
(*argv)[1] to (*argv)[argc-1] contain commands and parameters
|
||||
If argv after the call differs from argv before the call,
|
||||
then one should dispose it later by:
|
||||
for(i= 0; i < argc; i++)
|
||||
if(argv[i] != NULL)
|
||||
free(argv[i]);
|
||||
free(argv);
|
||||
@param flag unused yet, submit 0
|
||||
@return <= 0 error , > 0 success
|
||||
*/
|
||||
@ -158,33 +326,6 @@ int Xorriso_execute_option(struct XorrisO *xorriso, char *line, int flag);
|
||||
int Xorriso_dialog(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
/* Inquire whether option -commit would make sense.
|
||||
@param xorriso The context object to inquire.
|
||||
@param flag unused yet, submit 0
|
||||
@return 0= -commit would have nothing to do
|
||||
1= a new image session would emerge at -commit
|
||||
*/
|
||||
int Xorriso_change_is_pending(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
/* Compute the exit value from the recorded maximum event severity.
|
||||
@param xorriso The context object to inquire.
|
||||
@param flag unused yet, submit 0
|
||||
@return The computed exit value
|
||||
*/
|
||||
int Xorriso_make_return_value(struct XorrisO *xorriso, int flag);
|
||||
|
||||
|
||||
/* Mandatory call:
|
||||
Destroy xorriso object when it is no longer needed.
|
||||
@param xorriso The context object to destroy. *xorriso will become NULL.
|
||||
@param flag bit0= Perform global library shutdown.
|
||||
Use only with last xorriso object to be destroyed.
|
||||
@return <=0 error, >0 success
|
||||
*/
|
||||
int Xorriso_destroy(struct XorrisO **xorriso, int flag);
|
||||
|
||||
|
||||
/* --------------------- Problem Status and Message API ------------------- */
|
||||
|
||||
|
||||
@ -229,7 +370,7 @@ int Xorriso_msgs_submit_void(void *xorriso,
|
||||
/** Evaluate an advise whether to abort or whether to go on with option
|
||||
processing. This should be called after any option function was processed.
|
||||
It updates the problem status by processing the library message queues
|
||||
and then it uses this status and the submitted return value ot the
|
||||
and then it uses this status and the submitted return value of the
|
||||
option function to evaluate the situation.
|
||||
@param xorriso The environment handle
|
||||
@param ret The return value of the previously called option function
|
||||
@ -258,8 +399,7 @@ int Xorriso_set_problem_status(struct XorrisO *xorriso, char *severity,
|
||||
|
||||
|
||||
/* The next two functions are part of Xorriso_eval_problem_status().
|
||||
You may use them to build an own advisor function or to drain the
|
||||
library message queues more frequently.
|
||||
You may use them to build an own advisor function.
|
||||
*/
|
||||
|
||||
/** Obtain the current problem status of the xorriso handle.
|
||||
@ -277,7 +417,10 @@ int Xorriso_get_problem_status(struct XorrisO *xorriso, char severity[80],
|
||||
the severity of the library events like the severity of a message submitted
|
||||
via Xorriso_msgs_submit().
|
||||
xorriso sets the message queues of the libraries to queuing "ALL".
|
||||
So it is essential that they get drained regularly.
|
||||
Many inner functions of xorriso call Xorriso_process_msg_queues() on their
|
||||
own because they expect library output pending. Nevertheless, a loop of
|
||||
xorriso option calls should either call Xorriso_eval_problem_status() or
|
||||
Xorriso_process_msg_queues() with each cycle.
|
||||
@param xorriso The environment handle
|
||||
@param flag Unused yet. Submit 0.
|
||||
@return 1 on success, <=0 if failure
|
||||
@ -388,6 +531,7 @@ 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.
|
||||
All pointers obtained by Xorriso_lst_get_text() become invalid by this.
|
||||
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.
|
||||
@ -426,11 +570,13 @@ int Xorriso_lst_destroy_all(struct Xorriso_lsT **lstring, int flag);
|
||||
/* Option -abort_on */
|
||||
int Xorriso_option_abort_on(struct XorrisO *xorriso, char *severity, int flag);
|
||||
|
||||
/* Option -abstract_file */
|
||||
int Xorriso_option_abstract_file(struct XorrisO *xorriso, char *name,
|
||||
int flag);
|
||||
|
||||
/* Option -acl "on"|"off" */
|
||||
int Xorriso_option_acl(struct XorrisO *xorriso, char *mode, int flag);
|
||||
|
||||
|
||||
/* Option -add */
|
||||
/* @param flag bit0=do not report the added item
|
||||
bit1=do not reset pacifier, no final pacifier message
|
||||
@ -475,6 +621,9 @@ int Xorriso_option_backslash_codes(struct XorrisO *xorriso, char *mode,
|
||||
/* Option -ban_stdio_write */
|
||||
int Xorriso_option_ban_stdio_write(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* Option -biblio_file */
|
||||
int Xorriso_option_biblio_file(struct XorrisO *xorriso, char *name, int flag);
|
||||
|
||||
/* Option -blank and -format */
|
||||
/* @param flag bit0= format rather than blank
|
||||
@return <=0 error , 1 success, 2 revoked by -reassure
|
||||
@ -485,6 +634,9 @@ int Xorriso_option_blank(struct XorrisO *xorriso, char *mode, int flag);
|
||||
int Xorriso_option_boot_image(struct XorrisO *xorriso, char *form,
|
||||
char *treatment, int flag);
|
||||
|
||||
/* Option -calm_drive */
|
||||
int Xorriso_option_calm_drive(struct XorrisO *xorriso, char *which, int flag);
|
||||
|
||||
/* Option -cd alias -cdi */
|
||||
int Xorriso_option_cdi(struct XorrisO *xorriso, char *iso_rr_path, int flag);
|
||||
|
||||
@ -535,6 +687,9 @@ int Xorriso_option_chowni(struct XorrisO *xorriso, char *uid,
|
||||
/* Option -close "on"|"off" */
|
||||
int Xorriso_option_close(struct XorrisO *xorriso, char *mode, int flag);
|
||||
|
||||
/* Option -close_filter_list */
|
||||
int Xorriso_option_close_filter_list(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* Option -commit */
|
||||
/* @param flag bit0= leave indrive and outdrive aquired as they were,
|
||||
i.e. do not aquire outdrive as new in-out-drive
|
||||
@ -557,6 +712,13 @@ int Xorriso_option_commit_eject(struct XorrisO *xorriso, char *which, int flag);
|
||||
int Xorriso_option_compare(struct XorrisO *xorriso, char *disk_path,
|
||||
char *iso_path, int flag);
|
||||
|
||||
/* Option -compliance */
|
||||
int Xorriso_option_compliance(struct XorrisO *xorriso, char *mode, int flag);
|
||||
|
||||
/* Option -copyright_file */
|
||||
int Xorriso_option_copyright_file(struct XorrisO *xorriso, char *name,
|
||||
int flag);
|
||||
|
||||
/* Option -cpr alias -cpri */
|
||||
int Xorriso_option_cpri( struct XorrisO *xorriso, int argc, char **argv,
|
||||
int *idx, int flag);
|
||||
@ -599,6 +761,9 @@ int Xorriso_option_drive_class(struct XorrisO *xorriso,
|
||||
/* Option -dummy "on"|"off" */
|
||||
int Xorriso_option_dummy(struct XorrisO *xorriso, char *mode, int flag);
|
||||
|
||||
/* Option -dvd_obs "default"|"32k"|"64k" */
|
||||
int Xorriso_option_dvd_obs(struct XorrisO *xorriso, char *obs, int flag);
|
||||
|
||||
/* Option -eject */
|
||||
/* @param flag bit0=do not report toc of eventually remaining drives
|
||||
*/
|
||||
@ -634,8 +799,10 @@ int Xorriso_option_extract(struct XorrisO *xorriso, char *disk_path,
|
||||
int Xorriso_option_extract_cut(struct XorrisO *xorriso, char *iso_rr_path,
|
||||
char *start, char *count, char *disk_path, int flag);
|
||||
|
||||
/* Option -follow */
|
||||
int Xorriso_option_follow(struct XorrisO *xorriso, char *mode, int flag);
|
||||
/* Option -file_size_limit */
|
||||
int Xorriso_option_file_size_limit(struct XorrisO *xorriso,
|
||||
int argc, char **argv, int *idx, int flag);
|
||||
|
||||
|
||||
/* Option -find alias -findi, and -findx */
|
||||
/* @param flag bit0= -findx rather than -findi
|
||||
@ -645,6 +812,9 @@ int Xorriso_option_follow(struct XorrisO *xorriso, char *mode, int flag);
|
||||
int Xorriso_option_find(struct XorrisO *xorriso, int argc, char **argv,
|
||||
int *idx, int flag);
|
||||
|
||||
/* Option -follow */
|
||||
int Xorriso_option_follow(struct XorrisO *xorriso, char *mode, int flag);
|
||||
|
||||
/* Option -fs */
|
||||
int Xorriso_option_fs(struct XorrisO *xorriso, char *size, int flag);
|
||||
|
||||
@ -666,6 +836,10 @@ int Xorriso_option_hardlinks(struct XorrisO *xorriso, char *mode, int flag);
|
||||
/* Option -help and part of -prog_help */
|
||||
int Xorriso_option_help(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* Option -hide */
|
||||
int Xorriso_option_hide(struct XorrisO *xorriso, char *hide_state,
|
||||
int argc, char **argv, int *idx, int flag);
|
||||
|
||||
/* Option -history */
|
||||
int Xorriso_option_history(struct XorrisO *xorriso, char *line, int flag);
|
||||
|
||||
@ -683,6 +857,10 @@ int Xorriso_option_list_delimiter(struct XorrisO *xorriso, char *text,
|
||||
/* Option -list_formats */
|
||||
int Xorriso_option_list_formats(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* Option -list_profiles */
|
||||
int Xorriso_option_list_profiles(struct XorrisO *xorriso, char *which,
|
||||
int flag);
|
||||
|
||||
/* Option -load session|track|sbsector value */
|
||||
/* @param flag bit0= with adr_mode sbsector: adr_value is possibly 16 too high
|
||||
@return <=0 error , 1 success, 2 revoked by -reassure
|
||||
@ -740,12 +918,16 @@ int Xorriso_option_md5(struct XorrisO *xorriso, char *mode, int flag);
|
||||
int Xorriso_option_mkdiri(struct XorrisO *xorriso, int argc, char **argv,
|
||||
int *idx, int flag);
|
||||
|
||||
/* Option -mount */
|
||||
/* @param bit0= print mount command to result channel rather than performing it
|
||||
*/
|
||||
/* Options -mount , -mount_cmd , -session_string */
|
||||
/* @param bit0= -mount_cmd: print mount command to result channel rather
|
||||
than performing it
|
||||
bit1= perform -session_string rather than -mount_cmd
|
||||
*/
|
||||
int Xorriso_option_mount(struct XorrisO *xorriso, char *dev, char *adr_mode,
|
||||
char *adr, char *cmd, int flag);
|
||||
|
||||
/* Option -mount_opts option[:...] */
|
||||
int Xorriso_option_mount_opts(struct XorrisO *xorriso, char *mode, int flag);
|
||||
|
||||
/* Option -mv alias -mvi */
|
||||
int Xorriso_option_mvi(struct XorrisO *xorriso, int argc, char **argv,
|
||||
@ -754,14 +936,28 @@ int Xorriso_option_mvi(struct XorrisO *xorriso, int argc, char **argv,
|
||||
/* Option -no_rc */
|
||||
int Xorriso_option_no_rc(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* Option -not_leaf */
|
||||
/* Option -not_leaf , -as mkisofs -hide without '/' */
|
||||
/* @param flag bit0= add to iso_rr hide list rather than to disk exclusions
|
||||
@since 0.6.0
|
||||
bit1= add to joliet hide list rather than disk exclusions
|
||||
@since 0.6.0
|
||||
*/
|
||||
int Xorriso_option_not_leaf(struct XorrisO *xorriso, char *pattern, int flag);
|
||||
|
||||
/* Option -not_list , -quoted_not_list */
|
||||
/* @param flag bit0= -quoted_not_list */
|
||||
int Xorriso_option_not_list(struct XorrisO *xorriso, char *adr, int flag);
|
||||
|
||||
/* Option -not_paths */
|
||||
/* Option -not_mgt */
|
||||
int Xorriso_option_not_mgt(struct XorrisO *xorriso, char *setting, int flag);
|
||||
|
||||
/* Option -not_paths , -as mkisofs -hide with '/' */
|
||||
/* @param flag bit0= add to iso_rr hide list rather than to disk exclusions
|
||||
@since 0.6.0
|
||||
bit1= add to joliet hide list rather than disk exclusions
|
||||
@since 0.6.0
|
||||
bit2= enable disk pattern expansion regardless of -disk_pattern
|
||||
*/
|
||||
int Xorriso_option_not_paths(struct XorrisO *xorriso, int argc, char **argv,
|
||||
int *idx, int flag);
|
||||
|
||||
@ -810,18 +1006,27 @@ int Xorriso_option_print_size(struct XorrisO *xorriso, int flag);
|
||||
/* Option -prog */
|
||||
int Xorriso_option_prog(struct XorrisO *xorriso, char *name, int flag);
|
||||
|
||||
/* Option -prompt */
|
||||
int Xorriso_option_prompt(struct XorrisO *xorriso, char *text, int flag);
|
||||
|
||||
/* Option -prog_help */
|
||||
int Xorriso_option_prog_help(struct XorrisO *xorriso, char *name, int flag);
|
||||
|
||||
/* Option -publisher */
|
||||
int Xorriso_option_publisher(struct XorrisO *xorriso, char *name, int flag);
|
||||
|
||||
/* Option -pvd_info */
|
||||
int Xorriso_option_pvd_info(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* Option -pwd alias -pwdi */
|
||||
int Xorriso_option_pwdi(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* Option -pwdx */
|
||||
int Xorriso_option_pwdx(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* Option -read_mkisofsrc */
|
||||
int Xorriso_option_read_mkisofsrc(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* Option -reassure "on"|"tree"|"off" */
|
||||
int Xorriso_option_reassure(struct XorrisO *xorriso, char *mode, int flag);
|
||||
|
||||
@ -855,6 +1060,12 @@ int Xorriso_option_rollback(struct XorrisO *xorriso, int flag);
|
||||
int Xorriso_option_rom_toc_scan(struct XorrisO *xorriso, char *mode,
|
||||
int flag);
|
||||
|
||||
/* Option -scdbackup_tag */
|
||||
int Xorriso_option_scdbackup_tag(struct XorrisO *xorriso, char *list_path,
|
||||
char *record_name, int flag);
|
||||
/* Option -scsi_log */
|
||||
int Xorriso_option_scsi_log(struct XorrisO *xorriso, char *mode, int flag);
|
||||
|
||||
/* Option -session_log */
|
||||
int Xorriso_option_session_log(struct XorrisO *xorriso, char *path, int flag);
|
||||
|
||||
@ -897,10 +1108,16 @@ int Xorriso_option_status(struct XorrisO *xorriso, char *mode, int flag);
|
||||
int Xorriso_option_status_history_max(struct XorrisO *xorriso, int num1,
|
||||
int flag);
|
||||
|
||||
/* Option -stdio_sync "on"|"off"|size */
|
||||
int Xorriso_option_stdio_sync(struct XorrisO *xorriso, char *rythm, int flag);
|
||||
|
||||
/* Option -stream_recording */
|
||||
int Xorriso_option_stream_recording(struct XorrisO *xorriso, char *mode,
|
||||
int flag);
|
||||
|
||||
/* Option -system_id */
|
||||
int Xorriso_option_system_id(struct XorrisO *xorriso, char *name, int flag);
|
||||
|
||||
/* Option -tell_media_space */
|
||||
int Xorriso_option_tell_media_space(struct XorrisO *xorriso, int flag);
|
||||
|
||||
@ -934,8 +1151,17 @@ int Xorriso_option_use_readline(struct XorrisO *xorriso, char *mode, int flag);
|
||||
int Xorriso_option_version(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* Option -volid */
|
||||
/* @param flag bit0= do not warn of problematic volid
|
||||
*/
|
||||
int Xorriso_option_volid(struct XorrisO *xorriso, char *volid, int flag);
|
||||
|
||||
/* Option -volset_id */
|
||||
int Xorriso_option_volset_id(struct XorrisO *xorriso, char *name, int flag);
|
||||
|
||||
/* Option -volume_date */
|
||||
int Xorriso_option_volume_date(struct XorrisO *xorriso,
|
||||
char *time_type, char *timestring, int flag);
|
||||
|
||||
/* Option -xattr "on"|"off" */
|
||||
int Xorriso_option_xattr(struct XorrisO *xorriso, char *mode, int flag);
|
||||
|
||||
|
4191
xorriso/xorriso.info
Normal file
4191
xorriso/xorriso.info
Normal file
File diff suppressed because it is too large
Load Diff
5012
xorriso/xorriso.texi
Normal file
5012
xorriso/xorriso.texi
Normal file
File diff suppressed because it is too large
Load Diff
10
xorriso/xorriso_bootstrap.txt
Executable file
10
xorriso/xorriso_bootstrap.txt
Executable file
@ -0,0 +1,10 @@
|
||||
#!/bin/sh -x
|
||||
|
||||
aclocal
|
||||
libtoolize --copy --force
|
||||
autoconf
|
||||
|
||||
autoheader
|
||||
|
||||
automake --foreign --add-missing --copy --include-deps
|
||||
|
@ -1,20 +1,23 @@
|
||||
<HTML>
|
||||
|
||||
<HEAD>
|
||||
<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="description" CONTENT="GNU 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, GNU/Linux, Linux, FreeBSD, Solaris, recording, burning, CD-R, CD-RW, DVD-R, DVD-RW, DVD+RW, DVD+R, DVD+R DL, BD-RE, BD-R, scdbackup">
|
||||
<META NAME="robots" CONTENT="follow">
|
||||
<TITLE>xorriso homepage english</TITLE>
|
||||
<TITLE>GNU xorriso - GNU Project - Free Software Foundation</TITLE>
|
||||
<LINK rev="made" href="mailto:webmasters@gnu.org">
|
||||
</HEAD>
|
||||
|
||||
<BODY BGCOLOR="#F5DEB3" TEXT=#000000 LINK=#0000A0 VLINK=#800000>
|
||||
<BODY BGCOLOR="#F5DEB3" TEXT=#000000 LINK=#0000A0 VLINK=#800000 ALINK=#A000A0>
|
||||
<FONT SIZE=+1>
|
||||
|
||||
<CENTER>
|
||||
<P><H2> Homepage of </H2>
|
||||
<H1> xorriso </H1>
|
||||
<P>
|
||||
<H1>GNU xorriso</H1>
|
||||
|
||||
<H2>ISO 9660 Rock Ridge Filesystem Manipulator for Linux and FreeBSD</H2>
|
||||
<H2>ISO 9660 Rock Ridge Filesystem Manipulator<BR>
|
||||
for GNU/Linux, FreeBSD, Solaris</H2>
|
||||
</P>
|
||||
</CENTER>
|
||||
|
||||
<P>
|
||||
@ -25,7 +28,7 @@ session-wise manipulation of such filesystems. It can load the management
|
||||
information of existing ISO images and it writes the session results to
|
||||
optical media or to filesystem objects.
|
||||
<BR>
|
||||
Vice versa xorriso is able to restore file objects from ISO 9660 filesystems.
|
||||
Vice versa xorriso is able to copy file objects out of ISO 9660 filesystems.
|
||||
</P>
|
||||
<P>
|
||||
|
||||
@ -35,23 +38,32 @@ Vice versa xorriso is able to restore file objects from ISO 9660 filesystems.
|
||||
|
||||
<P>
|
||||
<H2>Hardware requirements:</H2>
|
||||
A CD/DVD/BD recorder suitable for
|
||||
<A HREF="http://libburnia-project.org">http://libburnia-project.org</A> <BR>
|
||||
(SCSI , ATA , USB , or SATA writers compliant to standard MMC-3 for CD
|
||||
and to MMC-5 for DVD or BD).
|
||||
About any CD, DVD, or BD recorder produced in the recent ten years.
|
||||
<BR>
|
||||
<A HREF="http://libburnia-project.org">libburn</A>
|
||||
supports recorders which are compliant to standards MMC-1 for CD and
|
||||
MMC-5 for DVD or BD.
|
||||
<BR>
|
||||
GNU/Linux, FreeBSD, and Solaris allow to access drives connected
|
||||
via SCSI, PATA (aka IDE, ATA), USB, or SATA.
|
||||
<BR>
|
||||
xorriso also operates on ISO images in data files or block devices.
|
||||
Images or add-on sessions may be written to about any kind of file object.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
<H2>Software requirements :</H2>
|
||||
<DL>
|
||||
<DT>Linux with kernel 2.4 or higher, libc, libpthread :</DT>
|
||||
<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>
|
||||
<DT>GNU/Linux with kernel 2.4 or higher, libc, libpthread :</DT>
|
||||
<DD>With kernel 2.4 a PATA/IDE drive has to be under ide-scsi emulation.</DD>
|
||||
<DD>With kernel 2.6 ide-scsi is not needed.</DD>
|
||||
<DT>or FreeBSD, libc, libpthread :</DT>
|
||||
<DD>ATAPI/CAM support has to be enabled in the kernel, see atapicam(4).</DD>
|
||||
<DD>PATA/IDE drives need atapicam running.</DD>
|
||||
<DD>SATA drives need atapicam or ahci running.</DD>
|
||||
<DD>libcam has to be installed.</DD>
|
||||
<DD>libiconv has to be installed.</DD>
|
||||
<DT>or Solaris, libc, libpthread :</DT>
|
||||
<DD>Tested on kernel 5.11, hopefully suitable for older ones too.</DD>
|
||||
<DT>or some other X/Open system, libc, libpthread :</DT>
|
||||
<DD>
|
||||
There will be no direct operation of optical drives, but only POSIX i/o
|
||||
@ -68,14 +80,14 @@ but rather not with CD, DVD-R, DVD+R, BD-R.
|
||||
<DT>libreadline and libreadline-dev</DT>
|
||||
<DD>eventually make dialog more convenient.</DD>
|
||||
<DT>libacl and libacl-devel</DT>
|
||||
<DD>eventually allow on Linux to get and set ACLs.</DD>
|
||||
<DD>eventually allow on GNU/Linux to get and set ACLs.</DD>
|
||||
<DT>zlib and zlib-devel</DT>
|
||||
<DD>eventually allow zisofs and gzip compression.</DD>
|
||||
</DL>
|
||||
</P>
|
||||
|
||||
<P>
|
||||
This program has been tested on Linux, FreeBSD, and Solaris systems.<BR>
|
||||
This program has been tested on GNU/Linux, FreeBSD, and Solaris systems.<BR>
|
||||
For ports to other usable systems <A HREF="#contact">contact us</A>.
|
||||
</P>
|
||||
|
||||
@ -103,21 +115,24 @@ Updates ISO subtrees incrementally to match given disk subtrees.
|
||||
Can record and restore hard link relations, ACL, and xattr.
|
||||
</LI>
|
||||
<LI>
|
||||
Can attach MD5 checksums to each data file and the whole session.
|
||||
</LI>
|
||||
<LI>
|
||||
File content may get zisofs or gzip compressed or filtered by external
|
||||
processes.
|
||||
</LI>
|
||||
<LI>
|
||||
Can activate ISOLINUX and GRUB boot images by El Torito boot record and MBR.
|
||||
</LI>
|
||||
<LI>
|
||||
Writes result as completely new image or as add-on session
|
||||
to optical media or filesystem objects.
|
||||
</LI>
|
||||
<LI>
|
||||
Can activate ISOLINUX boot images by El Torito boot record.
|
||||
</LI>
|
||||
<LI>
|
||||
Can perform multi-session tasks as emulation of mkisofs and cdrecord.
|
||||
</LI>
|
||||
<LI>
|
||||
Can issue commands to mount older sessions on Linux or FreeBSD.
|
||||
Can issue commands to mount older sessions on GNU/Linux or FreeBSD.
|
||||
</LI>
|
||||
<LI>
|
||||
Can check media for damages and copy readable blocks to disk.
|
||||
@ -274,23 +289,27 @@ to match the new disk trees.
|
||||
Older states can be retrieved by help of mount options like "sbsector="
|
||||
or by help of xorriso option -mount.
|
||||
<BR>
|
||||
Eventual ACL or xattr will be recorded. Data reading will be avoided by
|
||||
accelerator option -disk_dev_ino.
|
||||
Eventual ACL, xattr and hardlink relations will be recorded. MD5 checksums
|
||||
will be computed and recorded. Data comparison will be avoided by accelerator
|
||||
option -disk_dev_ino. After writing, the new session will be checked
|
||||
by its recorded MD5.
|
||||
<BR>
|
||||
Only blank media or media with volume id "PROJECTS_MAIL_..." will be accepted.
|
||||
Files with names ending by ".o" or ".swp" are excluded by options -not_leaf.
|
||||
</DT>
|
||||
<DD>$<KBD> xorriso -acl on -xattr on -disk_dev_ino on \</KBD></DD>
|
||||
<DD>$<KBD> xorriso -for_backup -disk_dev_ino on \</KBD></DD>
|
||||
<DD><KBD> -assert_volid 'PROJECTS_MAIL_*' FATAL \</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> -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/projects /projects \</KBD></DD>
|
||||
<DD><KBD> -update_r /home/thomas/personal_mail /personal_mail \</KBD></DD>
|
||||
<DD><KBD> -commit -toc -eject all</KBD></DD>
|
||||
<DD><KBD> -commit -toc -check_md5 FAILURE -- -eject all</KBD></DD>
|
||||
|
||||
<DT>
|
||||
To apply zisofs compression to those data files which get newly copied from
|
||||
the local filesystem, perform immediately before -commit :
|
||||
<DD><KBD> -hardlinks perform_update \</KBD></DD>
|
||||
<DD>
|
||||
<KBD> -find / -type f -pending_data -exec set_filter --zisofs -- \</KBD></DD>
|
||||
</DD>
|
||||
@ -420,10 +439,20 @@ files or trees to disk:
|
||||
<P>
|
||||
<DL>
|
||||
<DT><H3>Download as source code (see README):</H3></DT>
|
||||
<DD><A HREF="xorriso-0.4.0.pl01.tar.gz">xorriso-0.4.0.pl01.tar.gz</A>
|
||||
(1270 KB).
|
||||
<DD><A HREF="xorriso-0.6.0.tar.gz">xorriso-0.6.0.tar.gz</A>
|
||||
(1650 KB).
|
||||
</DD>
|
||||
<DD>(Released 02 Jul 2010)</DD>
|
||||
<DD><A HREF="xorriso-0.6.0.tar.gz.sig">xorriso-0.6.0.tar.gz.sig</A></DD>
|
||||
<DD>
|
||||
(detached GPG signature for verification by
|
||||
<KBD>gpg --verify xorriso-0.6.0.tar.gz.sig xorriso-0.6.0.tar.gz</KBD>).
|
||||
</DD>
|
||||
<DD>
|
||||
Also on <A HREF="http://www.gnu.org/prep/ftp.html">
|
||||
mirrors of ftp://ftp.gnu.org/gnu/ </A>
|
||||
as xorriso/xorriso-0.6.0.tar.gz
|
||||
</DD>
|
||||
<DD>(Released 20 Jul 2009)</DD>
|
||||
</DL>
|
||||
</DD>
|
||||
</DL>
|
||||
@ -434,13 +463,15 @@ files or trees to disk:
|
||||
</DL>
|
||||
<A NAME="contact"></A>
|
||||
<DL><DT>Contact:</DT>
|
||||
<DD>Thomas Schmitt, <A HREF="mailto:scdbackup@gmx.net">scdbackup@gmx.net</A></DD>
|
||||
<DD>libburn development mailing list,
|
||||
<DD>GNU xorriso support mailing list,
|
||||
<A HREF="mailto:bug-xorriso@gnu.org">bug-xorriso@gnu.org</A></DD>
|
||||
<DD>libburnia development mailing list,
|
||||
<A HREF="mailto:libburn-hackers@pykix.org">libburn-hackers@pykix.org</A></DD>
|
||||
<DD>Thomas Schmitt, <A HREF="mailto:scdbackup@gmx.net">scdbackup@gmx.net</A></DD>
|
||||
</DL>
|
||||
<DL><DT>License:</DT>
|
||||
<DD><A HREF="COPYING_xorriso">GPL version 2</A>,
|
||||
an <A HREF="http://www.opensource.org/">Open Source</A> approved license</DD>
|
||||
<DD><A HREF="COPYING_xorriso">GPL version 3 or later.</A>
|
||||
</DD>
|
||||
<DD> </DD>
|
||||
</DL>
|
||||
</P>
|
||||
@ -448,40 +479,48 @@ an <A HREF="http://www.opensource.org/">Open Source</A> approved license</DD>
|
||||
<HR>
|
||||
|
||||
<P>
|
||||
Bug fixes towards xorriso-0.3.8.pl00:
|
||||
Bug fixes towards xorriso-0.5.8:
|
||||
<UL>
|
||||
<LI>SIGSEGV by dereferencing NULL with option -status and no search string</LI>
|
||||
<LI>-load volid did not perform pattern search</LI>
|
||||
<LI>-check_media patch_lba0= could install wrong image size</LI>
|
||||
<LI>-as mkisofs option -volset was wrongly interpreted like -volid</LI>
|
||||
<!--
|
||||
<LI>- none -</LI>
|
||||
-->
|
||||
|
||||
</UL>
|
||||
|
||||
</P>
|
||||
|
||||
<!--
|
||||
<P>
|
||||
Bug fix towards xorriso-0.4.0.pl00:
|
||||
Bug fixes in .pl01 towards xorriso-:
|
||||
<UL>
|
||||
<LI>xorriso -as mkisofs did not understand the -C option of growisofs any more
|
||||
<LI>
|
||||
</LI>
|
||||
</UL>
|
||||
|
||||
</P>
|
||||
-->
|
||||
|
||||
<P>
|
||||
Enhancements towards previous stable version xorriso-0.3.8.pl00:
|
||||
Enhancements towards previous stable version xorriso-0.5.8:
|
||||
<UL>
|
||||
<LI>New option -hardlinks for recording and restoring of hard link relations
|
||||
<LI>Enabled use of libreadline on Solaris</LI>
|
||||
<LI>New find test -disk_name</LI>
|
||||
<LI>New option -hide, -find action -hide, -find test -hidden</LI>
|
||||
<LI>New -boot_image bootspec cat_hidden=on</LI>
|
||||
<LI>
|
||||
New options -copyright_file , -biblio_file , -abstract_file
|
||||
</LI>
|
||||
<LI>New option -for_backup as shortcut for -acl -xattr -hardlinks
|
||||
<LI>
|
||||
New option -read_mkisofsrc interprets .mkisofsrc
|
||||
</LI>
|
||||
<LI>Improved read performance with -update_r
|
||||
<LI>
|
||||
Implemented -as mkisofs options -hide, -hide-joliet, -hide-list, -hide-joliet-list
|
||||
</LI>
|
||||
<LI>Improved read performance with -extract by -osirrox sort_lba
|
||||
<LI>
|
||||
New -as mkisofs option --boot-catalog-hide
|
||||
</LI>
|
||||
<LI>
|
||||
Implemented -as mkisofs options -dir-mode, -file-mode, -abstract, -biblio, -copyright
|
||||
</LI>
|
||||
<LI>Operators with option -find : -not, -or, -and, (, ), -if, -then, -else</LI>
|
||||
<LI>New -find tests -wholename, -prune, -sort_lba</LI>
|
||||
|
||||
<!--
|
||||
<LI>- none -</LI>
|
||||
@ -493,20 +532,32 @@ Enhancements towards previous stable version xorriso-0.3.8.pl00:
|
||||
|
||||
<P>
|
||||
<H3>
|
||||
Library copies included in xorriso tarballs:
|
||||
Libburnia software copies included in GNU xorriso:
|
||||
</H3>
|
||||
<DL>
|
||||
<DT>libburn-0.6.7</DT>
|
||||
<DT>
|
||||
GNU xorriso is feature-wise equivalent to the dynamic compilation of
|
||||
<A HREF="http://libburnia-project.org/"> libburnia </A>
|
||||
libraries and libburnia program xorriso.
|
||||
It restricts itself to a technical form where the legal commitments of the
|
||||
libburnia project and the legal intentions of
|
||||
<A HREF="http://www.fsf.org/"> FSF </A> match completely.
|
||||
</DT>
|
||||
<DD> </DD>
|
||||
<DT>libburn-0.8.5</DT>
|
||||
<DD>reads and writes data from and to CD, DVD, BD.</DD>
|
||||
<DD>(founded by Derek Foreman and Ben Jansens,
|
||||
developed and maintained since August 2006 by
|
||||
Thomas Schmitt from team of libburnia-project.org)</DD>
|
||||
<DT>libisofs-0.6.21</DT>
|
||||
<DT>libisofs-0.6.35</DT>
|
||||
<DD>operates on ISO 9660 filesystem images.</DD>
|
||||
<DD>(By Vreixo Formoso, Mario Danic and Thomas Schmitt
|
||||
from team of libburnia-project.org)</DD>
|
||||
<DT>libisoburn-0.4.0</DT>
|
||||
<DD>coordinates libburn and libisofs, emulates multi-session where needed.</DD>
|
||||
<DT>libisoburn-0.6.0</DT>
|
||||
<DD>coordinates libburn and libisofs, emulates multi-session where needed,
|
||||
and hosts the original source code of program xorriso.</DD>
|
||||
<DD>It provides the complete functionality of xorriso via
|
||||
a C language API.</DD>
|
||||
<DD>(By Vreixo Formoso and Thomas Schmitt
|
||||
from team of libburnia-project.org)</DD>
|
||||
<DD> </DD>
|
||||
@ -519,34 +570,27 @@ cdrecord and mkisofs.</DT>
|
||||
|
||||
<P>
|
||||
<DL>
|
||||
<DT><H3>Development snapshot, version 0.4.1 :</H3></DT>
|
||||
<DD>Bug fixes towards xorriso-0.4.0.pl00:
|
||||
<DT><H3>Development snapshot, version 0.6.1 :</H3></DT>
|
||||
<DD>Bug fixes towards xorriso-0.6.0:
|
||||
<UL>
|
||||
<LI>xorriso -as mkisofs did not understand the -C option of growisofs any more
|
||||
</LI>
|
||||
<LI>- none yet -</LI>
|
||||
<!--
|
||||
<LI>- none yet -</LI>
|
||||
-->
|
||||
</UL>
|
||||
</DD>
|
||||
<DD>Enhancements towards stable version 0.4.0.pl01:
|
||||
<DD>Enhancements towards stable version 0.6.0:
|
||||
<UL>
|
||||
<LI>Options -lsl and -lsdl now display correct link counts if -hardlinks is on
|
||||
</LI>
|
||||
<LI>New option -md5, new -as mkisofs option --md5</LI>
|
||||
<LI>New options -check_md5, -check_md5_r</LI>
|
||||
<LI>New find actions check_md5 get_md5, get_any_xattr</LI>
|
||||
<LI>New find tests -has_md5, -has_any_xattr</LI>
|
||||
|
||||
<LI>- none yet -</LI>
|
||||
<!--
|
||||
<LI>- none yet -</LI>
|
||||
-->
|
||||
</UL>
|
||||
</DD>
|
||||
<DD> </DD>
|
||||
<DD><A HREF="README_xorriso_devel">README 0.4.1</A>
|
||||
<DD><A HREF="xorriso_help_devel">xorriso_0.4.1 -help</A></DD>
|
||||
<DD><A HREF="man_1_xorriso_devel.html">man xorriso (as of 0.4.1)</A></DD>
|
||||
<DD><A HREF="README_xorriso_devel">README 0.6.1</A>
|
||||
<DD><A HREF="xorriso_help_devel">xorriso_0.6.1 -help</A></DD>
|
||||
<DD><A HREF="man_1_xorriso_devel.html">man xorriso (as of 0.6.1)</A></DD>
|
||||
<DD> </DD>
|
||||
<DT>If you want to distribute development versions of xorriso, then use
|
||||
this tarball which produces static linking between xorriso and the
|
||||
@ -556,8 +600,8 @@ libburnia libraries.
|
||||
installation see README)
|
||||
</DD>
|
||||
<DD>
|
||||
<A HREF="xorriso-0.4.1.tar.gz">xorriso-0.4.1.tar.gz</A>
|
||||
(1280 KB).
|
||||
<A HREF="xorriso-0.6.1.tar.gz">xorriso-0.6.1.tar.gz</A>
|
||||
(1650 KB).
|
||||
</DD>
|
||||
<DT>A dynamically linked development version of xorriso can be obtained
|
||||
from repositories of
|
||||
@ -581,8 +625,7 @@ versions for dynamic linking. Only release versions are safe for that.
|
||||
</KBD></DD>
|
||||
<DD>Install: <KBD><B>cd libisoburn ; ./bootstrap ; ./configure --prefix /usr ; make ; make install</B>
|
||||
</KBD></DD>
|
||||
<DT>Build of SVN versions needs <A HREF="http://sources.redhat.com/autobook/">
|
||||
autotools</A> of at least version 1.7 installed.
|
||||
<DT>Build of SVN versions needs of at least version 1.7 installed.
|
||||
But after the run of <KBD>./bootstrap</KBD>, only
|
||||
vanilla tools like make and gcc are needed.
|
||||
</DT>
|
||||
@ -602,41 +645,60 @@ with DVD media and how to emulate multi-session on overwriteable media.
|
||||
</P>
|
||||
<HR>
|
||||
|
||||
<!-- The following links might lead to sites which do not comply
|
||||
to the strict rules of FSF about non-free software.
|
||||
GNU xorriso does not endorse or recommend any non-free software
|
||||
which can be reached by them directly or indirectly. Nevertheless
|
||||
outside of official GNU sites, GNU xorriso thanks the following
|
||||
entities for their long standing support.
|
||||
-->
|
||||
<!-- Start not-www.gnu.org -->
|
||||
|
||||
<CENTER><FONT SIZE=+0>
|
||||
<!-- <A NAME="bottom" HREF="main_ger.html#bottom">deutsch (german)</A>
|
||||
<BR><BR>
|
||||
-->
|
||||
<BR><BR>
|
||||
<FONT SIZE=+0>Enjoying free Open Source hosting by <A HREF="http://www.webframe.org">www.webframe.org</A><BR>
|
||||
<A HREF="http://www.webframe.org">
|
||||
<IMG SRC="msfree.gif" ALT="100 % Microsoft free" BORDER=0></A><BR>
|
||||
and by <A HREF="http://sourceforge.net">sourceforge.net</A><BR>
|
||||
<A href="http://sourceforge.net">
|
||||
<IMG src="sflogo-88-1.png" BORDER="0" ALT="SourceForge Logo"></A>
|
||||
<!-- on sourceforge use : <IMG src="http://sourceforge.net/sflogo.php?group_id=16010" width="88" height="31" border="0" alt="SourceForge Logo"></A> -->
|
||||
<P>
|
||||
<CENTER><FONT SIZE=+0>
|
||||
<FONT SIZE=+0>
|
||||
<A HREF="http://www.gnu.org">Dedicated to the GNU Operating System</A><BR>
|
||||
|
||||
Enjoying free hosting by<BR>
|
||||
<A HREF="http://www.webframe.org">www.webframe.org</A><BR>
|
||||
<A HREF="http://sourceforge.net">sourceforge.net</A><BR>
|
||||
|
||||
Enjoying a FreeBSD shell account with the opportunity to
|
||||
build, install and test xorriso at<BR>
|
||||
<A HREF="http://www.en.free-shells.com.ar">free-shells.com.ar</A>
|
||||
</P>
|
||||
</FONT></CENTER>
|
||||
</P>
|
||||
|
||||
<HR>
|
||||
<DL>
|
||||
<DT>Links to my other published software projects :</DT>
|
||||
<DT>Links to related free software projects of Thomas Schmitt:</DT>
|
||||
<DD><A HREF=http://scdbackup.webframe.org/cdrskin_eng.html>
|
||||
cdrskin, a cdrecord emulator</A></DD>
|
||||
<DD><A HREF=http://scdbackup.webframe.org/main_eng.html>
|
||||
scdbackup, multi volume CD backup</A></DD>
|
||||
scdbackup, multi volume CD/DVD/BD backup</A></DD>
|
||||
<DL><DD><A HREF=http://scdbackup.sourceforge.net/main_eng.html>
|
||||
(a second source of above)</A></DD></DL>
|
||||
<DD><A HREF=http://stic.sourceforge.net>Some Tools for Image Collectors</A></DD>
|
||||
<DD><A HREF=http://scdbackup.webframe.org/pppoem>
|
||||
pppoem, a DSL throughput monitor (mainly for Linux kernel 2.4)</A></DD>
|
||||
</DL>
|
||||
|
||||
<!-- End not-www.gnu.org -->
|
||||
|
||||
<BR>
|
||||
Legal statement: This website does not serve any commercial purpose.
|
||||
<BR><BR>
|
||||
Legal statement: This website does not serve any commercial purpose.<BR>
|
||||
<BR><BR>
|
||||
Copyright © 2008 - 2010 Thomas Schmitt.
|
||||
<BR>
|
||||
This text is freely distributable. It shall only be modified in sync with
|
||||
the factual properties of xorriso and its public storage locations.
|
||||
If you make use of the license to derive modified versions of xorriso
|
||||
then you are entitled to modify this text under that same license.
|
||||
<DL>
|
||||
<DT>Contact for issues of this web page or the described program:</DT>
|
||||
<DD>Thomas Schmitt, <A HREF="mailto:scdbackup@gmx.net">scdbackup@gmx.net</A></DD>
|
||||
<DD>GNU xorriso support mailing list,
|
||||
<A HREF="mailto:bug-xorriso@gnu.org">bug-xorriso@gnu.org</A></DD>
|
||||
<DD>libburnia development mailing list,
|
||||
<A HREF="mailto:libburn-hackers@pykix.org">libburn-hackers@pykix.org</A></DD>
|
||||
</DL>
|
||||
</FONT>
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
293
xorriso/xorriso_main.c
Normal file
293
xorriso/xorriso_main.c
Normal file
@ -0,0 +1,293 @@
|
||||
|
||||
/* xorriso - Command line oriented batch and dialog tool which creates, loads,
|
||||
manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Initial code of this program was derived from program src/askme.c out
|
||||
of scdbackup-0.8.8, Copyright 2007 Thomas Schmitt, BSD-License.
|
||||
|
||||
Provided under GPL version 2 or later, with the announcement that this
|
||||
might get changed in future. I would prefer BSD or LGPL as soon as the
|
||||
license situation of the library code allows that.
|
||||
(This announcement affects only future releases of xorriso and it will
|
||||
always be possible to derive a GPLv2+ from the future license.)
|
||||
|
||||
There is a derived package "GNU xorriso" under GPLv3+ which combines the
|
||||
libburnia libraries and program xorriso to a statically linked binary.
|
||||
|
||||
|
||||
Overview of xorriso architecture:
|
||||
|
||||
libburn provides the ability to read and write data.
|
||||
|
||||
libisofs interprets and manipulates ISO 9660 directory trees. It generates
|
||||
the output stream which is handed over to libburn.
|
||||
|
||||
libisoburn by its lower level API encapsulates the connectivity issues
|
||||
between libburn and libisofs. This API also enables multi-session emulation
|
||||
on overwritable media and random access file objects.
|
||||
|
||||
xorriso is the higher level API of libisoburn which allows to operate all
|
||||
three libraries by a unified set of commands.
|
||||
<libisoburn/xorriso.h> exposes the public functions.
|
||||
Among these functions are direct equivalents of the xorriso interpreter
|
||||
commands. There are also functions for fundamental management and for
|
||||
handling event messages.
|
||||
|
||||
This file xorriso_main.c runs the xorriso API as batch and dialog program.
|
||||
|
||||
One should not mix the use of the xorriso API with the use of the lower
|
||||
level APIs of libburn, libisofs, libisoburn.
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
The following overview is relevant for development but not for usage of
|
||||
xorriso. An application programmer should read xorriso.h and man xorriso
|
||||
resp. info xorriso, rather than diving into its source code.
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
The xorriso source is divided in two groups:
|
||||
|
||||
A set of source modules interacts with the lower level library APIs:
|
||||
|
||||
base_obj.[ch] fundamental operations of the XorrisO object
|
||||
lib_mgt.[ch] manages the relation between xorriso and the libraries
|
||||
drive_mgt.[ch] operates on drives and media
|
||||
iso_img.[ch] operates on ISO images and their global properties
|
||||
iso_tree.[ch] access nodes of the libisofs tree model
|
||||
iso_manip.[ch] manipulates the libisofs tree model
|
||||
sort_cmp.[ch] sorts and compare tree nodes
|
||||
write_run.[ch] functions to write sessions
|
||||
read_run.[ch] functions to read data from ISO image
|
||||
filters.[ch] operates on data filter objects
|
||||
xorrisoburn.h declarations needed by the non-library modules
|
||||
|
||||
Another set is independent of the lower level APIs:
|
||||
|
||||
parse_exec.c deals with parsing and interpretation of command input
|
||||
sfile.c functions around files and strings
|
||||
aux_objects.c various helper classes
|
||||
misc_funct.c miscellaneous helper functions
|
||||
findjob.c performs tree searches in libisofs or in POSIX filesystem
|
||||
check_media.c perform verifying runs on media resp. images
|
||||
text_io.c text i/o functions
|
||||
match.c functions for pattern matching
|
||||
emulators.c emulators for mkisofs and cdrecord
|
||||
disk_ops.c actions on onjects of disk filesystems
|
||||
cmp_update.c compare or update files between disk filesystem and
|
||||
ISO filesystem
|
||||
opts_a_c.c options -a* to -c*
|
||||
opts_d_h.c options -d* to -h*
|
||||
opts_i_o.c options -i* to -o*
|
||||
opts_p_z.c options -p* to -z*
|
||||
|
||||
xorriso_private.h contains the definition of struct Xorriso and for
|
||||
convenience includes the .h files of the non-library group.
|
||||
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <locale.h>
|
||||
|
||||
|
||||
/* xorriso_main.c includes the internal copy of the API definition */
|
||||
/* The official xorriso options API is defined in <libisoburn/xorriso.h> */
|
||||
#include "xorriso.h"
|
||||
|
||||
|
||||
/* The minimum version of libisoburn xorriso API to be used with this
|
||||
version of xorriso.
|
||||
*/
|
||||
#define Xorriso_req_majoR 0
|
||||
#define Xorriso_req_minoR 6
|
||||
#define Xorriso_req_micrO 0
|
||||
|
||||
|
||||
static void yell_xorriso()
|
||||
{
|
||||
fprintf(stderr,
|
||||
"%sxorriso %d.%d.%d%s : RockRidge filesystem manipulator, libburnia project.\n\n",
|
||||
#ifdef Xorriso_GNU_xorrisO
|
||||
"GNU ",
|
||||
#else
|
||||
"",
|
||||
#endif
|
||||
Xorriso_header_version_majoR, Xorriso_header_version_minoR,
|
||||
Xorriso_header_version_micrO, Xorriso_program_patch_leveL);
|
||||
}
|
||||
|
||||
|
||||
/* Check whether build configuration and runtime linking are consistent.
|
||||
*/
|
||||
static void check_compatibility()
|
||||
{
|
||||
int lib_major, lib_minor, lib_micro;
|
||||
|
||||
/* First an ugly compile time check for header version compatibility.
|
||||
If everthing matches, then no C code is produced. In case of mismatch,
|
||||
intentionally faulty C code will be inserted.
|
||||
*/
|
||||
/* The minimum requirement of xorriso towards the libisoburn header
|
||||
at compile time is defined above
|
||||
Xorriso_req_majoR
|
||||
Xorriso_req_minoR
|
||||
Xorriso_req_micrO
|
||||
It gets compared against the version macros in xorriso.h :
|
||||
Xorriso_header_version_majoR
|
||||
Xorriso_header_version_minoR
|
||||
Xorriso_header_version_micrO
|
||||
If the header is too old then the following code shall cause failure of
|
||||
cdrskin compilation rather than to allow production of a program with
|
||||
unpredictable bugs or memory corruption.
|
||||
The compiler messages supposed to appear in this case are:
|
||||
error: 'XORRISO_MISCONFIGURATION' undeclared (first use in this function)
|
||||
error: 'INTENTIONAL_ABORT_OF_COMPILATION__HEADERFILE_xorriso_dot_h_TOO_OLD__SEE_xorriso_main_dot_c' undeclared (first use in this function)
|
||||
error: 'XORRISO_MISCONFIGURATION_' undeclared (first use in this function)
|
||||
*/
|
||||
/* The indendation is an advise of man gcc to help old compilers ignoring */
|
||||
#if Xorriso_req_majoR > Xorriso_header_version_majoR
|
||||
#define Xorriso_dot_h_too_olD 1
|
||||
#endif
|
||||
#if Xorriso_req_majoR == Xorriso_header_version_majoR && Xorriso_req_minoR > Xorriso_header_version_minoR
|
||||
#define Xorriso_dot_h_too_olD 1
|
||||
#endif
|
||||
#if Xorriso_req_minoR == Xorriso_header_version_minoR && Xorriso_req_micrO > Xorriso_header_version_micrO
|
||||
#define Xorriso_dot_h_too_olD 1
|
||||
#endif
|
||||
|
||||
#ifdef Xorriso_dot_h_too_olD
|
||||
XORRISO_MISCONFIGURATION = 0;
|
||||
INTENTIONAL_ABORT_OF_COMPILATION__HEADERFILE_xorriso_dot_h_TOO_OLD__SEE_xorriso_main_dot_c = 0;
|
||||
XORRISO_MISCONFIGURATION_ = 0;
|
||||
#endif
|
||||
|
||||
/* End of ugly compile time test (scroll up for explanation) */
|
||||
|
||||
|
||||
/* Needed are at least 44 bits in signed type off_t .
|
||||
This is a popular mistake in configuration or compilation.
|
||||
*/
|
||||
if(sizeof(off_t) < 6) {
|
||||
yell_xorriso();
|
||||
fprintf(stderr,
|
||||
"xorriso : FATAL : Compile time misconfiguration. sizeof(off_t) too small.\n\n");
|
||||
exit(4);
|
||||
}
|
||||
|
||||
/* Check whether the linked xorriso code is young enough.
|
||||
*/
|
||||
if(! Xorriso__is_compatible(Xorriso_header_version_majoR,
|
||||
Xorriso_header_version_minoR,
|
||||
Xorriso_header_version_micrO, 0)) {
|
||||
yell_xorriso();
|
||||
Xorriso__version(&lib_major, &lib_minor, &lib_micro);
|
||||
fprintf(stderr,
|
||||
"xorriso : FATAL : libisoburn/xorriso runtime version mismatch. Found %d.%d.%d, need %d.%d.%d\n\n",
|
||||
lib_major, lib_minor, lib_micro,
|
||||
Xorriso_header_version_majoR, Xorriso_header_version_minoR,
|
||||
Xorriso_header_version_micrO);
|
||||
exit(4);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int ret, i;
|
||||
struct XorrisO *xorriso= NULL;
|
||||
char **orig_argv= NULL;
|
||||
|
||||
check_compatibility(); /* might exit() */
|
||||
|
||||
if(argc < 2) {
|
||||
yell_xorriso();
|
||||
fprintf(stderr,"usage : %s [options]\n", argv[0]);
|
||||
fprintf(stderr, " More is told by option -help\n");
|
||||
exit(2);
|
||||
}
|
||||
setlocale(LC_CTYPE, "");
|
||||
ret= Xorriso_new(&xorriso, argv[0], 0);
|
||||
if(ret <= 0) {
|
||||
fprintf(stderr,"Creation of XorrisO object failed. (not enough memory ?)\n");
|
||||
exit(3);
|
||||
}
|
||||
|
||||
/* The prescan of arguments performs actions which have to happen before
|
||||
the normal processing of startup files and arguments.
|
||||
*/
|
||||
ret= Xorriso_prescan_args(xorriso,argc,argv,0);
|
||||
if(ret == 0)
|
||||
goto end_sucessfully;
|
||||
if(ret < 0)
|
||||
exit(5);
|
||||
|
||||
yell_xorriso();
|
||||
|
||||
/* The following command interpreters are allowed only after this
|
||||
initialization.
|
||||
*/
|
||||
ret= Xorriso_startup_libraries(xorriso, 0);
|
||||
if(ret <= 0)
|
||||
{ret= 4; goto emergency_exit;}
|
||||
Xorriso_process_msg_queues(xorriso, 0);
|
||||
|
||||
/* Interpret startup files */
|
||||
ret= Xorriso_read_rc(xorriso, 0);
|
||||
if(ret == 3)
|
||||
goto end_sucessfully;
|
||||
if(ret <= 0)
|
||||
{ret= 5; goto emergency_exit;}
|
||||
|
||||
/* Interpret program arguments */
|
||||
orig_argv= argv;
|
||||
ret= Xorriso_program_arg_bsl(xorriso, argc, &argv, 0);
|
||||
if(ret <= 0)
|
||||
{ret= 5; goto emergency_exit;}
|
||||
i= 1;
|
||||
ret= Xorriso_interpreter(xorriso, argc, argv, &i, 2);
|
||||
if(ret == 3)
|
||||
goto end_sucessfully;
|
||||
if(ret <= 0)
|
||||
{ret= 5; goto emergency_exit;}
|
||||
|
||||
/* Enter dialog mode if it has been activated meanwhile */
|
||||
ret= Xorriso_dialog(xorriso, 0);
|
||||
if(ret <= 0)
|
||||
{ret= 6; goto emergency_exit;}
|
||||
|
||||
end_sucessfully:; /* normal shutdown, including eventual -commit */
|
||||
Xorriso_process_msg_queues(xorriso, 0);
|
||||
if(Xorriso_change_is_pending(xorriso, 0))
|
||||
Xorriso_option_end(xorriso, 2);
|
||||
Xorriso_process_msg_queues(xorriso, 0);
|
||||
ret= Xorriso_make_return_value(xorriso, 0);
|
||||
Xorriso_process_errfile(xorriso, 0, "xorriso end", 0, 1);
|
||||
Xorriso_destroy(&xorriso, 1);
|
||||
if(orig_argv != argv && orig_argv != NULL) {
|
||||
for(i= 0; i < argc; i++)
|
||||
if(argv[i] != NULL)
|
||||
free(argv[i]);
|
||||
free(argv);
|
||||
}
|
||||
exit(ret);
|
||||
|
||||
emergency_exit:;
|
||||
if(xorriso != NULL) { /* minimal shutdown */
|
||||
Xorriso_process_msg_queues(xorriso, 0);
|
||||
Xorriso_destroy(&xorriso, 1);
|
||||
}
|
||||
exit(ret);
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,7 @@
|
||||
|
||||
# Copyright (c) 2007 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||
# Provided under GPL version 2 or later.
|
||||
|
||||
# ts A90315 : LIBBURNIA_PKGCONFDIR is defined OS specific in acinclude.m4
|
||||
# was: pkgconfigdir=$(libdir)/pkgconfig
|
||||
pkgconfigdir=$(LIBBURNIA_PKGCONFDIR)
|
||||
@ -18,11 +21,13 @@ bin_PROGRAMS = \
|
||||
|
||||
xorriso_xorriso_CPPFLAGS = -I./libburn -I./libisofs -I./libisoburn -I./xorriso
|
||||
|
||||
# No readline in the vanilla version because the necessary headers
|
||||
# are in a separate readline-development package.
|
||||
xorriso_xorriso_CFLAGS = -DXorriso_standalonE -DXorriso_with_maiN \
|
||||
$(READLINE_DEF) $(LIBACL_DEF) $(XATTR_DEF) \
|
||||
$(EXTF_DEF) $(EXTF_SUID_DEF) $(ZLIB_DEF)
|
||||
# ts B00518 : The configuration macros are now transmitted via config.h
|
||||
# xorriso_xorriso_CFLAGS = -DXorriso_standalonE \
|
||||
# $(READLINE_DEF) $(LIBACL_DEF) $(XATTR_DEF) \
|
||||
# $(EXTF_DEF) $(EXTF_SUID_DEF) $(ZLIB_DEF) \
|
||||
# $(LIBCDIO_DEF) \
|
||||
# $(XORRISO_DVD_OBS_64K) $(LIBBURN_O_DIRECT_DEF)
|
||||
xorriso_xorriso_CFLAGS =
|
||||
|
||||
xorriso_xorriso_LDADD = $(THREAD_LIBS) $(LIBBURN_ARCH_LIBS)
|
||||
|
||||
@ -43,9 +48,56 @@ xorriso_xorriso_SOURCES = \
|
||||
\
|
||||
xorriso/xorriso.h \
|
||||
xorriso/xorriso_private.h \
|
||||
xorriso/xorriso.c \
|
||||
xorriso/xorriso_main.c \
|
||||
xorriso/sfile.h \
|
||||
xorriso/sfile.c \
|
||||
xorriso/aux_objects.h \
|
||||
xorriso/aux_objects.c \
|
||||
xorriso/findjob.h \
|
||||
xorriso/findjob.c \
|
||||
xorriso/check_media.h \
|
||||
xorriso/check_media.c \
|
||||
xorriso/misc_funct.h \
|
||||
xorriso/misc_funct.c \
|
||||
xorriso/text_io.h \
|
||||
xorriso/text_io.c \
|
||||
xorriso/match.h \
|
||||
xorriso/match.c \
|
||||
xorriso/emulators.h \
|
||||
xorriso/emulators.c \
|
||||
xorriso/disk_ops.h \
|
||||
xorriso/disk_ops.c \
|
||||
xorriso/cmp_update.h \
|
||||
xorriso/cmp_update.c \
|
||||
xorriso/parse_exec.h \
|
||||
xorriso/parse_exec.c \
|
||||
xorriso/opts_a_c.c \
|
||||
xorriso/opts_d_h.c \
|
||||
xorriso/opts_i_o.c \
|
||||
xorriso/opts_p_z.c \
|
||||
\
|
||||
xorriso/xorrisoburn.h \
|
||||
xorriso/xorrisoburn.c \
|
||||
xorriso/base_obj.h \
|
||||
xorriso/base_obj.c \
|
||||
xorriso/lib_mgt.h \
|
||||
xorriso/lib_mgt.c \
|
||||
xorriso/sort_cmp.h \
|
||||
xorriso/sort_cmp.c \
|
||||
xorriso/drive_mgt.h \
|
||||
xorriso/drive_mgt.c \
|
||||
xorriso/iso_img.h \
|
||||
xorriso/iso_img.c \
|
||||
xorriso/iso_tree.h \
|
||||
xorriso/iso_tree.c \
|
||||
xorriso/iso_manip.h \
|
||||
xorriso/iso_manip.c \
|
||||
xorriso/write_run.h \
|
||||
xorriso/write_run.c \
|
||||
xorriso/read_run.h \
|
||||
xorriso/read_run.c \
|
||||
xorriso/filters.h \
|
||||
xorriso/filters.c \
|
||||
\
|
||||
xorriso/xorriso_timestamp.h \
|
||||
xorriso/xorriso_buildstamp.h \
|
||||
\
|
||||
@ -117,19 +169,18 @@ xorriso_xorriso_SOURCES = \
|
||||
libburn/back_hacks.h \
|
||||
libburn/cleanup.c \
|
||||
libburn/cleanup.h \
|
||||
libburn/crc.c \
|
||||
libburn/crc.h \
|
||||
libburn/debug.c \
|
||||
libburn/debug.h \
|
||||
libburn/drive.c \
|
||||
libburn/drive.h \
|
||||
libburn/ecma130ab.c \
|
||||
libburn/ecma130ab.h \
|
||||
libburn/error.h \
|
||||
libburn/file.c \
|
||||
libburn/file.h \
|
||||
libburn/init.c \
|
||||
libburn/init.h \
|
||||
libburn/lec.c \
|
||||
libburn/lec.h \
|
||||
libburn/libburn.h \
|
||||
libburn/libdax_audioxtr.h \
|
||||
libburn/libdax_audioxtr.c \
|
||||
@ -166,8 +217,12 @@ xorriso_xorriso_SOURCES = \
|
||||
\
|
||||
version.h
|
||||
|
||||
# Disabled because unneeded and of unclear ancestry
|
||||
# libburn/crc.c
|
||||
|
||||
noinst_PROGRAMS = \
|
||||
test/compare_file
|
||||
test/compare_file \
|
||||
xorriso/make_xorriso_1
|
||||
|
||||
# A program to compare two trees of files in mounted filesystems
|
||||
# To compare tree /media/dvd and /original/dir :
|
||||
@ -178,6 +233,13 @@ test_compare_file_CFLAGS =
|
||||
test_compare_file_LDADD =
|
||||
test_compare_file_SOURCES = test/compare_file.c
|
||||
|
||||
# Specialized converter from xorriso/xorriso.texi to xorriso/xorriso.1
|
||||
#
|
||||
xorriso_make_xorriso_1_CPPFLAGS =
|
||||
xorriso_make_xorriso_1_CFLAGS =
|
||||
xorriso_make_xorriso_1_LDADD =
|
||||
xorriso_make_xorriso_1_SOURCES = xorriso/make_xorriso_1.c
|
||||
|
||||
|
||||
# Install symbolic links to the xorriso binary
|
||||
#
|
||||
@ -226,6 +288,8 @@ indent: $(indent_files)
|
||||
|
||||
man_MANS = xorriso/xorriso.1
|
||||
|
||||
info_TEXINFOS = xorriso/xorriso.texi
|
||||
|
||||
EXTRA_DIST = \
|
||||
xorriso.pc.in \
|
||||
version.h.in \
|
||||
@ -237,6 +301,7 @@ EXTRA_DIST = \
|
||||
INSTALL \
|
||||
xorriso/changelog.txt \
|
||||
xorriso/xorriso_buildstamp_none.h \
|
||||
xorriso/make_docs.sh \
|
||||
$(man_MANS) \
|
||||
doc/susp_aaip_2_0.txt \
|
||||
doc/susp_aaip_isofs_names.txt \
|
||||
@ -246,7 +311,12 @@ EXTRA_DIST = \
|
||||
libisofs/aaip-os-freebsd.c \
|
||||
libburn/os-dummy.h \
|
||||
libburn/os-freebsd.h \
|
||||
libburn/os-libcdio.h \
|
||||
libburn/os-linux.h \
|
||||
libburn/os-solaris.h \
|
||||
libburn/sg-dummy.c \
|
||||
libburn/sg-freebsd.c \
|
||||
libburn/sg-linux.c
|
||||
libburn/sg-libcdio.c \
|
||||
libburn/sg-linux.c \
|
||||
libburn/sg-solaris.c
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1 +1 @@
|
||||
#define Xorriso_timestamP "2009.08.28.112825"
|
||||
#define Xorriso_timestamP "2010.07.02.090001"
|
||||
|
12652
xorriso/xorrisoburn.c
12652
xorriso/xorrisoburn.c
File diff suppressed because it is too large
Load Diff
@ -4,9 +4,9 @@
|
||||
a command line oriented batch and dialog tool which creates, loads,
|
||||
manipulates and burns ISO 9660 filesystem images.
|
||||
|
||||
Copyright 2007-2009 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
|
||||
|
||||
Provided under GPL version 2.
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
This file contains the inner isofs- and burn-library interface of xorriso.
|
||||
*/
|
||||
@ -18,8 +18,8 @@
|
||||
/* The minimum version of libisoburn to be used with this version of xorriso
|
||||
*/
|
||||
#define xorriso_libisoburn_req_major 0
|
||||
#define xorriso_libisoburn_req_minor 4
|
||||
#define xorriso_libisoburn_req_micro 1
|
||||
#define xorriso_libisoburn_req_minor 6
|
||||
#define xorriso_libisoburn_req_micro 0
|
||||
|
||||
|
||||
struct SpotlisT; /* List of intervals with different read qualities */
|
||||
@ -412,6 +412,15 @@ int Xorriso_setfattr(struct XorrisO *xorriso, void *in_node, char *path,
|
||||
size_t num_attrs, char **names,
|
||||
size_t *value_lengths, char **values, int flag);
|
||||
|
||||
int Xorriso_perform_attr_from_list(struct XorrisO *xorriso, char *path,
|
||||
struct Xorriso_lsT *lst_start, int flag);
|
||||
|
||||
int Xorriso_path_setfattr(struct XorrisO *xorriso, void *in_node, char *path,
|
||||
char *name, size_t value_length, char *value, int flag);
|
||||
|
||||
int Xorriso_perform_acl_from_list(struct XorrisO *xorriso, char *file_path,
|
||||
char *uid, char *gid, char *acl, int flag);
|
||||
|
||||
int Xorriso_record_dev_inode(struct XorrisO *xorriso, char *disk_path,
|
||||
dev_t dev, ino_t ino,
|
||||
void *in_node, char *iso_path, int flag);
|
||||
@ -480,6 +489,28 @@ int Xorriso_md5_end(struct XorrisO *xorriso, void **ctx, char md5[16],
|
||||
*/
|
||||
int Xorriso_drive_snooze(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_is_plain_image_file(struct XorrisO *xorriso, void *in_node,
|
||||
char *path, int flag);
|
||||
|
||||
int Xorriso_pvd_info(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* @param flag bit0= do not set hln_change_pending */
|
||||
int Xorriso_set_change_pending(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* @param flag bit0= enable SCSI command logging to stderr */
|
||||
int Xorriso_scsi_log(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/* flag bit0= do not increment boot_count and do not reset boot parameters
|
||||
bit1= dispose attached boot images
|
||||
*/
|
||||
int Xorriso_attach_boot_image(struct XorrisO *xorriso, int flag);
|
||||
|
||||
/*
|
||||
bit0= do only report non-default settings
|
||||
bit1= do only report to fp
|
||||
*/
|
||||
int Xorriso_boot_image_status(struct XorrisO *xorriso, char *filter, FILE *fp,
|
||||
int flag);
|
||||
|
||||
/* A pseudo file type for El-Torito bootsectors as in man 2 stat :
|
||||
For now take the highest possible value.
|
||||
@ -487,5 +518,21 @@ int Xorriso_drive_snooze(struct XorrisO *xorriso, int flag);
|
||||
#define Xorriso_IFBOOT S_IFMT
|
||||
|
||||
|
||||
int Exprtest_match(struct XorrisO *xorriso, struct ExprtesT *ftest,
|
||||
void *node_pt, char *name, char *path,
|
||||
struct stat *boss_stbuf, struct stat *stbuf, int flag);
|
||||
|
||||
|
||||
int Xorriso_toc_to_string(struct XorrisO *xorriso, char **toc_text, int flag);
|
||||
|
||||
|
||||
int Xorriso_reaquire_outdev(struct XorrisO *xorriso, int flag);
|
||||
|
||||
int Xorriso_set_system_area_path(struct XorrisO *xorriso, char *path,
|
||||
int flag);
|
||||
|
||||
int Xorriso_set_hidden(struct XorrisO *xorriso, void *in_node, char *path,
|
||||
int hide_state, int flag);
|
||||
|
||||
#endif /* Xorrisoburn_includeD */
|
||||
|
||||
|
Reference in New Issue
Block a user