Add --with-versioned-libs for libcdio_paranioa and libcdio_cdda Remove
use of "new" even in private C parts. Changes and patch from Nicholas Boullis.
This commit is contained in:
8
NEWS
8
NEWS
@@ -1,8 +1,8 @@
|
|||||||
$Id: NEWS,v 1.81 2005/09/18 21:14:46 rocky Exp $
|
$Id: NEWS,v 1.82 2005/09/20 00:42:14 rocky Exp $
|
||||||
|
|
||||||
version 0.76
|
version 0.76
|
||||||
=====================================
|
=====================================
|
||||||
2005-??-??
|
2005-09-19
|
||||||
|
|
||||||
- Better compatibility with C++
|
- Better compatibility with C++
|
||||||
|
|
||||||
@@ -10,7 +10,7 @@ version 0.76
|
|||||||
|
|
||||||
- Fix bug in not specifying a device name in libcio_cdda
|
- Fix bug in not specifying a device name in libcio_cdda
|
||||||
|
|
||||||
- Add IS_ISSOCK() or S_ISLNK() macros for Rock-Ridge when environment
|
- Add S_ISSOCK() or S_ISLNK() macros for Rock-Ridge when environment
|
||||||
doesn't have it, e.g. MSYS 1.0.10 with MinGW 3.4.2.
|
doesn't have it, e.g. MSYS 1.0.10 with MinGW 3.4.2.
|
||||||
|
|
||||||
- Allow building cd-paranoia if Perl is not installed.
|
- Allow building cd-paranoia if Perl is not installed.
|
||||||
@@ -282,4 +282,4 @@ version 0.1
|
|||||||
|
|
||||||
Routines split off from VCDImager.
|
Routines split off from VCDImager.
|
||||||
|
|
||||||
$Id: NEWS,v 1.81 2005/09/18 21:14:46 rocky Exp $
|
$Id: NEWS,v 1.82 2005/09/20 00:42:14 rocky Exp $
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
.libs
|
.libs
|
||||||
Makefile
|
Makefile
|
||||||
Makefile.in
|
Makefile.in
|
||||||
|
audio
|
||||||
cdtext
|
cdtext
|
||||||
copying
|
copying
|
||||||
device
|
device
|
||||||
|
|||||||
@@ -9,3 +9,6 @@ iso2
|
|||||||
iso3
|
iso3
|
||||||
mmc1
|
mmc1
|
||||||
mmc2
|
mmc2
|
||||||
|
paranoia
|
||||||
|
paranoia2
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# $Id: Makefile.am,v 1.5 2005/09/17 20:57:19 rocky Exp $
|
# $Id: Makefile.am,v 1.6 2005/09/20 00:42:14 rocky Exp $
|
||||||
#
|
#
|
||||||
# Copyright (C) 2004, 2005 Rocky Bernstein <rocky@panix.com>
|
# Copyright (C) 2004, 2005 Rocky Bernstein <rocky@panix.com>
|
||||||
#
|
#
|
||||||
@@ -58,8 +58,6 @@ lib_LTLIBRARIES = libcdio_cdda.la
|
|||||||
libcdio_cdda_la_SOURCES = $(libcdio_cdda_sources)
|
libcdio_cdda_la_SOURCES = $(libcdio_cdda_sources)
|
||||||
libcdio_cdda_la_ldflags = -version-info $(libcdio_cdda_la_CURRENT):$(libcdio_cdda_la_REVISION):$(libcdio_cdda_la_AGE)
|
libcdio_cdda_la_ldflags = -version-info $(libcdio_cdda_la_CURRENT):$(libcdio_cdda_la_REVISION):$(libcdio_cdda_la_AGE)
|
||||||
|
|
||||||
libcdio_cdda_la_LDFLAGS = $(libcdio_cdda_la_ldflags)
|
|
||||||
|
|
||||||
INCLUDES = $(LIBCDIO_CFLAGS)
|
INCLUDES = $(LIBCDIO_CFLAGS)
|
||||||
|
|
||||||
FLAGS=@LIBCDIO_CFLAGS@ @UCDROM_H@ @TYPESIZES@ @CFLAGS@
|
FLAGS=@LIBCDIO_CFLAGS@ @UCDROM_H@ @TYPESIZES@ @CFLAGS@
|
||||||
@@ -73,3 +71,79 @@ DEBUG=$(FLAGS) -DCDDA_TEST
|
|||||||
## $(LD) $(DEBUG) test_interface.o $(LDFLAGS) -o cdda_test $(LIBS) libcdio_cdda.a
|
## $(LD) $(DEBUG) test_interface.o $(LDFLAGS) -o cdda_test $(LIBS) libcdio_cdda.a
|
||||||
|
|
||||||
LIBS = $(LIBCDIO_LIBS)
|
LIBS = $(LIBCDIO_LIBS)
|
||||||
|
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
# Things to version the symbols in the libraries
|
||||||
|
########################################################
|
||||||
|
|
||||||
|
# An explanation of the versioning problem from Nicolas Boullis and
|
||||||
|
# the versioned symbol solution he uses below...
|
||||||
|
#
|
||||||
|
# Currently, libvcdinfo uses the cdio_open function from libcdio.
|
||||||
|
# Let's imagine a program foobar that uses both the vcdinfo_open
|
||||||
|
# function from libvcdinfo and the cdio_open function from libcdio.
|
||||||
|
|
||||||
|
# Currently, libcdio has SONAME libcdio.so.0, libvcdinfo has SONAME
|
||||||
|
# libvcdinfo.so.0 and requires libcdio.so.0, and foobar requires both
|
||||||
|
# libvcdinfo.so.0 and libcdio.so.0. Everything looks fine.
|
||||||
|
#
|
||||||
|
# Now, for some reason, you decide to change the cdio_open function.
|
||||||
|
# That's your right, but you have to bump the CURRENT version and (if I
|
||||||
|
# understand it correctly, athough this is not that clear in libtool's
|
||||||
|
# documentation) set the AGE to 0. Anyway, this bumps the SONAME, which is
|
||||||
|
# sane since the interface changes incompatibly.
|
||||||
|
|
||||||
|
# Now, you have a new libcdio with SONAME libcdio.so.1. But libvcdinfo and
|
||||||
|
# foobar still require libcdio.so.0. Everything is still fine.
|
||||||
|
|
||||||
|
# Now, after some minor changes, the author of foobar recompiles foobar.
|
||||||
|
# Then, foobar now requires libvcdinfo.so.0 and libcdio.so.1. And foobar
|
||||||
|
# now segfaults...
|
||||||
|
|
||||||
|
# What is happening? When you run foobar, if brings both libvcdinfo.so.0
|
||||||
|
# and libcdio.so.1, but libvcdinfo.so.0 also brings libcdio.so.0. So you
|
||||||
|
# have both libcdio.so.0 and libcdio.so.1 that bring their symbols to the
|
||||||
|
# global namespace. Hence, you have to incompatible versions of the
|
||||||
|
# cdio_open function in the name space. When foobar calls cdio_open, it
|
||||||
|
# may choose the wrong function, and segfaults...
|
||||||
|
|
||||||
|
# With versioned symbols, the cdio_open function from libcdio.so.0 may be
|
||||||
|
# known as (something that looks like) cdio_open@@CDIO_0. An the cdio_open
|
||||||
|
# function from libcdio.so.1 as cdio_open@@CDIO_1. Both versions of
|
||||||
|
# libcdio would still be brought in by the most recent foobar, but foobar
|
||||||
|
# (and libvcdinfo) know which versioned function to use and then use the
|
||||||
|
# good one.
|
||||||
|
|
||||||
|
|
||||||
|
# This is some simple versioning where every symbol is versioned with
|
||||||
|
# something that looks like the SONAME of the library. More complex (and
|
||||||
|
# better) versioning is possible; it is for example what is used by glibc.
|
||||||
|
# But good complex versioning is something that requires much more
|
||||||
|
# work...
|
||||||
|
|
||||||
|
|
||||||
|
# The below is a impliments symbol versioning. First of all, I
|
||||||
|
# compute MAJOR as CURENT - AGE; that is what is used within libtool
|
||||||
|
# (at least on GNU/Linux systems) for the number in the SONAME. The
|
||||||
|
# nm command gives the list of symbols known in each of the object
|
||||||
|
# files that will be part of the shared library. And the sed command
|
||||||
|
# extracts from this list those symbols that will be shared. (This sed
|
||||||
|
# command comes from libtool.)
|
||||||
|
|
||||||
|
libcdio_cdda_la_MAJOR := $(shell expr $(libcdio_cdda_la_CURRENT) - $(libcdio_cdda_la_AGE))
|
||||||
|
if BUILD_VERSIONED_LIBS
|
||||||
|
libcdio_cdda_la_LDFLAGS = $(libcdio_cdda_la_ldflags) -Wl,--version-script=libcdio_cdda.la.ver
|
||||||
|
libcdio_cdda_la_DEPENDENCIES = libcdio_cdda.la.ver
|
||||||
|
|
||||||
|
libcdio_cdda.la.ver: $(libcdio_cdda_la_OBJECTS) $(srcdir)/libcdio_cdda.sym
|
||||||
|
echo 'CDIO_CDDA_$(libcdio_cdda_la_MAJOR) { ' > $@
|
||||||
|
objs=`for obj in $(libcdio_cdda_la_OBJECTS); do sed -ne "s/^pic_object='\(.*\)'$$/\1/p" $$obj; done`; \
|
||||||
|
nm $${objs} | sed -n -e 's/^.*[ ][ABCDGIRSTW][ABCDGIRSTW]*[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$$/\1/p' | sort -u | { first=true; while read symbol; do if grep -q "^$${symbol}\$$" $(srcdir)/libcdio_cdda.sym; then if test $$first = true; then echo " global:"; first=false; fi; echo " $${symbol};"; fi; done; } >> $@; \
|
||||||
|
nm $${objs} | sed -n -e 's/^.*[ ][ABCDGIRSTW][ABCDGIRSTW]*[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$$/\1/p' | sort -u | { first=true; while read symbol; do if grep -q "^$${symbol}\$$" $(srcdir)/libcdio_cdda.sym; then :; else if test $$first = true; then echo " local:"; first=false; fi; echo " $${symbol};"; fi; done; } >> $@
|
||||||
|
echo '};' >> $@
|
||||||
|
else
|
||||||
|
libcdio_cdda_la_LDFLAGS = $(libcdio_cdda_la_ldflags)
|
||||||
|
endif
|
||||||
|
|
||||||
|
MOSTLYCLEANFILES = libcdio_cdda.la.ver
|
||||||
|
|||||||
22
lib/cdda_interface/libcdio_cdda.sym
Normal file
22
lib/cdda_interface/libcdio_cdda.sym
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
cdio_cddap_find_a_cdrom
|
||||||
|
cdio_cddap_identify
|
||||||
|
cdio_cddap_identify_cdio
|
||||||
|
cdio_cddap_speed_set
|
||||||
|
cdio_cddap_verbose_set
|
||||||
|
cdio_cddap_messages
|
||||||
|
cdio_cddap_errors
|
||||||
|
cdio_cddap_close_no_free_cdio
|
||||||
|
cdio_cddap_close
|
||||||
|
cdio_cddap_open
|
||||||
|
cdio_cddap_read
|
||||||
|
cdio_cddap_track_firstsector
|
||||||
|
cdio_cddap_track_lastsector
|
||||||
|
cdio_cddap_tracks
|
||||||
|
cdio_cddap_sector_gettrack
|
||||||
|
cdio_cddap_track_channels
|
||||||
|
cdio_cddap_track_audiop
|
||||||
|
cdio_cddap_track_copyp
|
||||||
|
cdio_cddap_track_preemp
|
||||||
|
cdio_cddap_disc_firstsector
|
||||||
|
cdio_cddap_disc_lastsector
|
||||||
|
data_bigendianp
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# $Id: Makefile.am,v 1.8 2005/09/17 20:57:19 rocky Exp $
|
# $Id: Makefile.am,v 1.9 2005/09/20 00:42:14 rocky Exp $
|
||||||
#
|
#
|
||||||
# Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com>
|
# Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com>
|
||||||
#
|
#
|
||||||
@@ -136,8 +136,9 @@ libiso9660_la_DEPENDENCIES = $(libcdio9660_la_dependencies) libiso9660.la.ver
|
|||||||
|
|
||||||
libiso9660.la.ver: $(libiso9660_la_OBJECTS) $(srcdir)/libiso9660.sym
|
libiso9660.la.ver: $(libiso9660_la_OBJECTS) $(srcdir)/libiso9660.sym
|
||||||
echo 'ISO9660_$(libiso9660_la_MAJOR) {' > $@
|
echo 'ISO9660_$(libiso9660_la_MAJOR) {' > $@
|
||||||
nm $(patsubst %.lo,%.o,$(libiso9660_la_OBJECTS)) | sed -n -e 's/^.*[ ][ABCDGIRSTW][ABCDGIRSTW]*[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$$/\1/p' | sort -u | { first=true; while read symbol; do if grep -q "^$${symbol}\$$" $(srcdir)/libiso9660.sym; then if test $$first = true; then echo " global:"; first=false; fi; echo " $${symbol};"; fi; done; } >> $@
|
objs=`for obj in $(libiso9660_la_OBJECTS); do sed -ne "s/^pic_object='\(.*\)'$$/\1/p" $$obj; done`; \
|
||||||
nm $(patsubst %.lo,%.o,$(libiso9660_la_OBJECTS)) | sed -n -e 's/^.*[ ][ABCDGIRSTW][ABCDGIRSTW]*[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$$/\1/p' | sort -u | { first=true; while read symbol; do if grep -q "^$${symbol}\$$" $(srcdir)/libiso9660.sym; then :; else if test $$first = true; then echo " local:"; first=false; fi; echo " $${symbol};"; fi; done; } >> $@
|
nm $${objs} | sed -n -e 's/^.*[ ][ABCDGIRSTW][ABCDGIRSTW]*[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$$/\1/p' | sort -u | { first=true; while read symbol; do if grep -q "^$${symbol}\$$" $(srcdir)/libiso9660.sym; then if test $$first = true; then echo " global:"; first=false; fi; echo " $${symbol};"; fi; done; } >> $@; \
|
||||||
|
nm $${objs} | sed -n -e 's/^.*[ ][ABCDGIRSTW][ABCDGIRSTW]*[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$$/\1/p' | sort -u | { first=true; while read symbol; do if grep -q "^$${symbol}\$$" $(srcdir)/libiso9660.sym; then :; else if test $$first = true; then echo " local:"; first=false; fi; echo " $${symbol};"; fi; done; } >> $@
|
||||||
echo '};' >> $@
|
echo '};' >> $@
|
||||||
|
|
||||||
MOSTLYCLEANFILES = libiso9660.la.ver
|
MOSTLYCLEANFILES = libiso9660.la.ver
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
$Id: iso9660.c,v 1.13 2005/03/03 10:32:01 rocky Exp $
|
$Id: iso9660.c,v 1.14 2005/09/20 00:42:14 rocky Exp $
|
||||||
|
|
||||||
Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org>
|
Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org>
|
||||||
Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com>
|
Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com>
|
||||||
@@ -48,7 +48,7 @@ const char ISO_STANDARD_ID[] = {'C', 'D', '0', '0', '1'};
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const char _rcsid[] = "$Id: iso9660.c,v 1.13 2005/03/03 10:32:01 rocky Exp $";
|
static const char _rcsid[] = "$Id: iso9660.c,v 1.14 2005/09/20 00:42:14 rocky Exp $";
|
||||||
|
|
||||||
/* Variables to hold debugger-helping enumerations */
|
/* Variables to hold debugger-helping enumerations */
|
||||||
enum iso_enum1_s iso_enums1;
|
enum iso_enum1_s iso_enums1;
|
||||||
@@ -301,14 +301,15 @@ iso9660_name_translate(const char *psz_old, char *psz_new)
|
|||||||
The length of the translated string is returned.
|
The length of the translated string is returned.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
iso9660_name_translate_ext(const char *old, char *new, uint8_t i_joliet_level)
|
iso9660_name_translate_ext(const char *psz_oldname, char *psz_newname,
|
||||||
|
uint8_t i_joliet_level)
|
||||||
{
|
{
|
||||||
int len = strlen(old);
|
int len = strlen(psz_oldname);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (0 == len) return 0;
|
if (0 == len) return 0;
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
unsigned char c = old[i];
|
unsigned char c = psz_oldname[i];
|
||||||
if (!c)
|
if (!c)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -316,20 +317,21 @@ iso9660_name_translate_ext(const char *old, char *new, uint8_t i_joliet_level)
|
|||||||
if (!i_joliet_level && isupper(c)) c = tolower(c);
|
if (!i_joliet_level && isupper(c)) c = tolower(c);
|
||||||
|
|
||||||
/* Drop trailing '.;1' (ISO 9660:1988 7.5.1 requires period) */
|
/* Drop trailing '.;1' (ISO 9660:1988 7.5.1 requires period) */
|
||||||
if (c == '.' && i == len - 3 && old[i + 1] == ';' && old[i + 2] == '1')
|
if (c == '.' && i == len - 3
|
||||||
|
&& psz_oldname[i + 1] == ';' && psz_oldname[i + 2] == '1')
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Drop trailing ';1' */
|
/* Drop trailing ';1' */
|
||||||
if (c == ';' && i == len - 2 && old[i + 1] == '1')
|
if (c == ';' && i == len - 2 && psz_oldname[i + 1] == '1')
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Convert remaining ';' to '.' */
|
/* Convert remaining ';' to '.' */
|
||||||
if (c == ';')
|
if (c == ';')
|
||||||
c = '.';
|
c = '.';
|
||||||
|
|
||||||
new[i] = c;
|
psz_newname[i] = c;
|
||||||
}
|
}
|
||||||
new[i] = '\0';
|
psz_newname[i] = '\0';
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -453,7 +455,8 @@ iso9660_set_evd(void *pd)
|
|||||||
memset(&ied, 0, sizeof(ied));
|
memset(&ied, 0, sizeof(ied));
|
||||||
|
|
||||||
ied.type = to_711(ISO_VD_END);
|
ied.type = to_711(ISO_VD_END);
|
||||||
iso9660_strncpy_pad (ied.id, ISO_STANDARD_ID, sizeof(ied.id), ISO9660_DCHARS);
|
iso9660_strncpy_pad (ied.id, ISO_STANDARD_ID, sizeof(ied.id),
|
||||||
|
ISO9660_DCHARS);
|
||||||
ied.version = to_711(ISO_VERSION);
|
ied.version = to_711(ISO_VERSION);
|
||||||
|
|
||||||
memcpy(pd, &ied, sizeof(ied));
|
memcpy(pd, &ied, sizeof(ied));
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# $Id: Makefile.am,v 1.1 2004/12/18 17:29:32 rocky Exp $
|
# $Id: Makefile.am,v 1.2 2005/09/20 00:42:14 rocky Exp $
|
||||||
#
|
#
|
||||||
# Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
|
# Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
|
||||||
#
|
#
|
||||||
@@ -43,8 +43,10 @@
|
|||||||
# public release, then set AGE to 0. A changed interface means an
|
# public release, then set AGE to 0. A changed interface means an
|
||||||
# incompatibility with previous versions.
|
# incompatibility with previous versions.
|
||||||
|
|
||||||
|
EXTRA_DIST = libcdio_cdda.sym
|
||||||
|
|
||||||
libcdio_paranoia_la_CURRENT := 0
|
libcdio_paranoia_la_CURRENT := 0
|
||||||
libcdio_paranoia_la_REVISION := 0
|
libcdio_paranoia_la_REVISION := 1
|
||||||
libcdio_paranoia_la_AGE := 0
|
libcdio_paranoia_la_AGE := 0
|
||||||
|
|
||||||
noinst_HEADERS = gap.h isort.h overlap.h p_block.h
|
noinst_HEADERS = gap.h isort.h overlap.h p_block.h
|
||||||
@@ -57,8 +59,6 @@ lib_LTLIBRARIES = libcdio_paranoia.la
|
|||||||
libcdio_paranoia_la_SOURCES = $(libcdio_paranoia_sources)
|
libcdio_paranoia_la_SOURCES = $(libcdio_paranoia_sources)
|
||||||
libcdio_paranoia_la_ldflags = -version-info $(libcdio_paranoia_la_CURRENT):$(libcdio_paranoia_la_REVISION):$(libcdio_paranoia_la_AGE)
|
libcdio_paranoia_la_ldflags = -version-info $(libcdio_paranoia_la_CURRENT):$(libcdio_paranoia_la_REVISION):$(libcdio_paranoia_la_AGE)
|
||||||
|
|
||||||
libcdio_paranoia_la_LDFLAGS = $(libcdio_paranoia_la_ldflags)
|
|
||||||
|
|
||||||
INCLUDES = $(LIBCDIO_CFLAGS)
|
INCLUDES = $(LIBCDIO_CFLAGS)
|
||||||
|
|
||||||
FLAGS=@LIBCDIO_CFLAGS@ @TYPESIZES@ @CFLAGS@ -I.. -I../..
|
FLAGS=@LIBCDIO_CFLAGS@ @TYPESIZES@ @CFLAGS@ -I.. -I../..
|
||||||
@@ -75,3 +75,79 @@ DEBUG=$(FLAGS)
|
|||||||
## $(MAKE) libcdio_paranoia.a CFLAGS="$(DEBUG)"
|
## $(MAKE) libcdio_paranoia.a CFLAGS="$(DEBUG)"
|
||||||
|
|
||||||
LIBS = $(LIBCDIO_LIBS) $(LIBCDIO_CDDA_LIBS)
|
LIBS = $(LIBCDIO_LIBS) $(LIBCDIO_CDDA_LIBS)
|
||||||
|
|
||||||
|
|
||||||
|
########################################################
|
||||||
|
# Things to version the symbols in the libraries
|
||||||
|
########################################################
|
||||||
|
|
||||||
|
# An explanation of the versioning problem from Nicolas Boullis and
|
||||||
|
# the versioned symbol solution he uses below...
|
||||||
|
#
|
||||||
|
# Currently, libvcdinfo uses the cdio_open function from libcdio.
|
||||||
|
# Let's imagine a program foobar that uses both the vcdinfo_open
|
||||||
|
# function from libvcdinfo and the cdio_open function from libcdio.
|
||||||
|
|
||||||
|
# Currently, libcdio has SONAME libcdio.so.0, libvcdinfo has SONAME
|
||||||
|
# libvcdinfo.so.0 and requires libcdio.so.0, and foobar requires both
|
||||||
|
# libvcdinfo.so.0 and libcdio.so.0. Everything looks fine.
|
||||||
|
#
|
||||||
|
# Now, for some reason, you decide to change the cdio_open function.
|
||||||
|
# That's your right, but you have to bump the CURRENT version and (if I
|
||||||
|
# understand it correctly, athough this is not that clear in libtool's
|
||||||
|
# documentation) set the AGE to 0. Anyway, this bumps the SONAME, which is
|
||||||
|
# sane since the interface changes incompatibly.
|
||||||
|
|
||||||
|
# Now, you have a new libcdio with SONAME libcdio.so.1. But libvcdinfo and
|
||||||
|
# foobar still require libcdio.so.0. Everything is still fine.
|
||||||
|
|
||||||
|
# Now, after some minor changes, the author of foobar recompiles foobar.
|
||||||
|
# Then, foobar now requires libvcdinfo.so.0 and libcdio.so.1. And foobar
|
||||||
|
# now segfaults...
|
||||||
|
|
||||||
|
# What is happening? When you run foobar, if brings both libvcdinfo.so.0
|
||||||
|
# and libcdio.so.1, but libvcdinfo.so.0 also brings libcdio.so.0. So you
|
||||||
|
# have both libcdio.so.0 and libcdio.so.1 that bring their symbols to the
|
||||||
|
# global namespace. Hence, you have to incompatible versions of the
|
||||||
|
# cdio_open function in the name space. When foobar calls cdio_open, it
|
||||||
|
# may choose the wrong function, and segfaults...
|
||||||
|
|
||||||
|
# With versioned symbols, the cdio_open function from libcdio.so.0 may be
|
||||||
|
# known as (something that looks like) cdio_open@@CDIO_0. An the cdio_open
|
||||||
|
# function from libcdio.so.1 as cdio_open@@CDIO_1. Both versions of
|
||||||
|
# libcdio would still be brought in by the most recent foobar, but foobar
|
||||||
|
# (and libvcdinfo) know which versioned function to use and then use the
|
||||||
|
# good one.
|
||||||
|
|
||||||
|
|
||||||
|
# This is some simple versioning where every symbol is versioned with
|
||||||
|
# something that looks like the SONAME of the library. More complex (and
|
||||||
|
# better) versioning is possible; it is for example what is used by glibc.
|
||||||
|
# But good complex versioning is something that requires much more
|
||||||
|
# work...
|
||||||
|
|
||||||
|
|
||||||
|
# The below is a impliments symbol versioning. First of all, I
|
||||||
|
# compute MAJOR as CURENT - AGE; that is what is used within libtool
|
||||||
|
# (at least on GNU/Linux systems) for the number in the SONAME. The
|
||||||
|
# nm command gives the list of symbols known in each of the object
|
||||||
|
# files that will be part of the shared library. And the sed command
|
||||||
|
# extracts from this list those symbols that will be shared. (This sed
|
||||||
|
# command comes from libtool.)
|
||||||
|
|
||||||
|
libcdio_paranoia_la_MAJOR := $(shell expr $(libcdio_paranoia_la_CURRENT) - $(libcdio_paranoia_la_AGE))
|
||||||
|
if BUILD_VERSIONED_LIBS
|
||||||
|
libcdio_paranoia_la_LDFLAGS = $(libcdio_paranoia_la_ldflags) -Wl,--version-script=libcdio_paranoia.la.ver
|
||||||
|
libcdio_paranoia_la_DEPENDENCIES = libcdio_paranoia.la.ver
|
||||||
|
|
||||||
|
libcdio_paranoia.la.ver: $(libcdio_paranoia_la_OBJECTS) $(srcdir)/libcdio_paranoia.sym
|
||||||
|
echo 'CDIO_CDDA_$(libcdio_paranoia_la_MAJOR) { ' > $@
|
||||||
|
objs=`for obj in $(libcdio_paranoia_la_OBJECTS); do sed -ne "s/^pic_object='\(.*\)'$$/\1/p" $$obj; done`; \
|
||||||
|
nm $${objs} | sed -n -e 's/^.*[ ][ABCDGIRSTW][ABCDGIRSTW]*[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$$/\1/p' | sort -u | { first=true; while read symbol; do if grep -q "^$${symbol}\$$" $(srcdir)/libcdio_paranoia.sym; then if test $$first = true; then echo " global:"; first=false; fi; echo " $${symbol};"; fi; done; } >> $@; \
|
||||||
|
nm $${objs} | sed -n -e 's/^.*[ ][ABCDGIRSTW][ABCDGIRSTW]*[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$$/\1/p' | sort -u | { first=true; while read symbol; do if grep -q "^$${symbol}\$$" $(srcdir)/libcdio_paranoia.sym; then :; else if test $$first = true; then echo " local:"; first=false; fi; echo " $${symbol};"; fi; done; } >> $@
|
||||||
|
echo '};' >> $@
|
||||||
|
else
|
||||||
|
libcdio_paranoia_la_LDFLAGS = $(libcdio_paranoia_la_ldflags)
|
||||||
|
endif
|
||||||
|
|
||||||
|
MOSTLYCLEANFILES = libcdio_paranoia.la.ver
|
||||||
|
|||||||
9
lib/paranoia/libcdio_paranoia.sym
Normal file
9
lib/paranoia/libcdio_paranoia.sym
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
cdio_paranoia_init
|
||||||
|
cdio_paranoia_free
|
||||||
|
cdio_paranoia_modeset
|
||||||
|
cdio_paranoia_seek
|
||||||
|
cdio_paranoia_read
|
||||||
|
cdio_paranoia_read_limited
|
||||||
|
cdio_paranoia_overlapset
|
||||||
|
cdio_paranoia_set_range
|
||||||
|
paranoia_cb_mode2str
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
$Id: p_block.c,v 1.7 2005/02/06 15:09:10 rocky Exp $
|
$Id: p_block.c,v 1.8 2005/09/20 00:42:14 rocky Exp $
|
||||||
|
|
||||||
Copyright (C) 2004, 2005 Rocky Bernstein <rocky@panix.com>
|
Copyright (C) 2004, 2005 Rocky Bernstein <rocky@panix.com>
|
||||||
Copyright (C) 1998 Monty xiphmont@mit.edu
|
Copyright (C) 1998 Monty xiphmont@mit.edu
|
||||||
@@ -35,15 +35,15 @@
|
|||||||
#include <cdio/cdda.h>
|
#include <cdio/cdda.h>
|
||||||
#include <cdio/paranoia.h>
|
#include <cdio/paranoia.h>
|
||||||
|
|
||||||
linked_list *new_list(void *(*newp)(void),void (*freep)(void *))
|
linked_list_t *new_list(void *(*newp)(void),void (*freep)(void *))
|
||||||
{
|
{
|
||||||
linked_list *ret=calloc(1,sizeof(linked_list));
|
linked_list_t *ret=calloc(1,sizeof(linked_list_t));
|
||||||
ret->new_poly=newp;
|
ret->new_poly=newp;
|
||||||
ret->free_poly=freep;
|
ret->free_poly=freep;
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
linked_element *add_elem(linked_list *l,void *elem)
|
linked_element *add_elem(linked_list_t *l,void *elem)
|
||||||
{
|
{
|
||||||
|
|
||||||
linked_element *ret=calloc(1,sizeof(linked_element));
|
linked_element *ret=calloc(1,sizeof(linked_element));
|
||||||
@@ -64,16 +64,16 @@ linked_element *add_elem(linked_list *l,void *elem)
|
|||||||
}
|
}
|
||||||
|
|
||||||
linked_element *
|
linked_element *
|
||||||
new_elem(linked_list *list)
|
new_elem(linked_list_t *p_list)
|
||||||
{
|
{
|
||||||
void *new=list->new_poly();
|
void *p_new=p_list->new_poly();
|
||||||
return(add_elem(list,new));
|
return(add_elem(p_list,p_new));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
free_elem(linked_element *e,int free_ptr)
|
free_elem(linked_element *e,int free_ptr)
|
||||||
{
|
{
|
||||||
linked_list *l=e->list;
|
linked_list_t *l=e->list;
|
||||||
if(free_ptr)l->free_poly(e->ptr);
|
if(free_ptr)l->free_poly(e->ptr);
|
||||||
|
|
||||||
if(e==l->head)
|
if(e==l->head)
|
||||||
@@ -91,7 +91,7 @@ free_elem(linked_element *e,int free_ptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
free_list(linked_list *list,int free_ptr)
|
free_list(linked_list_t *list,int free_ptr)
|
||||||
{
|
{
|
||||||
while(list->head)
|
while(list->head)
|
||||||
free_elem(list->head,free_ptr);
|
free_elem(list->head,free_ptr);
|
||||||
@@ -103,9 +103,9 @@ void *get_elem(linked_element *e)
|
|||||||
return(e->ptr);
|
return(e->ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
linked_list *copy_list(linked_list *list)
|
linked_list_t *copy_list(linked_list_t *list)
|
||||||
{
|
{
|
||||||
linked_list *new=new_list(list->new_poly,list->free_poly);
|
linked_list_t *new=new_list(list->new_poly,list->free_poly);
|
||||||
linked_element *i=list->tail;
|
linked_element *i=list->tail;
|
||||||
|
|
||||||
while(i){
|
while(i){
|
||||||
@@ -264,7 +264,7 @@ v_prev(v_fragment_t *v)
|
|||||||
void
|
void
|
||||||
recover_cache(cdrom_paranoia_t *p)
|
recover_cache(cdrom_paranoia_t *p)
|
||||||
{
|
{
|
||||||
linked_list *l=p->cache;
|
linked_list_t *l=p->cache;
|
||||||
|
|
||||||
/* Are we at/over our allowed cache size? */
|
/* Are we at/over our allowed cache size? */
|
||||||
while(l->active>p->cache_limit)
|
while(l->active>p->cache_limit)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
$Id: p_block.h,v 1.4 2005/02/06 15:09:10 rocky Exp $
|
$Id: p_block.h,v 1.5 2005/09/20 00:42:14 rocky Exp $
|
||||||
|
|
||||||
Copyright (C) 2004, 2005 Rocky Bernstein <rocky@panix.com>
|
Copyright (C) 2004, 2005 Rocky Bernstein <rocky@panix.com>
|
||||||
Copyright (C) by Monty (xiphmont@mit.edu)
|
Copyright (C) by Monty (xiphmont@mit.edu)
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
|
|
||||||
#include "isort.h"
|
#include "isort.h"
|
||||||
|
|
||||||
typedef struct linked_list{
|
typedef struct {
|
||||||
/* linked list */
|
/* linked list */
|
||||||
struct linked_element *head;
|
struct linked_element *head;
|
||||||
struct linked_element *tail;
|
struct linked_element *tail;
|
||||||
@@ -49,25 +49,26 @@ typedef struct linked_list{
|
|||||||
long current;
|
long current;
|
||||||
long active;
|
long active;
|
||||||
|
|
||||||
} linked_list;
|
} linked_list_t;
|
||||||
|
|
||||||
typedef struct linked_element{
|
typedef struct linked_element{
|
||||||
void *ptr;
|
void *ptr;
|
||||||
struct linked_element *prev;
|
struct linked_element *prev;
|
||||||
struct linked_element *next;
|
struct linked_element *next;
|
||||||
|
|
||||||
struct linked_list *list;
|
linked_list_t *list;
|
||||||
int stamp;
|
int stamp;
|
||||||
} linked_element;
|
} linked_element;
|
||||||
|
|
||||||
extern linked_list *new_list(void *(*new)(void),void (*free)(void *));
|
extern linked_list_t *new_list(void *(*new_fn)(void),void (*free)(void *));
|
||||||
extern linked_element *new_elem(linked_list *list);
|
extern linked_element *new_elem(linked_list_t *list);
|
||||||
extern linked_element *add_elem(linked_list *list,void *elem);
|
extern linked_element *add_elem(linked_list_t *list,void *elem);
|
||||||
extern void free_list(linked_list *list,int free_ptr); /* unlink or free */
|
extern void free_list(linked_list_t *list,int free_ptr); /* unlink or free */
|
||||||
extern void free_elem(linked_element *e,int free_ptr); /* unlink or free */
|
extern void free_elem(linked_element *e,int free_ptr); /* unlink or free */
|
||||||
extern void *get_elem(linked_element *e);
|
extern void *get_elem(linked_element *e);
|
||||||
extern linked_list *copy_list(linked_list *list); /* shallow; doesn't copy
|
|
||||||
contained structures */
|
/* This is a shallow copy; it doesn't copy contained structures */
|
||||||
|
extern linked_list_t *copy_list(linked_list_t *p_list);
|
||||||
|
|
||||||
typedef struct c_block {
|
typedef struct c_block {
|
||||||
/* The buffer */
|
/* The buffer */
|
||||||
@@ -153,13 +154,13 @@ typedef struct offsets{
|
|||||||
struct cdrom_paranoia_s {
|
struct cdrom_paranoia_s {
|
||||||
cdrom_drive_t *d;
|
cdrom_drive_t *d;
|
||||||
|
|
||||||
root_block root; /* verified/reconstructed cached data */
|
root_block root; /* verified/reconstructed cached data */
|
||||||
linked_list *cache; /* our data as read from the cdrom */
|
linked_list_t *cache; /* our data as read from the cdrom */
|
||||||
long int cache_limit;
|
long int cache_limit;
|
||||||
linked_list *fragments; /* fragments of blocks that have been 'verified' */
|
linked_list_t *fragments; /* fragments of blocks that have been 'verified' */
|
||||||
sort_info_t *sortcache;
|
sort_info_t *sortcache;
|
||||||
|
|
||||||
int readahead; /* sectors of readahead in each readop */
|
int readahead; /* sectors of readahead in each readop */
|
||||||
int jitter;
|
int jitter;
|
||||||
long lastread;
|
long lastread;
|
||||||
|
|
||||||
@@ -203,6 +204,11 @@ extern void i_paranoia_firstlast(cdrom_paranoia_t *p);
|
|||||||
#define fs(f) (f->size)
|
#define fs(f) (f->size)
|
||||||
#define fv(f) (v_buffer(f))
|
#define fv(f) (v_buffer(f))
|
||||||
|
|
||||||
|
#ifndef DO_NOT_WANT_PARANOIA_COMPATIBILITY
|
||||||
|
/** For compatibility with good ol' paranoia */
|
||||||
|
#define linked_list linked_list_t
|
||||||
|
#endif /*DO_NOT_WANT_PARANOIA_COMPATIBILITY*/
|
||||||
|
|
||||||
#define CDP_COMPILE
|
#define CDP_COMPILE
|
||||||
#endif /*_P_BLOCK_H_*/
|
#endif /*_P_BLOCK_H_*/
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user